程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 如何使用Delphi實現無邊界窗體的移動

如何使用Delphi實現無邊界窗體的移動

編輯:Delphi

  在用Delphi制作Windows程序的窗體時,窗體的邊界有四種選擇:對話框式(bsDialog),單邊固定式(bsSingle),雙邊可變式(bsSizeable),無邊界式(bsNone)。當設置為bsNone時,窗體也就沒有標題條,很顯然,程序運行以後就無法移動窗體了。事實上,無邊界窗體是很有用的,例如,象Word裡面的浮動式工具箱其實就是無邊界窗體,它可以大大節約屏幕空間。那麼,如何用Delphi實現這個功能呢?顯然,這需要修改Windows的內部消息,也就是說,需要把“MouseDownonForm”這個消息改為“MouseDownonCaption”,這其中有三個關鍵: 捕捉MouseDown消息、判斷光標位置、發送MouseDown消息。如果光標在窗體中,則發送MouseDownonCaption消息。

  在Delphi的對象巡檢器中列出的所有事件是不能捕捉到Windows消息的,因為這些都是已經發出的消息,無法修改了。捕捉Windows消息有兩種辦法:一個就是增加一個消息處理句柄,直接處理Windows消息;另一個是對消息進行過濾,濾出所需消息。第二個辦法比較常用,適用於各種情況,下面就是移動無邊界窗體程序片斷,加注釋部分是手動加入的:

  unitUnit1;
  :
  type
  TForm1Κclass(TForm)
  procedureFormCreate(Sender:TObject);
  :
  public
  {申明消息過濾過程}
  procedureAppMessage(varMsg:TMsg;varHandled
:Boolean);
  :
  implementation
  procedureTForm1.FormCreate(Sender:TObject)

  begin
  {捕捉消息:將程序的收到消息事件與消息過濾過程
關聯起來}
  Application.OnMessage:ΚAppMessage;
  end;
  procedureTForm1.AppMessage(varMsg:TMsg;var
Handled:Boolean);
  begin
  {如果鼠標左鍵按下的話}
  ifMsg.messageΚWM—LButtonDownthen
  begin
  {判斷光標是否在用戶工作區內}
  ifDefWindowProc(Handle,WM—NCHitTest,0,Get
MessagePos)ΚHTClIEntthen
  begin
  {發出鼠標在用戶標題欄內被按下的消息}
  SendMessage(Handle,WM—NCLButtonDown,
  HTCaption,GetMessagePos);
  Handled:Κtrue;{消息處理完畢,窗體不再接受M
ouseDown及Click事件,如果為false,程序的運行稍微有
些不正常。}
  end;
  end;
  end;
  

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