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.   

  • 相关阅读:
    非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法
    AWS 免费套餐
    SQL Server全时区转换
    SQL Server 连接问题案例解析(1)
    SQL Saturday活动再起
    SqlServerProxy的一些资料
    数据是企业的无价財富——爱数备份存储柜server的初体验(图文)
    JEECG第二期深入使用培训(报名截止2014-06-21)
    Java提高篇(三三)-----Map总结
    经常使用哈希函数的比較及其C语言实现
  • 原文地址:https://www.cnblogs.com/ghd2004/p/1236320.html
Copyright © 2011-2022 走看看