zoukankan      html  css  js  c++  java
  • 自定义组件——按钮(转)

    unit    MyButton;

    interface

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

    type
           TMyButton    =    class(TButton)
    private
               FCanvas:    TCanvas;   
               IsFocused:    Boolean;   
               procedure    CNDrawItem(var    Message:    TWMDrawItem);    message    CN_DRAWITEM;    //    换成CN_DRAWITE不是WM_DRAWITE   
    protected
               procedure    CreateParams(var    Params:    TCreateParams);    override;   
               procedure    SetButtonStyle(ADefault:    Boolean);    override;    //    这条必须加,才能触发CN_DRAWITEM   
    public
               constructor    Create(AOwner:    TComponent);override;   
               destructor    Destroy;    override;   
    published   
               property    Color    default    clWhite;    //    Color在父类中已经有声明   
           end;   
        
       procedure    Register;   
        
       implementation   
        
       procedure    Register;   
       begin   
           RegisterComponents('MyLib',    [TMyButton]);   
       end;   
        
       procedure    TMyButton.CNDrawItem(var    Message:    TWMDrawItem);   
       var   
           IsDown,    IsDefault:    Boolean;   
           ARect:    TRect;   
           Flags:    Longint;   
           DrawItemStruct:    TDrawItemStruct;   
           wh:    TSize;   
       begin   
           DrawItemStruct    :=    Message.DrawItemStruct^;   
           FCanvas.Handle    :=    DrawItemStruct.hDC;   
           ARect    :=    ClientRect;   
           with    DrawItemStruct    do   
           begin   
               IsDown    :=    itemState    and    ODS_SELECTED    <>    0;   
               IsDefault    :=    itemState    and    ODS_FOCUS    <>    0;   
           end;   
        
           Flags    :=    DFCS_BUTTONPUSH    or    DFCS_ADJUSTRECT;   
           if    IsDown    then    Flags    :=    Flags    or    DFCS_PUSHED;   
           if    DrawItemStruct.itemState    and    ODS_DISABLED    <>    0    then   
               Flags    :=    Flags    or    DFCS_INACTIVE;   
        
           if    IsFocused    or    IsDefault    then   
           begin   
               //按钮得到焦点时的状态绘制   
               FCanvas.Pen.Color    :=    clWindowFrame;   
               FCanvas.Pen.Width    :=    1;   
               FCanvas.Brush.Style    :=    bsClear;   
               FCanvas.Rectangle(ARect.Left,    ARect.Top,    ARect.Right,    ARect.Bottom);   
               InflateRect(ARect,    -1,    -1);   
           end;   
        
           FCanvas.Pen.Color    :=    clBtnShadow;   
           FCanvas.Pen.Width    :=    1;   
           FCanvas.Brush.Color    :=    Color;   
           if    IsDown    then   
           begin   
             //按钮被按下时的状态绘制   
               FCanvas.Rectangle(ARect.Left    ,    ARect.Top,    ARect.Right,    ARect.Bottom);   
               InflateRect(ARect,    -1,    -1);   
           end    else   
               //绘制一个未按下的按钮   
               DrawFrameControl(DrawItemStruct.hDC,    ARect,    DFC_BUTTON,    Flags);   
           FCanvas.FillRect(ARect);   
        
           //绘制Caption文本内容   
           FCanvas.Font.Assign(Font);   
           ARect    :=    ClientRect;   
           wh    :=    FCanvas.TextExtent(Caption);   
           FCanvas.Pen.Width    :=    1;   
           FCanvas.Brush.Style    :=    bsClear;   
           if    not    Enabled    then   
           begin    //按钮失效时应多绘一次Caption文本   
               FCanvas.Font.Color    :=    clBtnHighlight;   
               FCanvas.TextOut((Width    div    2)    -    (wh.cx    div    2)    +    1,   
                   (Height    div    2)    -    (wh.cy    div    2)    +    1,    Caption);   
               FCanvas.Font.Color    :=    clBtnShadow;   
           end;   
           FCanvas.TextOut((Width    div    2)    -    (wh.cx    div    2),   
               (Height    div    2)    -    (wh.cy    div    2),    Caption);   
        
           //绘制得到焦点时的内框虚线   
           if    IsFocused    and    IsDefault    then   
           begin   
               ARect    :=    ClientRect;   
               InflateRect(ARect,    -4,    -4);   
               FCanvas.Pen.Color    :=    clWindowFrame;   
               FCanvas.Brush.Color    :=    Color;   
               DrawFocusRect(FCanvas.Handle,    ARect);   
           end;   
           FCanvas.Handle    :=    0;   
       end;   
        
       procedure    TMyButton.SetButtonStyle(ADefault:    Boolean);   
       begin   
           if    ADefault    <>    IsFocused    then   
           begin   
               IsFocused    :=    ADefault;   
               Refresh;   
           end;   
       end;   
        
       procedure    TMyButton.CreateParams(var    Params:    TCreateParams);   
       begin   
           inherited    CreateParams(Params);   
           with    Params    do    Style    :=    Style    or    BS_OWNERDRAW;    //    不是Params.WindowClass   
       end;   
        
       constructor    TMyButton.Create(AOwner:    TComponent);   
       begin   
           inherited;   
           FCanvas    :=    TCanvas.Create;   
           Color    :=    clWhite;    //    默认值需要在Create中设置   
       end;   
        
       destructor    TMyButton.Destroy;   
       begin   
           FCanvas.Free;   
           inherited;   
       end;   
        
       end.   

  • 相关阅读:
    递归算法
    C#委托
    final 、finally
    JSP中的日期问题
    为GirdView添加CSS样式
    PC连Moto V180上网
    CSS条状图表:垂直型
    树型列表的实现
    关闭窗口无提示
    用PhotoShop做漂亮的相框,哈哈
  • 原文地址:https://www.cnblogs.com/ghd2004/p/1236320.html
Copyright © 2011-2022 走看看