亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

用Delphi做一個有顏色屬性的按鈕

2019-11-18 17:57:46
字體:
來源:轉載
供稿:網友

Delphi做一個有顏色屬性的按鈕

http://www.netgocn.com 原創

在標準的Windows程序中所有按鈕均沒有顏色。因此Delphi提供的所有按鈕組件也均無顏色屬性,有時你可能做了一個五顏六色的程序界面,而按鈕顏色可能很不相稱。
    在此本人提供一種用自定義組件制作有顏色屬性的銨鈕的方法,它遵循了Delphi的組件定義規則,完成后該按鈕與普通按鈕(Button)相比,多了一個Color屬性,你可以永遠地使用它,在設計階段隨意地改變顏色,就象是Delphi本身提供的組件一樣(本文代碼在Delphi 4.0下完成)。
第一步
   
打開Delphi,選擇菜單的Component/New Component選項,在彈出對話框的Ancestor type下拉框中手工填入或下拉選擇TButton,這是選擇了我們自定義組件的祖先類,我們將以此為基礎完成自定義組件的下一步代碼編寫(這也是自定義組件編寫的第一步)。對話框中的其余可編寫內容就隨你的高興而填寫了,但是你必須注意Class Name(類名)不能和已有的(包括你自定義的)類名相同,同時還應該記住該自定義組件的安裝位置(Palette Page下拉框中的內容)和單元文件在磁盤上的存放位置(Unit file name編輯框內容),不然以后你在何處去找它?本文以 Delphi的默認值TButton1為類名。
第二步
    做完以上工作后,按下面的OK按鈕,Delphi將為你自動生成一個基本的組件代碼,對這樣的代碼框架一般沒有必要修改,一定要修改的話請注意Delphi的組件定義規則(本文只是刪除了所有自動生成的注釋內容),接著就應該將其文件存盤。
第三步
    在上面的代碼框架中添加我們的代碼,當然這是我們要做的主要工作。

1.      Delphi自動生成的單元文件的數據類型定義部份修改為:
type
TButton1 = class(TButton)
PRivate
  FColor:TColor;
  FCanvas: TCanvas;
  IsFocused: Boolean;
  procedure SetColor(Value:TColor);
  procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
protected
  procedure CreateParams(var Params: TCreateParams); override;
  procedure SetButtonStyle(ADefault: Boolean); override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property Color:TColor read FColor write SetColor default clWhite;
end;
說明:
    a. 我們只添加了一個屬性,因此在published段的代碼下只有一個Color屬性,并將默認顏色設為白色(clWhite,當然你可以隨意改變)。
    b. 重載構造函數和析構函數,二者應為可以在外部調用,因此應將其放在public段。
    c. 讀屬性的私有數據域FColor和屬性的寫方法SetColor,應放在私有段(private),其它與此相關的非獨立的變量和過程/函數等也應放在private段,以使在類以外不能訪問它們。

2.      Delphi自動生成的 procedure Register可以不理它。我們在它的過程體之后,在end.(注意符號“.”)之前手工加上以下代碼,完成我們在上面定義的全部過程的過程體編寫(這里我們沒有定義有函數原型):

//*** 構造函數 *****************************************************
constructor TButton1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
  FColor:=clWhite;//默認顏色
end;

//*** 析構函數 *************************************************
destructor TButton1.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end;

//*** 定義按鈕樣式,必須將該按鈕重定義為自繪式按鈕 *************
procedure TButton1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;

//*** 屬性寫方法 ************************************************
procedure TButton1.SetColor(Value:TColor);
begin
  FColor:=Value;
  Invalidate;
end;

//*** 設置按鈕狀態***********************************************
procedure TButton1.SetButtonStyle(ADefault: Boolean);
begin
  if ADefault <> IsFocused then
  begin
    IsFocused := ADefault;
    Refresh;
  end;
end;

//*** 繪制按鈕 ***************************************************
procedure TButton1.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 := FColor;
  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 := 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)+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 := FColor;
     DrawFocusRect(FCanvas.Handle, ARect);
  end;
  FCanvas.Handle := 0;
end;
//** The End *********************************************************
end.

第四步:檢查確認無誤后選擇Delphi菜單的Component/Install Component選項,在Unite file name編輯框中確認你的文件路徑和名稱后按OK按鈕,Delphi將編譯、安裝該組件。
      
如果你完全按本文步聚進行,在編譯安裝無誤后,你可以在Delphi組件標簽的Samples標簽頁中找到一個圖標和TButton一樣的按鈕。新建一個工程并將這個我們自義的按鈕放置在Form上其默認的名稱是Button11,你會看到一個白色的按鈕。怎么樣?通過其Color屬性你以隨意設置它的顏色。
     
最后說明:本文中的按鈕繪制方式采用了和Delphi本身的TButton相似的繪制方式,以達到和Delphi按鈕相似的動作外觀。然而你想要發揮的話你可以在FCanvas這塊畫布上繪制任意的、你想要的、可以表達你的個性的所有文字和圖形。

 有何問題請來信或留言。
歡迎試用本站軟件:NetGoCN(網行)



上一篇:用Delphi創建服務程序

下一篇:Delphi的Hint(1)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品中文字幕在线| 韩日精品中文字幕| 亚洲的天堂在线中文字幕| 国产成人自拍视频在线观看| 国产成人精品免费久久久久| 日本中文字幕久久看| 亚洲美女精品久久| 亚洲精品网址在线观看| 亚洲福利在线观看| 日韩av黄色在线观看| 国产精品欧美一区二区| 久久免费在线观看| 91国产美女在线观看| 韩国三级电影久久久久久| 国产精品欧美激情在线播放| 久久精品国产精品亚洲| 国产成人精品a视频一区www| 97碰在线观看| 在线视频日韩精品| 日韩欧美在线一区| 国产精品极品美女在线观看免费| 成人免费看吃奶视频网站| 色在人av网站天堂精品| 精品中文字幕视频| 欧美日韩国产专区| 国产啪精品视频网站| 国自在线精品视频| 国产精品视频在线观看| 青青在线视频一区二区三区| 懂色av中文一区二区三区天美| 欧美在线性视频| 97精品视频在线观看| 成人午夜两性视频| 亚洲国产毛片完整版| 亚洲精品美女在线观看| 热久久视久久精品18亚洲精品| 日韩第一页在线| 一区二区三区视频观看| 欧洲亚洲免费在线| 91视频九色网站| 国产精品久久久久久久久久东京| 亚洲第一偷拍网| 97av视频在线| 国产精品91久久久久久| 国产69精品99久久久久久宅男| 亚洲一区精品电影| 亚洲第一偷拍网| 日韩电影视频免费| 亚洲日本成人女熟在线观看| 欧美在线激情视频| 日韩av在线免费观看一区| 热草久综合在线| 中文字幕日韩视频| 九九综合九九综合| 欧美高清视频一区二区| 亚洲色图日韩av| 黄色91在线观看| 成人欧美一区二区三区在线| 欧美成人性生活| 午夜精品一区二区三区视频免费看| 91精品久久久久久久久久久久久| 亚洲影视中文字幕| 日韩高清免费观看| 亚洲精品久久7777777| 亚洲福利视频网站| 国产成人一区二| 岛国av一区二区| 亚洲色图五月天| 国产成人91久久精品| 国语自产精品视频在线看抢先版图片| 亚洲一区二区三区乱码aⅴ| 91久久国产综合久久91精品网站| 日韩专区在线播放| 91地址最新发布| 欧美激情精品久久久久久久变态| 欧美亚洲伦理www| 久久久精品一区二区| 高清一区二区三区四区五区| 欧美激情欧美狂野欧美精品| 欧美人与物videos| 亚洲电影免费观看高清完整版在线观看| 在线日韩av观看| 亚洲影院高清在线| 亚洲精品成人久久电影| 92版电视剧仙鹤神针在线观看| 亚洲桃花岛网站| 欧洲精品久久久| 亚洲色图50p| 久热精品视频在线| 菠萝蜜影院一区二区免费| 亚洲成人激情图| 久久久久久久久91| 亚洲第一网站男人都懂| 亚洲欧美另类人妖| 午夜精品视频在线| 亚洲已满18点击进入在线看片| 亚洲精品国产美女| 亚洲综合中文字幕在线观看| 欧美在线亚洲在线| 97在线观看视频| 国产精品成人免费视频| 国产精品va在线| 裸体女人亚洲精品一区| 亚洲国产欧美一区二区三区同亚洲| 国产精品久久99久久| 在线日韩av观看| 国产精品一区二区三区成人| 青青久久av北条麻妃海外网| 欧美一区在线直播| 国产精品美女免费看| 国产一区二区欧美日韩| 中文字幕在线视频日韩| 久久久av免费| 综合国产在线视频| 国产69久久精品成人看| 成人精品久久久| 55夜色66夜色国产精品视频| 色噜噜国产精品视频一区二区| 国产免费一区二区三区在线观看| 国产精品91久久久久久| www.久久撸.com| 亚洲人成77777在线观看网| 久久国产精品久久久| 不卡伊人av在线播放| 欧美精品videofree1080p| 日日狠狠久久偷偷四色综合免费| 欧美性猛交xxx| 日韩精品福利网站| 精品亚洲国产视频| 一区二区三区 在线观看视| 国产一级揄自揄精品视频| 国产美女精品视频免费观看| 欧美在线一级视频| 久久久国产一区二区| 亚洲精品美女在线观看| 欧美日韩综合视频网址| 91精品国产综合久久久久久久久| 久久久欧美一区二区| 91香蕉嫩草影院入口| 亚洲色在线视频| 亚洲人午夜精品| 久久99热精品这里久久精品| 久久久久久一区二区三区| 久久精品久久久久| 日韩精品视频在线观看免费| 91免费电影网站| 欧美多人乱p欧美4p久久| 欧美性猛交xxxx黑人| 国产亚洲精品成人av久久ww| 性欧美激情精品| 亚洲人成网站免费播放| 国产大片精品免费永久看nba| 久久99久国产精品黄毛片入口| 成人性生交大片免费看小说| 国产精品一区电影| 国产精品高潮呻吟久久av无限| 国产福利精品av综合导导航| 91精品国产精品| 91久久久久久| 久久人人爽人人爽人人片av高清| 亚洲一区二区日本| 美女黄色丝袜一区| 亚洲国产黄色片| 久久伊人精品天天|