下面我们就讨论一下在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所示标题栏上出现一个新按钮

  通过以上的示例过程,相信你能根据自己的具体要求,利用Delphi设计出别具特色的Windows窗口来!

delphi编程实现为Windows窗口标题栏添加新按钮的更多相关文章

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

    为Windows窗口标题栏添加新按钮   对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮.你想不想在Windows的窗口标题栏上添加一个新的自 ...

  2. VMware下Windows Server 2012添加新磁盘

    系统管理员在VM下新装了一台Windows Server 2012服务器,我在上面安装了SQL Server 2014 Standard版数据库,安装之初,只分配了一个C盘,我想在这台服务器上添加了三 ...

  3. windows 7中添加新硬件的两种方法(本地回环网卡)

    最近在windows7上使用VMwareWorkstation7玩一些实验,遇到需要配置不同网络的问题. 因为在windows2003server上习惯使用要本地回环网卡了,那就想着在Windows7 ...

  4. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

  5. Windows窗口样式速查参考,Delphi窗口控件的风格都有它们来决定(附Delphi何时用到它们,并举例说明)good

    /* 窗口样式参考列表(都是GetWindowLong的GWL_STYLE风格,都是TCreateParams.Sytle的一部分),详细列表如下:https://msdn.microsoft.com ...

  6. 设置windows窗口ICON 【windows 编程】【API】【原创】

    1. ICON介绍 最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录.本文主要介绍了如何更改windows对话框窗口的ICON图标.这里首先介绍一下windows IC ...

  7. 在WPF控件上添加Windows窗口式调整大小行为

    起因 项目上需要对Canvas中的控件添加调整大小功能,即能在控件的四个角和四条边上可进行相应的拖动,类似Windows窗口那种.于是在参考以前同事写的代码基础上,完成了该功能. 代码实现 Adorn ...

  8. Delphi组件开发-在窗体标题栏添加按钮(使用MakeObjectInstance(NewWndProc),并处理好多消息)

    这是一个在窗体标题栏添加自定义按钮的组件(TTitleBarButton)开发实例,标题栏按钮组件TTitleBarButton以TComponent为直接继承对象,它是一个可以在窗体标题栏上显示按钮 ...

  9. (Delphi)第一个Windows 32 API的窗口程序

    program Project1; uses Winapi.Windows, Winapi.messages; {$R *.res} const className = 'MyDelphiWindow ...

随机推荐

  1. Employment Planning

    Employment Planning 有n个月,每个月有一个最小需要的工人数量\(a_i\),雇佣一个工人的费用为\(h\),开除一个工人的费用为\(f\),薪水为\(s\),询问满足这n个月正常工 ...

  2. set,get方法(属性,索引器)

    很多时候我们不可以把一些字段暴露出来允许别人调用和修改,为了隐藏这些字段又便于加限制的使用,在面向对象编程中一般采用写get set函数的办法,比如: //字段_age, "_"表 ...

  3. Android 为点击事件添加震动效果

    Android 点击Button 实现震动效果 学习自:网络 Overview 在Android 的点击效果中,遇到震动效果的还是很多的. 接下来就让我们看一下如何实现震动效果. 所需要的权限 如果我 ...

  4. 使用cordova network-information 插件监听手机网络状态

    在使用html5配合cordova做webapp时,有时需要实时监测手机的网络 状况.html5里面是没有相关的js的,这时就需要在cordova里找相关插件了. 一.插件查找 1.在cordova中 ...

  5. leetcode-164周赛-1269-停在原地的方案数

    题目描述: 自己的提交: class Solution: def numWays(self, steps: int, arrLen: int) -> int: l = min(steps,arr ...

  6. Windows version PE System Key

    { }

  7. jsp网站访问次数统计的几种方法

    我采用的是jsp网页,但是不管采用什么语言,原理是一样的. 第一种,单页面统计.就是说,只要点击这个页面就会统计一次. <body> <%!//在这种标记中定义的变量为全局变量 in ...

  8. Delphi GDI+ 安装方法

    [转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...

  9. 使用Nodejs 的http-proxy 模块做代理服务器的尝试

    参考 : https://blog.csdn.net/zhihuoqian9683/article/details/78944482  (亲测可行) http://www.mizuiren.com/4 ...

  10. 重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...