程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi技巧——移動無標題窗口

delphi技巧——移動無標題窗口

編輯:Delphi

 

delphi技巧——移動無標題窗口

關鍵詞:移動,消息,無標題

                      作者:朱能文

   我們都知道windows是通過標題欄來移動窗體的,當我們在標題欄上按下鼠標左鍵時,windows將發送wM_NCHitTest消息,來告訴系統要移動窗體。但我們在實際編程時,有時為了界面的需要或特殊的要求,窗體沒有標題欄,我們必須通過程序來移動窗體。下面我將介紹幾種移動窗體的方法和技巧。

   方法一:根據鼠標按下和移動時的位置差,來計算窗體的位置。需要定義的變量如下:

  var

   Opos, Cpos: Tpoint; 

   Flag: boolean = false;

   處理OnMouseDown事件代碼:

   Flag := true;

   Opos.X := X;

   Opos.Y := Y;

   處理OnMouseMove事件代碼:

   if Flag then

    begin

        Cpos.X := X;

        Cpos.y := Y;

        Left := Left + Cpos.X - Opos.X;

        Top := Top + Cpos.Y - Opos.Y;

    end;

   處理OnMouseMove事件代碼:

   Flag := false;

   方法二:用戶自定義消息,攔截“wM_NCHitTest”消息,將消息值“htclient”轉為“htcaption”。實現如下:

   先定義一消息常量:const WM_MyTest = WM_User+200;

   在private部分聲明過程:

   procedure MoveClient(var message: Tmessage);  message wM_NCHitTest;

   過程的實現:

     inHerited;//繼承,窗體可以繼續處理以後的事件

     if Message.Result=htclient then

      Message.Result := htcaption;

    方法三:直接向窗體發送一條“wm_SysCommand”消息,需要使用未歸檔的“sc_DragMove”標志,定義如下:

   const sc_DragMove = $f012;

   我們只能向TWinControl派生組件發送該消息,而且只能響應鼠標按下事件,因為系統會在此時捕獲鼠標(當釋放鼠標鍵時,拖動操作是沒有意義的)。在窗體的OnMouseDown事件處理代碼:

   ReleaseCapture; //釋放鼠標的捕獲狀態;

   (Sender as TWinControl).PerForm(wm_SysCommand,sc_DragMove,0);//向窗體發送移動消息;

   上面我提供了三種移動無標題欄窗體的方法,方法一比較容易理解,且不需要理解windows消息處理機制,但此方法需要對窗體的鼠標事件處理太多,顯得不夠簡潔。方法二通過消息轉換,這種方法比較容易實現,但有一個缺點,窗體將不再響應鼠標其他消息,如果窗體上有鼠標右鍵處理,那麼右鍵將得不到響應。方法三是最好的一種方法,通過定義sc_DragMove消息,注意sc_DragMove的值必須是$f012或$f011,通過PerForm方法發送sc_DragMove消息,這種方法窗體還可以處理其他鼠標事件,而不象方法二,所以我建議大家可以用方法三來移動無標題的窗體比較好。(以上幾種方法我都在delphi6.0+windows2k上通過)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved