发信人: cn_prince(欢喜王子) 
整理人: teleme(2001-04-15 13:27:39), 站内信件
 | 
 
 
作为Delphi程序员,要想进一步提高编程水平就必须掌握控件的编写方法,本篇文章将通过一个简单的例子来为初学者介绍编写控件的一些基本方法和模式。 
 
   这个例子控件叫TLeiLabel,是在TLabel的基础上增加两个实用的功能:一是使文字具有立体形状,二是使文字具有超链接属性。下面就让我们一步步来实现这些功能。 
 
   一、使文字具有立体形状 
   首先定义类型T3DEffect和属性Style3D分别如下: 
 
   T3DEffect=(Normal,Raised,Lowered, Shadowed); 
 
   property Style3D:T3DEffect read FStyle3D write SetStyle3D default Normal; 
 
   再在private中定义变量:“FStyle3D:T3DEffect;”,并设置SetStyle3D()方法如下,这也是写方法的一般格式: 
 
   procedure TLeiLabel.SetStyle3D(Value: T3DEffect); 
 
    begin 
 
    if FStyle3D <> value then 
 
    begin 
 
    FStyle3D := value; 
 
    invalidate; //表示控件将重画 
 
    end; 
 
    end; 
 
   另外对于带阴影的文字还要定义阴影的偏移量ShadeXOffSet和ShadeYOffSet: 
 
   property ShadowXOffSet: integer read FXOffSet write SetFXOffSet default 5; 
 
   property ShadowYOffSet: integer read FYOffSet write SetFYOffSet default -5; 
 
   写方法SetFXOffSet()、SetFYOffSet()和上面的SetStyle3D()类似。 
 
   要重画控件一般要重载Paint方法,此处只是重画文字,我们只需重载DoDrawText方法。 
 
   DoDrawText的声明放在Protected中: 
 
   procedure DoDrawText(var Rect: TRect; Flags: Longint); override; 
 
   此处DoDrawText()根据四种类型(正常、凸起、凹进和阴影)分别画出不同的文字。 
 
 二、使文字具有超链接属性 
   定义一个属性URL表示要链接的网址或Email地址。 
 
   Property URL : String read FURL write SetURL; 
 
   写方法SetURL如下: 
 
   procedure TLeiLabel.SetURL(Value: String); 
 
   Begin 
 
   if FURL <> Value then FURL := Value ; 
 
   if FURL <> '' then 
 
   Cursor := crHandPoint; 
 
   end; 
 
   当点击此Label时要打开浏览器或收发邮件工具,这便要重载Click方法。 
 
    Procedure Click; Override; 
 
    procedure TLeiLabel.Click; 
 
    var s: string; 
 
    Begin 
 
    Inherited Click; 
 
    if FURL = '' then exit; 
 
    if LowerCase(Copy(FURL,1,7)) = 'http://' then 
 
    s := FURL 
 
    else if Pos('@',FURL) <> 0 Then 
 
    s := 'mailto:' + FURL 
 
    else 
 
    s := 'http://' + FURL; 
 
    ShellExecute(Application.Handle, 'open', PChar(s), NIL, NIL, SW_SHOWNORMAL); 
 
    end; 
 
   一般的超链接当鼠标移入时文字的颜色发生变化。为此加上属性HoverColor,表示鼠标移入时文字的颜色。 
 
   Property HoverColor : TColor Read FHoverColor Write SetHoverColor default clRed; 
 
   还要定义两个接收Windows消息CM_MOUSEENTER和CM_MOUSELEAVE(鼠标移进和移出)的过程: 
 
   Procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; 
 
   Procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; 
 
   Procedure TLeiLabel.CMMouseEnter (Var Message: TMessage); 
 
    begin 
 
    If Enabled and Visible and getParentForm(Self).Active then 
 
    begin 
 
    FFontColor := Font.Color; 
 
   //将文字的颜色保存起来 
 
    Font.Color := FHoverColor; 
 
   //改变文字颜色 
 
    End; 
 
    end; 
 
   Procedure TLeiLabel.CMMouseLeave (Var Message: TMessage); 
 
    begin 
 
    Font.Color:=FFontColor; 
 
   //恢复文字原来的颜色 
 
    end; 
 
   为设置属性的默认值,我们还需要重载构造Create(),注意,重载构造时必须首先调用祖先类的构造。重载构造Create()的程序如下: 
 
    constructor TLeiLabel.Create(AOwner: TComponent); 
 
    begin 
 
    inherited Create(AOwner); 
 
   //必须首先调用祖先类的构造 
 
    FStyle3D := Normal; 
 
    FXOffSet := 5; 
 
    FYOffSet := -5; 
 
    FHoverColor := clRed; 
 
    end; 
 
   最后,还必须为这个控件加上图标。我们可以用Delphi中的Image Editor来创建一个24×24的Bitmap位图,保存为一个DCR文件,文件名必须与控件的Pas文件名相同,位图名必须与控件名相同且全部大写。 
 
   这样,一个完整的实用的控件就做好了。
 
 
  ---- prince  | 
 
 
 |