为Windows窗口标题栏添加新按钮
2008-04-09 04:18:35来源:互联网 阅读 ()
对于我们熟悉的标准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过程实现方法相同,该过程在光标移动或鼠标按钮被按下或鼠标按钮被释放时调用
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Delphi数据库编程技巧
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash