分享
 
 
 

为Windows窗口标题栏添加新按钮

王朝system·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮。你想不想在Windows的窗口标题栏上添加一个新的自定义按钮,满足你的个性化需求,从而也使自己的窗口更具特色呢?!

下面我们就讨论一下在Delphi中如何给窗口的标题栏上添加新的按钮。

一、实现起来要定义以下过程:

1、 定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮。

在过程中要使用win32函数GetSystemMetrics得到窗口的大小和标题按钮的大小;使用delphi函数Bounds定义一个矩形,这个矩形就是新按钮的位置;再定义一个小的矩形,这个矩形是为了填写文本;最后就调用delphi中比较有用的函数drawbuttonface把按钮画出来。

2、 每次我们对窗口进行操作,例如,最大化操作或最小化操作,新按钮就会消失,为了解决这个问题,我们对所有的消息要进行处理,给每个消息编写一个过程对按钮进行重画。

A、定义WMNCPaint(var Msg:TWMNCPaint)过程,处理消息WM_NCPaint。

B、定义WMNCActivate(var Msg :TWMNCActivate)过程,处理消息WM_NCACTIVATE。

C、定义WMSetText(var Msg:TWMSetText)过程,处理消息WM_SETTEXT。

D、定义WMNCHitTest(var Msg :TWMNCHitTest)过程,处理消息WM_NCHITTEST。

E、定义WMNCLButtonDown(var Msg : TWMNCLButtonDown)过程,处理消息WM_NCLBUTTONDOWN。

二、 具体的源程序如下:

我们结合源程序来讲述过程的实现,从中可以看出程序对win32函数的调用,以及drawbuttonface函数的使用方法。

unit Main;

interface

uses

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

type

TForm1 = class(TForm)

procedure FormResize(Sender: TObject);

private

CaptionBTn : TRect;

procedure DrawCaptButton;

procedure 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;

file://drawcapbuttton过程的具体实现

var

xFrame,

yFrame,

xSize,

ySize : Integer;

R : TRect;

begin

xFrame := GetSystemMetrics(SM_CXFRAME);

yFrame := GetSystemMetrics(SM_CYFRAME);

file://把窗口的宽度置于变量xFrame,把窗口的高度置于变量yFrame

xSize:= GetSystemMetrics(SM_CXSIZE);

ySize:= GetSystemMetrics(SM_CYSIZE);

// 把标题栏按钮的宽度置于变量xSize,把标题栏按钮的高度置于变量ySize

CaptionBtn := Bounds(Width - xFrame - 4*xSize + 2,

yFrame + 2, xSize - 2, ySize - 4);

file://定义出新的标题按钮的位置,值放在变量CaptionBtn中

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

file://得到窗口的句柄

Canvas.Font.Name := 'Symbol';

Canvas.Font.Color := clBlue;

Canvas.Font.Style := [fsBold];

Canvas.Pen.Color := clYellow;

Canvas.Brush.Color := clBtnFace;

file://定义画布的字体、画笔、刷子等属性

try

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

file://在画布上画出定义的按钮

R := Bounds(Width - xFrame - 4 * xSize + 2,

yFrame + 3, xSize - 6, ySize - 7);

file://在新按钮上画出一个小矩形

with CaptionBtn do

Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W');

file://在上面画出的小矩形上填写一个字符'w'字符

finally

ReleaseDC(Self.Handle, Canvas.Handle);

Canvas.Handle := 0;

file://容错处理,假如出现异常,把句柄释放掉

end;

end;

procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);

//WMNCPaint过程的具体实现,该过程在绘制窗口时被调用

begin

inherited;//继续默认的消息处理程序

DrawCaptButton;//对按钮进行重画

end;

procedure TForm1. (var Msg : TWMNCActivate);

// WMNCActivate过程与WMNCPaint过程实现方法相同,该过程在窗口的非客户区要更改为激活状态或非激活状态时被调用

begin

inherited;

DrawCaptButton;

end;

procedure TForm1.WMSetText(var Msg : TWMSetText);

// WMSetText过程与WMNCPaint过程实现方法相同,该过程在设置窗口的文本时被调用

begin

inherited;

DrawCaptButton;

end;

procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);

file:// WMNCHitTest过程与WMNCPaint过程实现方法相同,该过程在光标移动或鼠标按钮被按下或鼠标按钮被释放时调用

begin

inherited;

with Msg do

if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then

Result := htCaptionBtn;//判定鼠标所在位置是否在新按钮的矩形范围内,假如在返回新按钮的标识值

end;

procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);

// WMNCLButtonDown过程与WMNCPaint过程实现方法相同,当光标处于窗口非客户区范围内鼠标左键被按下时调用该过程

begin

inherited;

if (Msg.HitTest = htCaptionBtn) then

ShowMessage('你点击的是标题栏上的新按钮');

file://判定被点击的是否是新按钮,假如是显示上面的信息,在这里你可以按你的需要编写程序代码

end;

procedure TForm1.FormResize(Sender: TObject);

begin

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

file://假如窗口大小改变则重画标题栏

end;

end.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有