亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? scrolltext.pas

?? ScrollText_V1.0-自動字幕控件
?? PAS
字號:
{******************************************************************************
*              自動字幕控件 - TScrollText                                     *
*                                                                             *
*      功能: 在指定位置顯示滾動字幕                                          *
*      版本: V1.03                                                           *
*      作者: 顧中軍                                                          *
*      用法:                                                                 *
*        1、Active:        用于設置控件是否處于活動狀態                       *
*        2、Interval:      用于設置字幕滾動周期(毫秒)                       *
*        3、ScrollText:    用于設置滾動字幕                                   *
*        4、Step:          用于設置每次滾動像素點數                           *
*        5、ScrollDirect:  用于指示滾動方向                                   *
*        6、其它屬性及事件句柄的使用同TLabel控件                              *
*      實現:                                                                 *
*          2005.2.18 靈感忽來,很快實現了左右滾動功能                         *
*          2005.2.19 加上了上下滾動功能,并完善了代碼                         *
*          2005.2.20 加上滾動完一屏后觸發相關事件的功能                       *
*      說明:                                                                 *
*          兩年前,我曾用截斷字符串的方法做過一個滾動字幕控件,不過那東東只能 *
*      由右向左滾動,而且還有問題。                                           *
*          這次卻是在晚上靜坐時忽然來的靈感,在查看了TCustomLabel的源碼后,我 *
*      確定可以用簡單的方法實現滾動字幕,馬上動手一試,哈,還真可以!         *
*          這個版本的實現也有限制,主要是Alignment及Layout屬性在左右、上下滾  *
*      動時分別各有限制。實際上,要讓其沒有限制應該是可以實現的,不過,我以為 *
*      現在這樣的實現挺好,沒必要為了無限制而加上一大堆代碼!                 *
*          最后聲明一下,這個東東只有300余行代碼(包括注釋*.*),所以你愛怎么 *
*      用它或修改它,都完全沒問題啦。只是希望你如果作了改進,能給我發一份;此 *
*      外,如果你是在它的基礎上改進而來,至少得提一下來源噢。                 *
*          祝你愉快!!!                                                     *
*                                                                             *
*      Email:     iamdream@yeah.net                                           *
******************************************************************************}

unit ScrollText;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, ExtCtrls;

type
  TScrollDirect = (sdLeft, sdRight, sdUp, sdDown);
  TFrameScrolledEvent = procedure (Direct: TScrollDirect; CurPos: Integer;
       var Abort: Boolean) of object;

  TScrollText = class(TCustomLabel)
  private
    FActive:    boolean;       //處于滾動顯示狀態?
    FInterval:  integer;       //定時器間隔
    FLastPos:   integer;       //上一次滾動位置,滾動顯示信息用
    FStep:      Integer;       //每次滾動像素點數
    FTimer:     TTimer;        //定時器
    FText:      string;        //滾動顯示原始信息
    FTxtWidth:  integer;       //滾動顯示信息長
    FTxtHeight: Integer;       //滾動顯示信息高
    FDirect:    TScrollDirect; //滾動方向
    FFrameScrolledEvent: TFrameScrolledEvent;   //滾動完一屏后觸發的事件
    procedure ScrollTimer(Sender: TObject);
    procedure SetActive(Value: boolean);
    procedure SetInterval(Value: integer);
    procedure SetText(const Value: string);
    procedure SetStep(Value: Integer);
    procedure SetDirect(Value: TScrollDirect);
    procedure SetAlignment(Value: TAlignment);
    procedure SetLayout(Value: TTextLayout);
  protected
    procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
    function GetLabelText: string; override;
    procedure SetName(const Value: TComponentName); override;

    property AutoSize default false;
    property Caption;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Reset;
  published
    property Active :boolean read FActive write SetActive default true;
    property Align;
    property Alignment write SetAlignment default taLeftJustify;
    property Anchors;
    //property BiDiMode;
    property Color;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    //property FocusControl;
    property Font;
    property Interval: integer read FInterval write SetInterval default 200;
    property Layout write SetLayout default tlCenter;
    //property ParentBiDiMode;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    //property ShowAccelChar;
    property ShowHint;
    property ScrollDirection: TScrollDirect read FDirect write SetDirect
                 default sdLeft;
    property ScrollText: string read FText write SetText;
    property Step: Integer read FStep write SetStep default 5;
    property Transparent;
    property Visible;
    //property WordWrap;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    property OnFrameScrolled: TFrameScrolledEvent
        read FFrameScrolledEvent write FFrameScrolledEvent;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TScrollText]);
end;

constructor TScrollText.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  AutoSize  := false;
  WordWrap  := false;
  FActive   := true;
  FDirect   := sdLeft;
  FTimer    := TTimer.Create(Self);
  FTimer.OnTimer  := ScrollTimer;
  FTimer.Enabled  := FActive;
  FInterval       := 200;
  FTimer.Interval := FInterval;

  FLastPos := 0;
  FStep    := 5;
  Color    := clGreen;
  Font.Charset := GB2312_CHARSET;
  Font.Color   := clAqua;
  Font.Height  := -12;
  Font.Name    := '宋體';
  Width  := 200;
  Layout := tlCenter;
end;

destructor TScrollText.Destroy;
begin
  FTimer.Free;
  inherited Destroy;
end;

procedure TScrollText.ScrollTimer(Sender: TObject);
var
  bAbort: Boolean;
begin
  if FStep = 0 then Exit;
  Active         := False;
  FTimer.OnTimer := nil;
  bAbort         := False;
  case FDirect of
    sdLeft:            //由右向左滾動
      begin
        Dec(FLastPos, FStep);
        if (FLastPos < 0) and (Abs(FLastPos) > FTxtWidth) then
        begin
          if Assigned(FFrameScrolledEvent) then
            FFrameScrolledEvent(FDirect, FLastPos, bAbort);
          if not bAbort then
            FLastPos   := Self.ClientWidth - 1;
        end;
      end;
    sdRight:           //由左向右滾動
      begin
        Inc(FLastPos, FStep);
        if (FLastPos > 0) and (FLastPos > Self.ClientWidth) then
        begin
          if Assigned(FFrameScrolledEvent) then
            FFrameScrolledEvent(FDirect, FLastPos, bAbort);
          if not bAbort then
            FLastPos   := - FTxtWidth + 1;
        end;
      end;
    sdUp:              //由下向上滾動
      begin
        Dec(FLastPos, FStep);
        if (FLastPos < 0) and (Abs(FLastPos) > FTxtHeight) then
        begin
          if Assigned(FFrameScrolledEvent) then
            FFrameScrolledEvent(FDirect, FLastPos, bAbort);
          if not bAbort then
            FLastPos   := Self.ClientHeight - 1;
        end;
      end;
    sdDown:            //由上向下滾動
      begin
        Inc(FLastPos, FStep);
        if (FLastPos > 0) and (FLastPos > Self.ClientHeight) then
        begin
          if Assigned(FFrameScrolledEvent) then
            FFrameScrolledEvent(FDirect, FLastPos, bAbort);
          if not bAbort then
            FLastPos   := - FTxtHeight + 1;
        end;
      end;
  end;
  Self.Invalidate;
  if not bAbort then
    Active         := True;
  FTimer.OnTimer   := ScrollTimer;
end;

procedure TScrollText.SetActive(Value: Boolean);
begin
  if FActive <> Value then
  begin
    FActive        := Value;
    FTimer.Enabled := Value;
  end;
end;

procedure TScrollText.SetInterval(Value: Integer);
begin
  if FInterval <> Value then
  begin
    FInterval       := Value;
    FTimer.Interval := Value;
  end;
end;

procedure TScrollText.SetText(const Value: String);
var
  ARect: TRect;
  iWidth: Integer;

  function CalcTxtHeight: Integer;
  begin                   //計算顯示當前文本所需高度
    Result := DrawText(Canvas.Handle,
                       PChar(FText),
                       Length(FText),
                       ARect,
                       DT_CALCRECT
                      );
  end;

  function CalcTxtWidth: Integer;
  begin                   //計算顯示當前文本所需寬度
    DrawText(Canvas.Handle,
             PChar(FText),
             Length(FText),
             ARect,
             DT_CALCRECT
            );
    Result := ARect.Right - ARect.Left;
  end;

  function CalcTxtWidth_2: Integer;
  var      //似乎還是本方法計算得準確一些!DrawText得出的結果總是小了不少
    i, iLen: Integer;
  begin
    Result := Abs(Self.Font.Height) * Length(FText) div 2;
    with TStringList.Create do
      try
        Text := FText;
        if Count > 1 then
        begin
          iLen := 0;
          for i:=0 to Count-1 do
            if Length(Strings[i]) > iLen then
              iLen := Length(Strings[i]);
          Result   := Abs(Self.Font.Height) * iLen div 2;
        end;
      finally
        Free;
      end;
  end;

begin
  FText      := Value;
  ARect      := Self.ClientRect;
  FTxtWidth  := CalcTxtWidth(); // Canvas.TextWidth(Value);
  FTxtHeight := CalcTxtHeight();// Canvas.TextHeight(Value);
  iWidth     := CalcTxtWidth_2();
  if FTxtWidth < iWidth then
    FTxtWidth := iWidth;
  FLastPos   := 0;

  Self.Invalidate;
end;

procedure TScrollText.DoDrawText(var Rect: TRect; Flags: Longint);
begin
  case FDirect of               //關鍵!雖然只幾行代碼^o^
    sdLeft, sdRight:  Rect.Left := Rect.Left + Self.FLastPos;
    sdUp, sdDown:     Rect.Top  := Rect.Top  + Self.FLastPos;
  end;
  inherited DoDrawText(Rect, Flags);
end;

function TScrollText.GetLabelText: String;
begin
  Result := Self.FText;
end;

procedure TScrollText.SetName(const Value: TComponentName);
var
  bChangeText: Boolean;
begin
  bChangeText := (Name = FText);
  inherited SetName(Value);

  if (csDesigning in ComponentState) and (not(csLoading in ComponentState)) then
    if bChangeText then
      ScrollText := Value;//設置設計時的初始文本
end;

procedure TScrollText.SetStep(Value: Integer);
begin                     
  if (FStep <> Value) and (Value < Self.ClientWidth) then
    FStep := Value;       //設置每次滾動像素點數
end;

procedure TScrollText.SetDirect(Value: TScrollDirect);
begin
  if FDirect <> Value then
  begin
    FDirect := Value;     //設置滾動方向
    case Value of
      sdLeft, sdRight:    //左右滾動
        begin
          Self.WordWrap := false;
          Alignment     := taLeftJustify; //則Alignment始終為taLeftJustify
        end;
      sdUp, sdDown:       //上下滾動
        begin
          Self.WordWrap := true;
          Layout        := tlTop;         //則Layout始終為tlTop
        end;
    end;
    ScrollText := FText;  //重新賦值是為了重新計算FTxtHeight, FTxtWidth
  end;
end;

procedure TScrollText.SetAlignment(Value: TAlignment);
begin
  if Alignment <> Value then
  begin
    case FDirect of       //左右滾動時,則Alignment始終為taLeftJustify
      sdLeft, sdRight: inherited Alignment := taLeftJustify;
      sdUp, sdDown:    inherited Alignment := Value;
    end;
  end;
end;

procedure TScrollText.SetLayout(Value: TTextLayout);
begin
  if Layout <> Value then
  begin
    case FDirect of
      sdLeft, sdRight: inherited Layout := Value;
      sdUp, sdDown:    inherited Layout := tlTop; //上下滾動時,Layout始終為tlTop 
    end;
  end;
end;

procedure TScrollText.Reset;  //復位,即讓顯示回到原位
begin
  Self.FLastPos := 0;
  Self.Invalidate;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品久久天天躁| 成人一级视频在线观看| 一区二区三区中文在线观看| 欧美美女一区二区| 国产不卡视频在线观看| 偷拍日韩校园综合在线| 自拍偷拍欧美精品| 国产欧美视频在线观看| 久久久国际精品| 久久久久国色av免费看影院| 欧美色爱综合网| 欧美亚洲国产怡红院影院| 99久久久免费精品国产一区二区| 性久久久久久久久久久久| 精品一区二区在线视频| 成人深夜福利app| 国产91精品露脸国语对白| 国产成人亚洲综合色影视| 国产盗摄精品一区二区三区在线| 国产一区91精品张津瑜| 青椒成人免费视频| 视频一区视频二区中文字幕| 亚欧色一区w666天堂| 三级在线观看一区二区 | 一区二区日韩电影| 亚洲精品免费在线播放| 亚洲欧美区自拍先锋| 亚洲青青青在线视频| 久久久久九九视频| 国产喷白浆一区二区三区| 在线播放日韩导航| 91亚洲永久精品| 粉嫩13p一区二区三区| 婷婷成人激情在线网| 夜夜揉揉日日人人青青一国产精品| 26uuu国产在线精品一区二区| 日韩一区二区三区免费看 | 日本道免费精品一区二区三区| 色呦呦国产精品| 99re热视频这里只精品| 成人av网站在线| 丁香啪啪综合成人亚洲小说| 在线观看视频91| 日韩限制级电影在线观看| 国产亚洲精品免费| 日韩毛片在线免费观看| 亚洲国产欧美日韩另类综合 | 精品无人区卡一卡二卡三乱码免费卡| 国产一区999| 色综合一区二区三区| 欧美中文一区二区三区| 欧美成人乱码一区二区三区| 欧美精品一区二区三区四区| 久久综合久久鬼色| 中文字幕在线观看不卡视频| 亚洲国产乱码最新视频| 另类小说欧美激情| 国产精品91xxx| 99在线精品一区二区三区| 欧美精品丝袜中出| 亚洲国产精品国自产拍av| 亚洲国产成人高清精品| 蜜桃一区二区三区在线观看| 99精品在线免费| 欧美精品一区二区蜜臀亚洲| 伊人色综合久久天天| 蜜桃91丨九色丨蝌蚪91桃色| 蜜乳av一区二区三区| 91久久精品一区二区| 26uuu成人网一区二区三区| 一区二区三区日韩欧美精品| 国产乱理伦片在线观看夜一区| 欧美三区免费完整视频在线观看| 欧美四级电影网| 国产日韩精品一区二区三区| 偷拍一区二区三区四区| 懂色av一区二区三区免费看| 欧美女孩性生活视频| 日韩精品专区在线影院重磅| 亚洲精品视频在线观看网站| 国产91对白在线观看九色| 91麻豆精品国产91久久久使用方法| 精品国偷自产国产一区| 亚洲第一久久影院| 午夜精品福利一区二区三区av| 不卡一区二区三区四区| 精品国产精品一区二区夜夜嗨| 亚洲综合一区在线| 99精品国产热久久91蜜凸| 久久人人爽人人爽| 久久国产免费看| 亚洲青青青在线视频| 国产综合色视频| 欧美一区二区三区播放老司机 | 麻豆国产精品777777在线| 欧美亚洲尤物久久| 亚洲综合无码一区二区| 91视频91自| 自拍偷拍欧美激情| 成人免费看片app下载| 91精品国产麻豆国产自产在线| 亚洲国产一区二区三区| 在线观看中文字幕不卡| 亚洲色图在线视频| av一区二区不卡| 日本一区二区三区久久久久久久久不 | 国产亚洲成年网址在线观看| 亚洲国产婷婷综合在线精品| 在线免费亚洲电影| 一区二区高清视频在线观看| 91丝袜高跟美女视频| 亚洲色图在线播放| 91成人看片片| 亚洲一区二区三区中文字幕在线| 色婷婷一区二区三区四区| 久久综合狠狠综合| 国产精品一卡二| 91网站在线观看视频| 日韩精品亚洲专区| 久久99精品国产.久久久久久| wwwwww.欧美系列| 欧美日韩在线一区二区| 另类小说视频一区二区| 国产精品成人网| 日韩女同互慰一区二区| 色婷婷亚洲婷婷| 国产精品中文字幕日韩精品| 日韩国产精品91| 青青草97国产精品免费观看无弹窗版| 国产成人精品网址| wwwwxxxxx欧美| 成人一区二区三区视频在线观看 | 欧美不卡一区二区三区四区| 精品夜夜嗨av一区二区三区| 国产视频一区二区三区在线观看 | 日韩精品一区二区三区四区视频 | 国产一区二区不卡在线| 中文字幕免费观看一区| 99re视频精品| 日产欧产美韩系列久久99| 欧美精品一区二区在线观看| av电影在线观看不卡| 亚洲国产综合人成综合网站| 亚洲色图20p| 欧美日韩高清一区二区三区| 麻豆久久久久久| 亚洲日韩欧美一区二区在线| 91精品久久久久久蜜臀| 成人手机电影网| 日本中文字幕一区二区视频 | 日本伊人午夜精品| 国产欧美视频一区二区三区| 日本精品视频一区二区三区| 日产精品久久久久久久性色| 国产精品久久午夜| 91精品中文字幕一区二区三区| 国产乱子轮精品视频| 一个色综合av| 日本一区二区在线不卡| 欧美绝品在线观看成人午夜影视| 国产一区二区三区在线观看免费 | 日韩一区二区在线看| 久久亚洲影视婷婷| 国产精品第一页第二页第三页| 亚洲欧洲精品一区二区精品久久久| 尤物av一区二区| 精品亚洲porn| 国产成人精品一区二区三区网站观看| 国产久卡久卡久卡久卡视频精品| 成人性生交大片免费| 欧美在线观看视频一区二区三区| 亚洲国产中文字幕| 国产酒店精品激情| 亚瑟在线精品视频| 中文字幕一区日韩精品欧美| 日韩一区二区影院| 一本一本久久a久久精品综合麻豆| 老司机一区二区| 亚洲国产欧美在线| 中文字幕一区三区| 欧美变态凌虐bdsm| 欧美三级日韩在线| 99vv1com这只有精品| 韩国成人在线视频| 日韩电影一区二区三区| 六月丁香婷婷久久| 一区二区三区日本| 国产精品久久久一本精品 | 在线看国产一区| 成人免费的视频| 韩日av一区二区| 蜜桃av噜噜一区二区三区小说| 亚洲成人激情自拍| 一区二区三区在线免费播放| 国产精品女主播av| 国产清纯在线一区二区www| 日韩一区二区电影网| 欧美男女性生活在线直播观看| 在线看国产一区| 在线观看视频一区二区欧美日韩|