当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

为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://定义画布的字体、画笔、刷子等属性
 

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接