知识大全 为Windows窗口标题栏添加新按钮

Posted 过程

篇首语:不飞则已,一飞冲天;不鸣则已,一鸣惊人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 为Windows窗口标题栏添加新按钮相关的知识,希望对你有一定的参考价值。

为Windows窗口标题栏添加新按钮  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

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

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

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

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

  A 定义WMNCPaint(var Msg MNCPaint)过程 处理消息WM_NCPaint

  B 定义WMNCActivate(var Msg MNCActivate)过程 处理消息WM_NCACTIVATE

  C 定义WMSetText(var Msg MSetText)过程 处理消息WM_SETTEXT

  D 定义WMNCHitTest(var Msg MNCHitTest)过程 处理消息WM_NCHITTEST

  E 定义WMNCLButtonDown(var Msg : MNCLButtonDown)过程 处理消息WM_NCLBUTTONDOWN

  二 具体的源程序如下

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

 unit Main;  interface

 uses Windows Buttons Messages SysUtils Classes Graphics Controls Forms Dialogs;type TForm = class(TForm) procedure FormResize(Sender: TObject); private CaptionBtn : TRect; procedure DrawCaptButton; procedure WMNCPaint(var Msg : MNCPaint); message WM_NCPaint; procedure WMNCActivate(var Msg : MNCActivate); message WM_NCACTIVATE; procedure WMSetText(var Msg : MSetText); message WM_SETTEXT; procedure WMNCHitTest(var Msg : MNCHitTest); message WM_NCHITTEST; procedure WMNCLButtonDown(var Msg : MNCLButtonDown); message WM_NCLBUTTONDOWN; public   Public declarations    end;

 var  Form : TForm ;

  implementation

  const   htCaptionBtn = htSizeLast + ;   $R * DFM

  procedure TForm 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 *xSize +   yFrame + xSize ySize );  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 bsAutoDetect False False False);  file://在画布上画出定义的按钮

  R := Bounds(Width xFrame * xSize +   yFrame + xSize ySize );  file://在新按钮上画出一个小矩形  with CaptionBtn do  Canvas TextRect(R R Left + R Top W );  file://在上面画出的小矩形上填写一个字符 w 字符  finally  ReleaseDC(Self Handle Canvas Handle);  Canvas Handle := ;  file://容错处理 如果出现异常 把句柄释放掉  end;  end;

 procedure TForm WMNCPaint(var Msg : MNCPaint);  //WMNCPaint过程的具体实现 该过程在绘制窗口时被调用 begin  inherited;//继承默认的消息处理程序  DrawCaptButton;//对按钮进行重画 end;

 procedure TForm (var Msg : MNCActivate); // WMNCActivate过程与WMNCPaint过程实现方法相同 该过程在窗口的非客户区要更改为激活状态或非激活状态时被调用 begin  inherited;  DrawCaptButton; end;

 procedure TForm WMSetText(var Msg : MSetText); // WMSetText过程与WMNCPaint过程实现方法相同 该过程在设置窗口的文本时被调用 begin  inherited;  DrawCaptButton; end;

 procedure TForm WMNCHitTest(var Msg : MNCHitTest); file:// WMNCHitTest过程与WMNCPaint过程实现方法相同 该过程在光标移动或鼠标按钮被按下或鼠标按钮被释放时调用 begin  inherited;  with Msg do  if PtInRect(CaptionBtn Point(XPos Left YPos Top)) then   Result := htCaptionBtn;//判断鼠标所在位置是否在新按钮的矩形范围内 如果在返回新按钮的标识值  end;

 procedure TForm WMNCLButtonDown(var Msg : MNCLButtonDown);  // WMNCLButtonDown过程与WMNCPaint过程实现方法相同 当光标处于窗口非客户区范围内鼠标左键被按下时调用该过程 begin  inherited;  if (Msg HitTest = htCaptionBtn) then   ShowMessage( 你点击的是标题栏上的新按钮 );   file://判断被点击的是否是新按钮 如果是显示上面的信息 在这里你可以按你的需要编写程序代码  end; procedure TForm FormResize(Sender: TObject);  begin   Perform(WM_NCACTIVATE Word(Active) );    file://如果窗口大小改变则重画标题栏  end; end

  三 程序执行结果

  如图 所示标题栏上出现一个新按钮

cha138/Article/program/Delphi/201311/25072

相关参考

知识大全 21在windows xp系统中菜单命令后带有省略号,表示执行该命令后会出现( )A程序窗口B菜单栏C对话框D文档窗

21在windowsxp系统中菜单命令后带有省略号,表示执行该命令后会出现()A程序窗口B菜单栏C对话框D文档窗  以下文字资料是由(本站网www.cha138.com)

知识大全 js关闭模态窗口刷新父页面

  有两个窗口A窗口(父)B窗口(模态)  A窗口里有一个DATAGRID一个按钮  点击按钮时弹出B窗口(模态)在B窗口中添加数据提交后要求B窗口自关闭然后刷新A窗口(父)  <scriptt

知识大全 使用javaScript实现标题在标题栏移动

使用javaScript实现标题在标题栏移动  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &l

知识大全 用JavaScript创建“闪动”标题栏

用JavaScript创建“闪动”标题栏  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!不访给自己的

知识大全 C#中如何处理父窗口及其子窗口标题

C#中如何处理父窗口及其子窗口标题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果你用MFC

知识大全 利用C#实现任务栏通知窗口

利用C#实现任务栏通知窗口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作为程序员在享受的同时

知识大全 利用Delphi全面控制Windows任务栏[2]

利用Delphi全面控制Windows任务栏[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&

知识大全 利用Delphi全面控制Windows任务栏[1]

利用Delphi全面控制Windows任务栏[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&

知识大全 ie与session丢失(新窗口cookie丢失)实测及解决方案

正如标题所言测试结果为如果cookie设置是延后定时失效而非进程级的那在open后也能看到所以针对此情况防止用户在使用ie内核出现登录状态丢失可以配合cookie来使用   今天在一个群中有

知识大全 国外机械图纸标题栏表示是SIZE A里面的标注尺寸是什么单位呀

国外机械图纸标题栏表示是SIZEA里面的标注尺寸是什么单位呀  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看