在窗口标题区添加按钮

2016-01-29 14:13 146 1 收藏

在窗口标题区添加按钮,在窗口标题区添加按钮

【 tulaoshi.com - 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.

来源:http://www.tulaoshi.com/n/20160129/1492777.html

延伸阅读
标签: 电脑入门
Microsoft PowerPoint(以下简称ppt)是Office软件中一款强大的工具,图文音像并茂的特性让它成为办公教学的首选工具,而它强大的演示功能又使它成为开会、演讲、上课的主要道具。一般情况下,我们都是在全屏模式下播放PPT文件,但很多场合下你可能需要展示ppt文件之外的许多辅助文件来配合ppt达到更好的效果。这时我们选择的操作往往是按ESC退出...
    从微软的站点看到一个简单的方法实现,不必计算RECT,不必处理鼠标消息的细节和窗口绘制,就能轻松实现没有标题栏的窗口移动的问题,就是使用OnNcHitTest消息。 手工增加该消息映射: 用classwizard是无法增加该消息的,在BEGIN_MESSAGE_MAP中加入消息ON_WM_NCHITTEST(),然后在头文件中加入   afx_m...
一般情况下,移动一个窗体需要将鼠标放置在标题栏上才能拖动窗体,为 什么非要使用标题栏呢?其实我们可以使用一个巧妙的方法来实现将鼠标放置 在窗体上按下就可拖动窗体,下面先看实现代码。在Form1的“Private”部分声明过程: 在private部分加入下列代码: procedure wmnchittest(var msg:twmnchittest);message wm_nchittes...
如果你用 MFC 编写过多文档界面(MDI)Windows 程序,那么肯定知道:如果父窗口标题为PCaption,子窗口标题为CCaption,那么每当子窗口最大化并处于激活状态时,子窗口标题一般都会与父窗口标题合二为一,变成PCaption-[CCaption]。 这是一种 MDI 的默认行为。用 C# 编写多文档界面程序也不例外。很多用户都不喜欢这种缺省特性,往往想用定...
在VB中可以通过设置Form的属性,制作无系统标题栏的窗口。可是,由于失去了系统标题栏,如何使用鼠标拖动窗口便成了一个棘手的问题。其实,借助API函数ReleaseCapture和SendMessage,这个问题便可迎刃而解了。 首先,在module文件中加入下列声明语句: Declare Sub ReleaseCapture Lib"User"() Declare Func...