Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16496110
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:48:48

下载本文示例代码
  对于我们熟悉的标准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.  三、 程序执行结果  如图1-1所示标题栏上出现一个新按钮                      图1-1  通过以上的示例过程,相信你能根据自己的具体要求,利用Delphi设计出别具特色的Windows窗口来!   对于我们熟悉的标准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.  三、 程序执行结果  如图1-1所示标题栏上出现一个新按钮                      图1-1  通过以上的示例过程,相信你能根据自己的具体要求,利用Delphi设计出别具特色的Windows窗口来! 下载本文示例代码


为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮为Windows窗口标题栏添加新按钮
阅读(276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~