程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 在窗口標題區添加按鈕

在窗口標題區添加按鈕

編輯:Delphi
第19期《在系統菜單上添加自己的菜單項》一文,大家都已經拜讀了吧?實際上,諸如此類的問題還有很多,對於初學者來說,或許不知如何下手,因為初學者學習的參考書往往著重介紹某種編程語言,而沒有詳細講解Windows的基礎知識。大家一直在Windows的框框裡,卻不懂得消息、鉤子,對API函數也不熟悉。所以,往往初學者自認為學好了一門語言,到真正使用的時候卻一下子捉襟見肘起來了。因此,我建議初學者在學習時,再找一本諸如《Windows編程內幕》之類的書讀一讀,對提高自己的水平大有裨益哦。使用某個軟件的時候,也要想一想,作者是如何實現軟件的功能的,還應該站在作者的角度考慮一下,軟件還有什麼要改進的地方。這樣,你的功夫就會越來越深啦!

  ReadBook是一款優秀的軟件,我相信讀者中也有不少人在使用它。關於它的病毒自我監測功能的實現,《電腦愛好者》已經討論過了。今天,我想給大家談談它是如何在窗口的標題區添加按鈕的。有可能我的實現方法和ReadBook的不一樣,沒關系,大家互相學習吧!

  程序主要用到了幾個消息,除了程序中消息函數定義的方法外,大家還要注意每一個消息函數中都調用了inherited,原因不用我饒舌了吧?程序中還調用了GetSystemMetrics、DrawButtonFace等幾個函數。我本來在程序中詳細地加了注釋,不過我後來都刪除了,因為Delphi的幫助文件可以說是最好的注釋了。如果你有什麼不懂之處,別忘了按“F1”鍵,怎麼樣,一切都寫得清清楚楚的吧?

  把下邊的程序輸進計算機,自己用幫助文件研究吧。記住,學習編程可不能偷懶哦。

unit Unit1;

interface

uses

Windows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type

TForm1 = class(TForm)

procedure FormResize(Sender: TObject);

private

{ Private declarations }

CaptionBtn:TRect;

procedure DrawCaptButton;

rocedure WMNCPaint(var Msg:TWMNCPaint);message WM_NCPaint;

procedure WMNCActivate(var Msg:TWMNCActivate);message WM_NCActivate;

procedure WMSetText(var Msg:TWMSetText);message WM_SetText;

procedure WMNCHitTest(var Msg:TWMNCHitTest);message WM_NCHittest;

procedure WMNCLButtonDown(var Msg:TWMNCLButtonDown);message WM_NCLButtonDown;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

const

htCaptionBtn=htSizeLast+1;

{$R *.DFM}

procedure TForm1.DrawCaptButton;

var

xFrame,yFrame,xSize,ySize:Integer;

R:TRect;

begin

xFrame:=GetSystemMetrics(SM_CXFRAME);

yFrame:=GetSystemMetrics(SM_CYFRAME);

xSize:=GetSystemMetrics(SM_CXSIZE);

ySize:=GetSystemMetrics(SM_CYSIZE);

CaptionBtn:=Bounds(Width-xFrame-4*xSize+2,yFrame+2,xSize+1,ySize-4);

Canvas.Handle:=GetWindowDC(Self.Handle);

Canvas.Font.Name:='宋體';

Canvas.Font.Color:=clBlack;

Canvas.Pen.Color:=clYellow;

Canvas.Brush.Color:=clBtnFace;

try

DrawButtonFace(Canvas,CaptionBtn,1,bsAutoDetect,False,False,False);

R:=Bounds(Width-xFrame-4*xSize+3,yFrame+3,xSize-2,ySize-7);

with CaptionBtn do

Canvas.TextRect(R,R.Left+2,R.Top+2,'?');

finally

ReleaseDC(Self.Handle,Canvas.Handle);

Canvas.Handle:=0;

end;

end;

procedure TForm1.WMNCActivate(var Msg: TWMNCActivate);

begin

inherited;

DrawCaptButton;

end;

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);

begin

inherited;

with Msg do

if PtInRect(CaptionBtn,Point(xPos-Left,yPos-Top)) then

Result:=htCaptionBtn;

end;

procedure TForm1.WMNCLButtonDown(var Msg: TWMNCLButtonDown);

begin

inherited;

if(Msg.HitTest=htCaptionBtn)then

showmessage('成功了!');

end;

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);

begin

inherited;

DrawCaptButton;

end;

procedure TForm1.WMSetText(var Msg: TWMSetText);

begin

inherited;

DrawCaptButton;

end;

procedure TForm1.FormResize(Sender: TObject);

begin

Perform(WM_NCACTIVATE,Word(Active),0);

end;

end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved