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

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

2013-11-23 17:29:47  來源: Delphi編程 

  在用Delphi制作Windows程序的窗體時窗體的邊界有四種選擇對話框式(bsDialog)單邊固定式(bsSingle)雙邊可變式(bsSizeable)無邊界式(bsNone)當設置為bsNone時窗體也就沒有標題條很顯然程序運行以後就無法移動窗體了事實上無邊界窗體是很有用的例如象Word裡面的浮動式工具箱其實就是無邊界窗體它可以大大節約屏幕空間那麼如何用Delphi實現這個功能呢?顯然這需要修改Windows的內部消息也就是說需要把MouseDownonForm這個消息改為MouseDownonCaption這其中有三個關鍵 捕捉MouseDown消息判斷光標位置發送MouseDown消息如果光標在窗體中則發送MouseDownonCaption消息
    在Delphi的對象巡檢器中列出的所有事件是不能捕捉到Windows消息的因為這些都是已經發出的消息無法修改了捕捉Windows消息有兩種辦法一個就是增加一個消息處理句柄直接處理Windows消息另一個是對消息進行過濾濾出所需消息第二個辦法比較常用適用於各種情況下面就是移動無邊界窗體程序片斷加注釋部分是手動加入的

  unitUnit

  

  type

  TFormΚclass(TForm)

  procedureFormCreate(SenderTObject)

  

  public

  {申明消息過濾過程}

  procedureAppMessage(varmsgTMsgvarHandled
Boolean)

  

  implementation

  procedureTForm.FormCreate(SenderTObject)

  begin

  {捕捉消息將程序的收到消息事件與消息過濾過程
關聯起來}

  Application.OnMessageΚAppMessage

  end

  procedureTForm.AppMessage(varmsgTMsgvar
HandledBoolean)

  begin

  {如果鼠標左鍵按下的話}

  ifMsg.messageΚWM—LButtonDownthen

  begin

  {判斷光標是否在用戶工作區內}

  ifDefWindowProc(HandleWM—NCHitTestGet
MessagePos)ΚHTClientthen

  begin

  {發出鼠標在用戶標題欄內被按下的消息}

  SendMessage(HandleWM—NCLButtonDown

  HTCaptionGetMessagePos)

  HandledΚtrue{消息處理完畢窗體不再接受M
ouseDown及Click事件如果為false程序的運行稍微有
些不正常

  end

  end

  end


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