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

2016-02-19 12:41 89 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的为Windows窗口标题栏添加新按钮懂设计的网友们快点来了解吧!

【 tulaoshi.com - 编程语言 】


  对于我们熟悉的标准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.
  
  

来源:https://www.tulaoshi.com/n/20160219/1601526.html

延伸阅读
标签: windows10
Win10修改标题栏为颜色的方法技巧   如果你非常喜欢系统默认的黑色主题,同时还想让标题栏颜色不那么单调,那么可参考下面的方法来实现: 注意:该方法适用于Windows10 TH2系统,且需要修改系统注册表,为了确保安全,建议在操作前备份注册表。 1、首先你需要在设置个性化颜色中关闭显示开始菜单、任务栏、操作中心和标题栏...
标签: windows10
Win10窗口标题栏高度以及滚动条宽度   1、按Win+R打开运行,输入regedit回车打开注册表编辑器; 2、展开 HKEY_CURRENT_USERControl PanelDesktopWindowMetrics; 3、在右侧找到CaptionHeight字符串值,它代表窗口标题栏的高度,其值计算方法为:-15*期望高度(像素)。比如,希望窗口标题栏高度为18,那么其值应该为-15*18=-270...
标签: 电脑入门
QQ空间标题栏没有直接取消的功能。如果您不想显示默认的标题栏样式,建议您用QQ空间装扮进行装饰,同时我们提供了一款免费透明的标题栏给大家体验,详细操作如下: 第一步:请您登录到QQ空间,点击工具栏上的装扮; 第二步:点击装扮之后页面会出现装扮设置然后点击 标题栏设置,根据提示操作即可。
  1.添加引用:DBClient 2.置DBGridEh控件属性:   设置dghAutoSortMarking属性为true  设置希望排序的Column的TitleButton属性为true 3.//表格排序过程 procedure OrderGrid(dataSet:TClientDataset;orderField:string); var   i:integer; begin   if dataSet.IndexFieldNames'' then ...
很多人都在问怎么更改java应用程序标题栏默认图标,如果你用过Toolkit类,这将是一件很简单的事情: Toolkit tk=Toolkit.getDefaultToolkit() Image image=tk.createImage("image.gif"); /*image.gif是你的图标*/ this.setIconImage(image); 就这么简单,看看,已经变成你自己的图标了。Toolkit是个很有用类...

经验教程

41

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部