線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1465
推到 Plurk!
推到 Facebook!

MDIChild的移動問題

答題得分者是:herbert2
lin11112
初階會員


發表:42
回覆:83
積分:25
註冊:2003-02-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-10 10:13:09 IP:218.210.xxx.xxx 訂閱
請問各位先進:
要如何才能禁止MDIChild在normal的大小狀態時
讓滑鼠無法移動其位置
謝謝
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-10 11:49:42 IP:211.72.xxx.xxx 訂閱
試用 Form OnPaint() 時, 若 Normal 便將 Left, Top 設到指定值.

===================引 用 lin11112 文 章===================
要如何才能禁止MDIChild在normal的大小狀態時
讓滑鼠無法移動其位置
lin11112
初階會員


發表:42
回覆:83
積分:25
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-10 15:26:00 IP:218.210.xxx.xxx 訂閱
若MDIChild中有滑鼠拖曳繪圖的動作
用此方式滑鼠仍可移動MDIChild
且移動完後如果滑鼠或鍵盤沒有其他事件觸發
則MDIChild便無法重繪到指定的位置
是否有方式可以讓其重繪到指定的位置
===================引 用 herbert2 文 章===================
試用 Form OnPaint() 時, 若 Normal 便將 Left, Top 設到指定值.

herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-10 23:46:23 IP:211.72.xxx.xxx 訂閱
抱歉! 弄錯了. OnPaint 只是給被其他視窗遮住, 重新 Display 時用.

不知您的用途為何, MDIChild 通常一定會有 WS_Caption Bar, 因此一定能被拖拉,
且不會觸發 Form 的 Event.

若要不准被拖拉, 就不可以有 Window Caption Bar, 必須 BorderStyle = bsNone 或 bsDialog,
Top, Left 自行於 Constructer 指定.

且要寫個 private 的 CreateParams(TCreateParams &Params), 執行:
TForm::CreateParams(Params);
Params.Style &= ~WS_CAPTION;
(告訴 Windows API 要 Create 無 Caption Bar 的 Window)
另外也要寫個 private 的 DragXxx(TMessage &Msg), 執行:
if (GetAsyncKeyState(VK_LBUTTON) < 0)
Msg.Result = HTCAPTION;
else
Msg.Result = HTCLIENT;
(讓 Mouse 無法拖拉)
且須在 .h 檔 Private 段寫:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCHITTEST,TMessage,DragXxx)
END_MESSAGE_MAP(TForm)
(指定 Function DragXxx 給 Windows Message)

試看這是否合您需要!
lin11112
初階會員


發表:42
回覆:83
積分:25
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-12 10:56:05 IP:60.248.xxx.xxx 訂閱
用這個方法已可以達到Mouse無法移動
但為何連Form上的menu的會無法點選了呢


===================引 用 herbert2 文 章===================
抱歉! 弄錯了. OnPaint 只是給被其他視窗遮住, 重新 Display 時用.

不知您的用途為何, MDIChild 通常一定會有 WS_Caption Bar, 因此一定能被拖拉,
且不會觸發 Form 的 Event.

若要不准被拖拉, 就不可以有 Window Caption Bar, 必須 BorderStyle = bsNone 或 bsDialog,
Top, Left 自行於 Constructer 指定.

且要寫個 private 的 CreateParams(TCreateParams &Params), 執行:
TForm::CreateParams(Params);
Params.Style &= ~WS_CAPTION;
(告訴 Windows API 要 Create 無 Caption Bar 的 Window)
另外也要寫個 private 的 DragXxx(TMessage &Msg), 執行:
if (GetAsyncKeyState(VK_LBUTTON) < 0)
Msg.Result = HTCAPTION;
else
Msg.Result = HTCLIENT;
(讓 Mouse 無法拖拉)
且須在 .h 檔 Private 段寫:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCHITTEST,TMessage,DragXxx)
END_MESSAGE_MAP(TForm)
(指定 Function DragXxx 給 Windows Message)

試看這是否合您需要!
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-12 11:37:19 IP:211.72.xxx.xxx 訂閱
當初這寫法是為了不准 User 動, 若要操作, 請再查 Win API 相關內容,
以便修改 DragXxx(TMessage &Msg) 的程式.
基本上, MDIChild 是不宜不准 User 移動.
系統時間:2024-03-29 5:23:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!