热情软件屋

 

如何在窗体的标题栏中使用自定义的按扭


编号:QA001338
建立日期: 1999年7月13日 最后修改日期:2001年3月27日
所属类别:

Arivd:
    VisualBasic 6
    Windows98
    如何才能在窗体的标题栏中使用另外的按扭(我是说除了最小化、最大化、通常、关闭以外的按扭)?要求能单独控制(样式、状态)。就好象CorelDraw、PhotoShop的子窗体中的按扭。

回答:

    这要看你对Windows API熟悉的程度了,而且这个工作比较适合C++和Delphi实现,而不太适合VB。要实现,关键是响应两个消息WM_NCPaint、WM_NCLBUTTONDOWN。收到前者时,你绘制按钮。收到后者时,判断用户释放点在了你的按钮上。这里有一个VB的例子Caption_Buttons_Demo.zip,是从http://www.mvps.org/vbvision/grouped_demos.htm下载的。
    你可以在http://www.codeguru.com/dialog/custom_dialog_caption.shtml找到使用VC++实现的例子。
    下面是一个Delphi的例子,可供参考。在VB中扑捉消息,可以参考QA000634 "如何在VB中截取Windows消息"
    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;
    var
     xFrame,
     yFrame,
     xSize,
     ySize : Integer;
     R : TRect;
    begin
     //Dimensions of Sizeable Frame
     xFrame := GetSystemMetrics(SM_CXFRAME);
     yFrame := GetSystemMetrics(SM_CYFRAME);
    
     //Dimensions of Caption Buttons
     xSize := GetSystemMetrics(SM_CXSIZE);
     ySize := GetSystemMetrics(SM_CYSIZE);
    
     //Define the placement of the new caption button
     CaptionBtn := Bounds(Width - xFrame - 4*xSize + 2,
     yFrame + 2, xSize - 2, ySize - 4);
    
     //Get the handle to canvas using Form's device context
     Canvas.Handle := GetWindowDC(Self.Handle);
    
     Canvas.Font.Name := 'Symbol';
     Canvas.Font.Color := clBlue;
     Canvas.Font.Style := [fsBold];
     Canvas.Pen.Color := clYellow;
     Canvas.Brush.Color := clBtnFace;
    
     try
     DrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False);
     //Define a smaller drawing rectangle within the button
     R := Bounds(Width - xFrame - 4 * xSize + 2,
     yFrame + 3, xSize - 6, ySize - 7);
     with CaptionBtn do
     Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W');
     finally
     ReleaseDC(Self.Handle, Canvas.Handle);
     Canvas.Handle := 0;
     end;
    end;
    
    procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);
    begin
     inherited;
     DrawCaptButton;
    end;
    
    procedure TForm1.WMNCActivate(var Msg : TWMNCActivate);
    begin
     inherited;
     DrawCaptButton;
    end;
    
    procedure TForm1.WMSetText(var Msg : TWMSetText);
    begin
     inherited;
     DrawCaptButton;
    end;
    
    procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);
    begin
     inherited;
     with Msg do
     if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then
     Result := htCaptionBtn;
    end;
    
    procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
    begin
     inherited;
     if (Msg.HitTest = htCaptionBtn) then
     ShowMessage('You hit the button on the caption bar');
    end;
    
    procedure TForm1.FormResize(Sender: TObject);
    begin
     //Force a redraw of caption bar if form is resized
     Perform(WM_NCACTIVATE, Word(Active), 0);
    end;
    
    end.

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio