zoukankan      html  css  js  c++  java
  • 使用GDI+绘制的360风格按钮控件

    将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50%,可以将按钮后面的内容显示出来.GDIPAPI, GDIPOBJ, GDIPUTIL三个单元可用万一的博客上寻找下载地址.

    unit u360StyleButton;

      

    interface  

      

    uses  

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

      GDIPAPI, GDIPOBJ, GDIPUTIL;

      

    type

      TBtn360Style = class(TButton)

      private

        FBkgColor: TColor; //鼠标悬停是的背景颜色

        FEdgColor: TColor; //边框颜色

        FCanvas: TCanvas;

        FMouseEnter: Boolean;

        FPngFileName: string;

        procedure CNDrawItem(var Message:TWMDrawItem);message CN_DRAWITEM;

        procedure SetPngFileName(const Value: string);

        procedure SetBkgColor(const Value: TColor);

        procedure SetEdgColor(const Value: TColor);

      protected

        procedure CreateParams(var Params:TCreateParams);override;

        procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;

        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

        procedure SetButtonStyle(ADefault:Boolean);override; //必须重新找个函数 否则会按默认样式绘制

      public

        constructor Create(AOwner:TComponent);override;  

        destructor Destroy;override;  

      published

        property PngFileName: string read FPngFileName write SetPngFileName;

        property BkgColor: TColor read FBkgColor write SetBkgColor;

        property EdgColor: TColor read FEdgColor write SetEdgColor;

      end; 

    procedure Register;  

      

    implementation 

    constructor TBtn360Style.Create(AOwner: TComponent);   

    begin   

      inherited Create(AOwner);

      DoubleBuffered := True;   

      FCanvas := TCanvas.Create;

      FBkgColor := clBlue;

      FEdgColor := clSkyBlue;

    end;  

    destructor TBtn360Style.Destroy;   

    begin   

      FCanvas.Free;

      inherited Destroy;   

    end;

    procedure TBtn360Style.CreateParams(var Params: TCreateParams);

    begin   

      inherited CreateParams(Params);   

      with Params do Style := Style or BS_OWNERDRAW;   

    end;

      

    procedure TBtn360Style.SetEdgColor(const Value: TColor);

    begin

      if FEdgColor <> Value then

      begin

        FEdgColor := Value;

        Invalidate;

      end;

    end;

    procedure TBtn360Style.SetBkgColor(const Value: TColor);

    begin

      if FBkgColor <> Value then

      begin

        FBkgColor := Value;

        Invalidate;

      end;

    end;

    procedure TBtn360Style.SetButtonStyle(ADefault: Boolean);

    begin

      if csDesigning in ComponentState then

        inherited;

    end;

    procedure TBtn360Style.SetPngFileName(const Value: string);

    begin

      if FPngFileName <> Value then

      begin

        FPngFileName := Value;

        Invalidate;

      end;

    end;

    procedure TBtn360Style.CMMouseEnter(var Message: TMessage);

    begin

      inherited;

      FMouseEnter := True;

      Invalidate;

    end;

    procedure TBtn360Style.CMMouseLeave(var Message: TMessage);

    begin

      inherited;

      FMouseEnter := False;

      Invalidate;

    end;

    procedure TBtn360Style.CNDrawItem(var Message: TWMDrawItem);   

    var   

      IsDown: Boolean;

      ARect: TRect;

      DrawItemStruct: TDrawItemStruct;

      wh:TSize;

      g: TGPGraphics;

      pen: TGPPen;

      img: TGPImage;

      img2: TGPBitmap;

      imgAtt: TGPImageAttributes;

      i, j:Integer;

    const

      ColorMatrix: TColorMatrix = (

        (1.0, 0.0, 0.0, 0.0, 0.0),

        (0.0, 1.0, 0.0, 0.0, 0.0),

        (0.0, 0.0, 1.0, 0.0, 0.0),

        (0.0, 0.0, 0.0, 1.0, 0.0),

        (1.0, 0.0, 0.0, 0.0, 1.0));

    begin

      DrawItemStruct:=Message.DrawItemStruct^;

      FCanvas.Handle := DrawItemStruct.hDC;

      g := TGPGraphics.Create(FCanvas.Handle);

      pen := TGPPen.Create(GDIPAPI.MakeColor(128, FEdgColor and $FF, (FEdgColor shr 8) and $FF, (FEdgColor shr 16) and $FF));

      img := TGPImage.Create(FPngFileName);

      img2 := TGPBitmap.Create(Width, Height);

      for i := 0 to img2.GetWidth do

        for j := 0 to img2.GetHeight do

        begin

          color := GDIPAPI.MakeColor(128, FBkgColor and $FF, (FBkgColor shr 8) and $FF, (FBkgColor shr 16) and $FF);

          img2.SetPixel(i, j, color);

        end;

      ARect := ClientRect;

      with DrawItemStruct do

        IsDown := itemState and ODS_SELECTED <> 0;

      if FMouseEnter then   //鼠标在按钮上 则绘制一个背景及边框

      begin

        Perform($000B, 0, 0);

        g.DrawImage(img2, 0, 0, Width, Height);

        g.DrawRectangle(pen, 0, 0, Width - 1, Height - 1);

        Perform($000B, 1, 0);

      end;

      //按钮被按下时的状态绘制

      if IsDown then

      begin

        imgAtt := TGPImageAttributes.Create;

        imgAtt.SetColorMatrix(ColorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeDefault);

        g.DrawImage(img, MakeRect(0, 0, img.GetWidth, img.GetHeight),

                    -10, -10, img.GetWidth + 10, img.GetHeight + 10, UnitPixel, imgAtt);

        FreeAndNil(imgAtt);

      end

      else  //绘制一个未按下的按钮

        g.DrawImage(img, (Width - img.GetWidth) div 2, 10);

      FreeAndNil(img);

      FreeAndNil(img2);

      FreeAndNil(g);

      FreeAndNil(pen);

      //绘制Caption文本内容    

      FCanvas.Font := Self.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), height - wh.cy - 10,Caption);   

        FCanvas.Font.Color := clBtnShadow;   

      end

      else

        FCanvas.TextOut((Width div 2)-(wh.cx div 2), height - wh.cy - 10,Caption);

      FCanvas.Handle := 0;

    end;

    procedure Register;

    begin

      RegisterComponents('HenreashPackages', [TBtn360Style]);

    end;

    end. 

  • 相关阅读:
    sqlserver编程基本语法
    每日一记--技术小细节
    每日一记--jsp
    每日一记--session/servletContext
    每日一记--cookie
    每日一记--HashTable/HashMap/ConcurrentHashMap
    每日一记--Ajax(下)
    每日一记--Axjx
    每日一记--索引/过滤器
    每日一记--酱油日
  • 原文地址:https://www.cnblogs.com/blogpro/p/11426581.html
Copyright © 2011-2022 走看看