下面我们就讨论一下在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. Tmux 简单配置使用

    Tmux Prefix (prefix) Tmux 使用 Prefix 以将自身的快捷键与其它应用区分,运行 Tmux 快捷键时首先按下这个 Prefix (默认是 Ctrl-b 组合键),松手后紧接 ...

  2. CF687D Dividing Kingdom II

    \(\mathtt{CF 687D}\) \(\mathcal{Description}\) 给你一个图有 \(n\) 个点 \((1 \leq n \leq 10^3)\) 和 \(m\) 条边 \ ...

  3. Qt 【关于控件样式,鼠标进入、离开、点击】

    比如举以下这个例子: QPushButton * okBtn; okBtn->setstylesheet("QPushButton{border-image:url(:/image/h ...

  4. 【leetcode】966. Vowel Spellchecker

    题目如下: Given a wordlist, we want to implement a spellchecker that converts a query word into a correc ...

  5. Spring data JPA 快速入门

    1需求 ​ 向客户中插入一条数据 ​ 如果使用Jpa框架可以不用先建表 可以使用框架生成表 ​ 2 实现步骤 ​ a 创建工程 使用maven管理工程 <properties>       ...

  6. 阿里小程序Serverless 操作指南

    小程序云 小程序云(Mini Program Cloud)是阿里云面向小程序场景提供的一站式云服务,帮助开发者实现一云多端的业务战略,提供了有服务器和无服务器两种模式.云应用是有服务器模式,提供了包括 ...

  7. AcWing 286. 选课 (树形依赖分组背包)打卡

    有依赖的背包 首先依赖的概念,就是一个东西依附与一个东西之上,我们想买附品的话必须要把主品先买下来,这个可以先做下这道题 https://www.cnblogs.com/Lis-/p/11047466 ...

  8. 点击手机返回键弹出Dialog对话框功能

    在程序中,我们为了防止出现客户在使用程序填信息或者浏览页面时因误点返回键造成关闭界面的现象,需要添加弹出框功能,以确认客户是否要退出本界面,下面是功能实现的代码: 1.点击手机返回键的判断 publi ...

  9. 炼数成金数据分析课程---14、Logistic回归

    炼数成金数据分析课程---14.Logistic回归 一.总结 一句话总结: 大纲+实例快速学习法 主要讲Logistic回归的原理及编程实现 1.事件的优势比(odds)是什么? 记y取1的概率是p ...

  10. mail----java发送普通邮件

    package com.mail; import java.io.UnsupportedEncodingException; import java.util.Date; import java.ut ...