当前位置: 首页 > 学习 > 电脑学习 > 程序设计 > Delphi > 基础教程 > 正文

在窗口标题区添加按钮

http://www.zk168.com.cn  招考学习网 2006-4-26 12:45:56
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--

 

ReadBook是一款优秀的软件,我相信读者中也有不少人在使用它。今天,我想给大家谈谈它是如何在窗口的标题区添加按钮的。有可能我的实现方法和ReadBook的不一样,没关系,大家互相学习吧!
  程序主要用到了几个消息,除了程序中消息函数定义的方法外,大家还要注意每一个消息函数中都调用了inherited,原因不用我饶舌了吧?程序中还调用了GetSystemMetrics、DrawButtonFace等几个函数。我本来在程序中详细地加了注释,不过我后来都删除了,因为Delphi的帮助文件可以说是最好的注释了。如果你有什么不懂之处,别忘了按“F1”键,怎么样,一切都写得清清楚楚的吧?
  把下边的程序输进计算机,自己用帮助文件研究吧。记住,学习编程可不能偷懒哦


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;


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.

  仔细研究一下程序中有关计算的几个句子,试着改变某个数字看一看,这将有助于你理解程序。

-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
最新入库:
 
·实质、过程及意义——阿多尔诺“否定的辩证法”探微
·从Ontology的译名之争看哲学术语的翻译原则
·论马克思主义哲学经典的解释——解释学方法及其在马克
·中国哲学当前的核心与周边问题
·和合学与21世纪文化价值和科技
·中国文化的和合精神与21世纪
·宗教之间理当相互宽容
·上半个世纪的自由主义
·殷周至春秋时期神人关系之演进
·大学之道:构建以“三纲八目”为核心的道德修养体系
相关内容:
 
网友点评:
 
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
友情提醒:
 1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网
 友来信指正!
 2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
 3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
 4.如需转载请注明出处及作者,谢谢合作!
 5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
 6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
 7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL:  XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接!
你问我答 更多>>