• 文字滚屏控件(SliderPanel)


    http://www.delphifans.com/infoview/Article_629.html

    日期:2005年9月6日 作者:arhaha

    {
    ==================== 满天星共享软件注册服务中心 申明 ======================
    本软件由满天星共享软件注册服务中心(http://www.star-reg.com/)赞助冠名发布,
    目的在于促进技术交流,促进中国软件产业的发展与进步。

    本软件的版权以及其他所有权益归原作者所有,满天星共享软件注册服务中心不承担
    任何由本软件的发布带来的权益纠纷和责任。

    欢迎软件作者加盟满天星共享软件注册服务中心(http://www.star-reg.com/),为
    民族软件产业的发展而共同努力!!
    ===========================================================================
    }

    {
      关于SliderPanel:

    一个文字滚屏控件,可以用作系统的新任务或者消息提示。

    这是本人两年前在做一个项目时的产物,参照了一个外国的控件,具体是什么控件现
    在想不起来了。但是本人可以保证,其中很大的部分代码都是我自己重新写的。当时
    刚刚开始做控件,写得不怎么样,不过可以给初学者提供一个如何写控件的学习样例。

    本控件的特点:
       1,在Panel面板上滚动由Lines属性提供的任何文字信息。
       2,提供OnLoop事件,这样每次从头显示时可以进行一些必要处理,比如重新设定
          Lines属性的值。
       3,提供背景文字,在属性Caption中设置,其样式由CaptionStyle属性控制。
       4,文字滚动速度由属性ScrollSpeed控制,单位是毫秒。
       5,文字的对齐方式可以由Alignment属性控制。
       6,文字可以自动换行。

    感谢满天星共享软件注册服务中心(http://www.star-reg.com/)在我发布软件时对
    我的帮助,特此自愿冠名发布。

    欢迎各位传播、使用和修改本控件,但是务必请保留本处的所有说明信息。如果您有
    什么改进的地方,也欢迎您提供一份新的拷贝给我,谢谢!

    本人联系方式: arlinfd@etang.com

    }

    unit SliderPanel;

    interface

    uses Windows, Messages, SysUtils, Classes, Graphics,Controls,StdCtrls,Dialogs,
      ExtCtrls,StrUtils,forms;

    type
      TCaptionStyle = (csNormal,csHollow,csShadow);
      TSliderPanel = class(TPanel)
      private
        FOnLoop:TNotifyEvent;
        FOnChange:TNotifyEvent;
        FTopNow:integer;
        FScrollSpeed: integer;
        FTimer: TTimer;
        FLines: TStringList;
        FDealStrings:boolean;
        FAlignment :TAlignment;
        FCaptionStyle :TCaptionStyle;
        FActive :Boolean;

        Initial:boolean;
        TxtHeight:integer;
        FXOffSet :array of integer;

        procedure SetLines (Value: TStringList);
        procedure SetCaptionStyle (Value: TCaptionStyle);
        procedure SetActive (Value: boolean);
        procedure SetAlignment (Value: TAlignment);
        procedure SetScrollSpeed (Value: integer);
        procedure Timer(Sender: TObject);
        procedure LinesChanged(Sender: TObject);
        procedure toPAINTtxt;
      protected
        procedure Resize;override;
        procedure Paint;OverRide;
      public
        constructor Create (AOwner: TComponent); override;
        destructor  Destroy ; override;
      published
        property Active: Boolean read FActive write SetActive default true;
        property CaptionStyle: TCaptionStyle read FCaptionStyle  write SetCaptionStyle default csNormal;
        property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;

        property Lines: TStringList read FLines write SetLines;

        //文字滚动速度控制,单位是毫秒
        property ScrollSpeed: integer read FScrollSpeed write SetScrollSpeed default 10; 
        property OnLoop: TNotifyEvent read FOnLoop write FOnLoop;
      end;

    procedure Register;

    implementation

    Const
       constStopMess :String = '已经停止滚动!';

    procedure Register;
    begin
      RegisterComponents('Arhaha', [TSliderPanel]);
      showmessage('The TSliderPanel component is made by Arhaha 2002-07');
    end;

    { **************************************************************************** }

    procedure TSliderPanel.paint;
    var
       OutMess:string;
    begin
          //*******
          //inherited;

          SetBKMode(canvas.Handle,windows.TRANSPARENT);
          //
          if self.FTimer.enabled then
             OutMess :=Caption
          else
             OutMess :=constStopMess;

          canvas.Brush.Color := self.Color;
          Canvas.FillRect(self.ClientRect);

          canvas.Font.name := '宋体';
          canvas.Font.Size := self.Font.Size + 16;
          canvas.Font.Style := [fsBold,fsItalic];
          if FCaptionStyle = csHollow then
          begin
             beginpath(canvas.handle);
             SetBkMode( Canvas.Handle, TRANSPARENT );
          end;
          if FCaptionStyle = csShadow then
          begin
             canvas.Font.Color := cl3DDKShadow;
             canvas.TextOut((self.Width - canvas.TextWidth(OutMess)) * 5 div 11 + 1,(self.height - canvas.Textheight(OutMess)) div 2 + 1,OutMess);
          end;
          canvas.Font.Color := clBtnFace;
          canvas.TextOut((self.Width - canvas.TextWidth(OutMess)) * 5 div 11,(self.height - canvas.Textheight(OutMess)) div 2,OutMess);
          if FCaptionStyle = csHollow then
          begin
              endpath(canvas.handle);
              Canvas.Pen.Color := clBtnFace;
              StrokePath(canvas.handle); //将捕获的轮廓用当前的Pen画到Canvas上
          end;

          canvas.Font := self.Font;

          toPAINTtxt;

    end;

    { **************************************************************************** }

    procedure TSliderPanel.toPAINTtxt;// Repaint the control ...
    var
      YOffset,YOffset1,iLoop:integer;
         OutMess:string;
    begin
          if FDealStrings then exit;
          if Initial and (self.Lines.Count = high(FXOffSet)+1) then
          begin
              YOffSet := height - FTopNow;
              for iLoop:=0 to self.Lines.Count - 1 do
              begin
                  YOffSet1 := YOffSet + TxtHeight;
                  if (YOffSet1>0) and (YOffSet<height) then
                      Canvas.textout(FXOffSet[iLoop],YOffSet,self.Lines[iLoop]);
                  YOffSet := YOffSet1;
              end;
          end;
    end;
    { **************************************************************************** }

    procedure TSliderPanel.Timer(Sender: TObject);
    begin
      if not Initial then
      begin
         Canvas.Font := self.Font;
         FTopNow := self.Height;
         TxtHeight := Canvas.textheight('Pg哈');
         self.TabStop := false;
         Canvas.Brush.Color := self.Color;

         Initial := true;
      end else
         invalidate;

      FTopNow := FTopNow + 1;
      if FTopNow>(height+TxtHeight*Self.Lines.Count) then
      begin
        FTopNow :=0;
        if assigned(FOnLoop) then
        begin
           FTimer.Enabled := false;
           FOnLoop(Self);
           FTimer.Enabled := true;
        end;
      end;
    end;

    { **************************************************************************** }

    procedure TSliderPanel.SetCaptionStyle (Value: TCaptionStyle);
    begin
       if FCaptionStyle <> value then
       begin
          FCaptionStyle := value;
          invalidate;
       end;
    end;

    { **************************************************************************** }

    procedure TSliderPanel.SetActive (Value: boolean);
    begin
       if FActive <> value then
       begin
            FActive := value;
            FTimer.Enabled := value;
            invalidate;
       end;
    end;

    { **************************************************************************** }

    constructor TSliderPanel.Create (AOwner: TComponent);
    begin
      inherited Create (AOwner);
      ControlStyle := ControlStyle + [csOpaque];
     
      FScrollSpeed :=50;
      FTimer := TTimer.create(self);
      FTImer.Interval :=FScrollSpeed;// ;
      FTimer.ontimer := timer;
      Initial := false;
      self.Cursor := crArrow;
      FLines := TStringList.Create;
      FLines.onchange := LinesChanged;
      FActive := true;
      BevelOuter := bvNone;
      BevelInner := bvNone;
      BorderStyle := bsSingle;

      if (FTimer.Interval<1) or (csDesigning in ComponentState) then
      begin
          //FTimer.Enabled := false;
      end;

    end;

    { **************************************************************************** }

    destructor  TSliderPanel.Destroy;
    begin
       FTimer.free;
       FLines.Free;
       inherited;
    end;

    { **************************************************************************** }
     procedure TSliderPanel.SetScrollSpeed (Value: integer);
     begin
      if value>=0 then
      begin
        FScrollSpeed := Value;
        FTimer.Interval := value;
        Refresh;
      end else
        ShowMessage('ScrollSpeed must be greater than -1!');
     end;

     { **************************************************************************** }

     procedure TSliderPanel.SetLines (Value: TStringList);
     begin
       FLines.Assign(value);
     end;

       { **************************************************************************** }

     procedure TSliderPanel.SetAlignment(Value: TAlignment);
     begin
        if  FAlignment <> value then
        begin
          FAlignment := value;
          LinesChanged(self);
          refresh;
        end;
     end;


     { **************************************************************************** }

     procedure TSliderPanel.ReSize;
     var
       iLoop:integer;
     begin
       inherited ReSize;
       iLoop := TxtHeight + 10;
       if (self.Height<iLoop) or (self.Width < iLoop) then exit;
       FDealStrings := true;
       for iLoop :=1 to self.Lines.Count - 1 do
       begin
           if (csDesigning in ComponentState) and ((rightstr(self.Lines[0],1)<>#10)) or (length(self.Lines[1])=0) then
              self.Lines[0] := self.Lines[0]+#13#10 + self.Lines[1]
           else
              self.Lines[0] := self.Lines[0] + self.Lines[1];

           self.Lines.Delete(1);
       end;                    
       FDealStrings := false;
       LinesChanged(self);
     end;

     { **************************************************************************** }


     procedure TSliderPanel.LinesChanged(Sender: TObject);
     var
       iLoop,iInnerLoop,iPos,iWidth:integer;
       anstr:widestring;
       temps:string;
     begin
       //
       if FDealStrings then exit;

       FDealStrings := true;
       //////处理换行符
       iLoop:=0;
       while iLoop < self.Lines.Count do
       begin
           temps := self.Lines[iLoop];
           iPos := pos(#13#10,temps);
           inc(iLoop);
           if (iPos>0) and ((iPos + 1) < length(temps)) then
           begin
              self.Lines[iLoop - 1]:=leftstr(temps,iPos + 1);
              self.Lines.Insert(iLoop,rightstr(temps,length(temps) -iPos -1));
           end;
       end;

       iLoop := 0;
       while iLoop<self.Lines.Count do
       begin
           anstr := widestring(self.Lines[iLoop]);
           inc(iLoop);
           if canvas.TextWidth(anstr)>self.ClientWidth then
           begin
              iWidth := 0;
              for iInnerLoop := 1 to length(anstr) do
              begin
                 if anstr[iInnerLoop]=#13 then break;
                 iWidth := iWidth + self.Canvas.TextWidth(anstr[iInnerLoop]);
                 if (iWidth > self.ClientWidth) then
                 begin
                     temps := '';
                     for iPos :=1 to iInnerLoop -1 do temps := temps + anstr[iPos];
                     self.Lines[iLoop - 1] := temps;

                     temps := '';
                     for iPos := length(anstr) downto iInnerLoop do temps := anstr[iPos] + temps;
                     self.Lines.Insert(iLoop,temps);
                     break;
                 end;
              end;
           end;
       end;

       /////计算显示位置的X位移
       iPos :=  self.Lines.Count;
       if iPos>0 then
       begin
           setlength(FXOffSet,iPos);
           //self.Canvas.TextOut(100,100,'aaaa');
           for iLoop :=0  to iPos -1 do
           begin
               iWidth := self.Canvas.TextWidth( self.Lines[iLoop]);
               if FAlignment = taLeftJustify then
               begin
                  FXOffSet[iLoop] := 0;
               end else if FAlignment = taRightJustify then
               begin
                  FXOffSet[iLoop] :=self.ClientWidth  - iWidth;
               end else
               begin
                  FXOffSet[iLoop] := (self.ClientWidth - iWidth) div 2;
               end;
           end;
       end;

       if assigned(FOnChange) then FonChange(Self);
       FDealStrings := false;
       //
       toPAINTtxt;
     end;

      { **************************************************************************** }

    end.

    (出处:DelphiFans.com)

  • 相关阅读:
    TuShare接口适应
    任泽平金句记录
    分红送股---要注意的两个日期
    解决github无法登录的问题
    持久斗争
    正则语法
    JWT的结构
    付鹏的黄金分析框架
    vscode设置背景图片
    Ubuntu 16.04安装Nginx
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/1897731.html
Copyright © 2020-2023  润新知