如何關閉某一元件的所有滑鼠動作 |
尚未結案
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
在一個 Form 上有一個 StringGrid 和其它元件
但我需要在 StringGrid 上關閉所有的滑鼠操作(包含看不到滑鼠游標,也不能用滑鼠 Click),但鍵盤要能動作(所以不能用 StringGrid->Enabled=false)
還有除了 StringGrid 外 , Form 上的其他元件都能正常使用滑鼠
請問該如何做
我寫了一個測試程式想攔掉 StringGrid 上的所有滑鼠訊息,但無效果...
//--------------------------------------------------------------------------- #include |
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
目前測試結果
1.攔截 WM_NCHITTEST 訊息可以攔掉所有滑鼠按鍵動作,除基本左鍵外還包含滑鼠右鍵跟 double click
2.上下左右鍵在事件攔截中並不確實(在Grid瀏覽模式可攔,但編輯模式中無法攔),所以還是放在 OnKeyDown 中攔掉(瀏覽+編輯模式都可攔掉)
3.滑鼠移動的 cursor 無法以事件關閉, 雖然可以用其它偷吃步方法,但無法抓到滑鼠移出 Grid 時再打開滑鼠 cursor 的時機,更不想將打開 cursor 的程式碼寫在別的 VCL 中(如主Form)
4.Windows 上仍有很多應用系統需要無滑鼠(或部分無滑鼠)操作,如某些工業控制或某些 MIS 系統;甚至可以這麼說,熟悉鍵盤操作比使用滑鼠能更快的建立大量資料輸入,所以才有這方面研究
//--------------------------------------------------------------------------- #include |
China Join
中階會員 發表:81 回覆:242 積分:89 註冊:2003-03-12 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 滑鼠移動的 cursor 無法以事件關閉, 雖然可以用其它偷吃步方法,但無法抓到滑鼠移出 Grid 時再打開滑鼠 cursor 的時機,更不想將打開 cursor 的程式碼寫在別的 VCL 中(如主Form)應可以攔截 CM_MOUSEENTER, CM_MOUSELEAVE 來達到的。我在 Delphi 作承繼及加入 Message 攔截是可以做到的。以下post 上在 Delphi 的碼作參考。 type TSC = Class(TStringGrid) private procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE; end; procedure TSC.CMMouseEnter(var Msg: TMessage); begin ShowCursor(false); end; procedure TSC.CMMouseLeave(var Msg: TMessage); begin ShowCursor(true); end; procedure TForm1.FormCreate(Sender: TObject); begin SC := TSC.Create(Self); SC.Parent := Self; end; |
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
1.謝謝 Justmade 長官的資料 , 我會再測試並將完整的無滑鼠控制方法整理出來
2.也謝謝 lcsboy 長官的回應 , 事實上無滑鼠操作並非我的意願 , 而是客戶的要求 , 由於行業別的不同 , 客戶是擁有上千家分店的流通業 , 滑鼠操作除了之前所述"熟悉鍵盤操作比使用滑鼠能更快的建立大量資料輸入"外 , 龐大的 END USER 教育訓練更是他們所 care 的 , 將作業平台由 UNIX 或 DOS 換到 Windows 上而不用重新教育訓練 END USER 熟悉新介面, 是很龐大的開銷節省 , 況且機械式的單據 Keyin 使用鍵盤操作是真的比較方便(滑鼠反而會影響資料欄位先後輸入的順序) 發表人 - bruce0211 於 2003/06/06 14:33:33
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
引言: 用 ShowCursor(false); 可以隱藏游標,但是要判斷何時隱藏何時顯示,想要光在 StringGrid 處理可能有些困難,小弟以前遇到類似的問題都在他的父物件用 ChildWindowFormPoint 來取得目前滑鼠所在的子物件資訊然後做相關的處理,希望對您有些幫助 ... >>< face="Verdana, Arial, Helvetica"> 謝謝 China Join 長官的回應 , 但我前面說過 ....不想將打開 cursor 的程式碼寫在別的 VCL 中(如主Form)... 我想將無滑鼠控制的動作模組化,甚至獨立寫成另一個元件 (TNoMouseStringGrid) , 所以希望所有控制碼都在 StringGrid 中解決掉 |
China Join
中階會員 發表:81 回覆:242 積分:89 註冊:2003-03-12 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
謝謝 lcsboy 長官 , 目前進度如下,已可隱藏 StringGrid 滑鼠游標了(根據 Justmade 長官資料攔截 CM_MOUSEENTER, CM_MOUSELEAVE 訊息),而攔截上下左右鍵還是得用 OnKeyDown ...
//--------------------------------------------------------------------------- #include |
China Join
中階會員 發表:81 回覆:242 積分:89 註冊:2003-03-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |