熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

為Windows窗口標題欄添加新按鈕

2013-11-23 17:46:54  來源: Delphi編程 

  對於我們熟悉的標准windows窗口來講標題欄上一般包含有個按鈕即最大化按鈕最小化按鈕和關閉按鈕你想不想在Windows的窗口標題欄上添加一個新的自定義按鈕滿足你的個性化需求從而也使自己的窗口更具特色呢?

  下面我們就討論一下在delphi中如何給窗口的標題欄上添加新的按鈕

  實現起來要定義以下過程

   定義DrawCaptButton過程這個過程的功能是在指定的位置畫出按鈕

  在過程中要使用win函數GetSystemMetrics得到窗口的大小和標題按鈕的大小使用delphi函數Bounds定義一個矩形這個矩形就是新按鈕的位置再定義一個小的矩形這個矩形是為了填寫文本最後就調用delphi中比較有用的函數drawbuttonface把按鈕畫出來

   每次我們對窗口進行操作例如最大化操作或最小化操作新按鈕就會消失為了解決這個問題我們對所有的消息要進行處理給每個消息編寫一個過程對按鈕進行重畫

  A定義WMNCPaint(var MsgTWMNCPaint)過程處理消息WM_NCPaint

  B定義WMNCActivate(var Msg TWMNCActivate)過程處理消息WM_NCACTIVATE

  C定義WMSetText(var MsgTWMSetText)過程處理消息WM_SETTEXT

  D定義WMNCHitTest(var Msg TWMNCHitTest)過程處理消息WM_NCHITTEST

  E定義WMNCLButtonDown(var Msg : TWMNCLButtonDown)過程處理消息WM_NCLBUTTONDOWN

  二 具體的源程序如下

  我們結合源程序來講述過程的實現從中可以看出程序對win函數的調用以及drawbuttonface函數的使用方法

 unit Main;
 interface

 uses
 Windows Buttons Messages SysUtils Classes Graphics Controls Forms Dialogs;
type
 TForm = 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
  Form: TForm;

  implementation

  const
   htCaptionBtn = htSizeLast + ;
   {$R *DFM}

  procedure TFormDrawCaptButton;
  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 *xSize +
  yFrame + xSize ySize );
  file://定義出新的標題按鈕的位置值放在變量CaptionBtn中
  CanvasHandle := GetWindowDC(SelfHandle);
  file://得到窗口的句柄
  CanvasFontName := Symbol;
  CanvasFontColor := clBlue;
  CanvasFontStyle := [fsBold];
  CanvasPenColor := clYellow;
  CanvasBrushColor := clBtnFace;
  file://定義畫布的字體畫筆刷子等屬性
 try
  DrawButtonFace(Canvas CaptionBtn bsAutoDetect False False False);
  file://在畫布上畫出定義的按鈕

  R := Bounds(Width xFrame * xSize +
  yFrame + xSize ySize );
  file://在新按鈕上畫出一個小矩形
  with CaptionBtn do
  CanvasTextRect(R RLeft + RTop W);
  file://在上面畫出的小矩形上填寫一個字符w字符
  finally
  ReleaseDC(SelfHandle CanvasHandle);
  CanvasHandle := ;
  file://容錯處理如果出現異常把句柄釋放掉
  end;
  end;

 procedure TFormWMNCPaint(var Msg : TWMNCPaint);
  //WMNCPaint過程的具體實現該過程在繪制窗口時被調用
 begin
  inherited;//繼承默認的消息處理程序
  DrawCaptButton;//對按鈕進行重畫
 end;

 procedure TForm (var Msg : TWMNCActivate);
 // WMNCActivate過程與WMNCPaint過程實現方法相同該過程在窗口的非客戶區要更改為激活狀態或非激活狀態時被調用
 begin
  inherited;
  DrawCaptButton;
 end;

 procedure TFormWMSetText(var Msg : TWMSetText);
 // WMSetText過程與WMNCPaint過程實現方法相同該過程在設置窗口的文本時被調用
 begin
  inherited;
  DrawCaptButton;
 end;

 procedure TFormWMNCHitTest(var Msg : TWMNCHitTest);
 file:// WMNCHitTest過程與WMNCPaint過程實現方法相同該過程在光標移動或鼠標按鈕被按下或鼠標按鈕被釋放時調用
 begin
  inherited;
  with Msg do
  if PtInRect(CaptionBtn Point(XPos Left YPos Top)) then
   Result := htCaptionBtn;//判斷鼠標所在位置是否在新按鈕的矩形范圍內如果在返回新按鈕的標識值
  end;

 procedure TFormWMNCLButtonDown(var Msg : TWMNCLButtonDown);
  // WMNCLButtonDown過程與WMNCPaint過程實現方法相同當光標處於窗口非客戶區范圍內鼠標左鍵被按下時調用該過程
 begin
  inherited;
  if (MsgHitTest = htCaptionBtn) then
   ShowMessage(你點擊的是標題欄上的新按鈕);
   file://判斷被點擊的是否是新按鈕如果是顯示上面的信息在這裡你可以按你的需要編寫程序代碼
  end;
 procedure TFormFormResize(Sender: TObject);
  begin
   Perform(WM_NCACTIVATE Word(Active) );
   file://如果窗口大小改變則重畫標題欄
  end;
 end

   程序執行結果

  如圖所示標題欄上出現一個新按鈕


  通過以上的示例過程相信你能根據自己的具體要求利用Delphi設計出別具特色的Windows窗口來!


From:http://tw.wingwit.com/Article/program/Delphi/201311/25072.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.