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

yayueqian44

yayueqian44

2016-02-19 12:41

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的为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.
  
  
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
为Windows窗口标题栏添加新按钮

移动无标题栏窗口

编程语言 网络编程
移动无标题栏窗口

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

拖动无系统标题栏的窗口

编程语言 网络编程
拖动无系统标题栏的窗口

闪动标题栏

Delphi
闪动标题栏

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

再谈“无标题栏窗口的移动技巧”

编程语言 网络编程
再谈“无标题栏窗口的移动技巧”

给Windows XP标题栏瘦瘦身

windows 操作系统
给Windows XP标题栏瘦瘦身

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

TC 中的汉字技术

TC 中的汉字技术

程序中传递密码给数据库文件

程序中传递密码给数据库文件
下拉加载更多内容 ↓