bruce0211
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:157 回覆:668 積分:279 註冊:2002-06-13
發送簡訊給我
|
在一個 Form 上有一個 StringGrid 和其它元件
但我需要在 StringGrid 上關閉所有的滑鼠操作(包含看不到滑鼠游標,也不能用滑鼠 Click),但鍵盤要能動作(所以不能用 StringGrid->Enabled=false)
還有除了 StringGrid 外 , Form 上的其他元件都能正常使用滑鼠
請問該如何做
我寫了一個測試程式想攔掉 StringGrid 上的所有滑鼠訊息,但無效果...
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TWndMethod StringGrid_WindowProc;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
StringGrid_WindowProc=StringGrid1->WindowProc; StringGrid1->WindowProc=MyWindowProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyWindowProc(TMessage &Message)
{ if (Message.Msg==WM_MOUSEMOVE) //WM_NCLBUTTONDOWN
{
return;
} // 呼叫-原始訊息處理程序
StringGrid_WindowProc(Message);
}
//---------------------------------------------------------------------------
|
lcsboy
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:87 回覆:622 積分:394 註冊:2002-06-18
發送簡訊給我
|
試試再攔WM_MOUSEDOWN, WM_MOUSEUP ![]() 至於要看不到滑鼠游標...
在
|
bruce0211
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TWndMethod StringGrid_WindowProc;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
StringGrid_WindowProc=StringGrid1->WindowProc; StringGrid1->WindowProc=MyWindowProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyWindowProc(TMessage &Message)
{ if (Message.Msg==WM_NCHITTEST) //WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_NCLBUTTONDOWN
{
//ShowMessage(Message.WParam);
return;
} // 呼叫-原始訊息處理程序
StringGrid_WindowProc(Message); }
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key>=37 && Key<=40) Key=0;
}
//---------------------------------------------------------------------------
|
China Join
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:81 回覆:242 積分:89 註冊:2003-03-12
發送簡訊給我
|
用 ShowCursor(false); 可以隱藏游標,但是要判斷何時隱藏何時顯示,想要光在 StringGrid 處理可能有些困難,小弟以前遇到類似的問題都在他的父物件用 ChildWindowFormPoint 來取得目前滑鼠所在的子物件資訊然後做相關的處理,希望對您有些幫助 ...
|
Justmade
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:87 回覆:622 積分:394 註冊:2002-06-18
發送簡訊給我
|
To bruce0211: 看來關掉滑鼠的操作, 你快完成了... 不過我想你寫的程式應該不是只有自己在用...
所以建議不要去作關閉滑鼠游標的動作... 免得有User說: 完了, 我的滑鼠被吃掉了 ^^~ 多作多錯, 少作少錯, 不作就~~~~
|
bruce0211
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:157 回覆:668 積分:279 註冊:2002-06-13
發送簡訊給我
|
引言:
用 ShowCursor(false); 可以隱藏游標,但是要判斷何時隱藏何時顯示,想要光在 StringGrid 處理可能有些困難,小弟以前遇到類似的問題都在他的父物件用 ChildWindowFormPoint 來取得目前滑鼠所在的子物件資訊然後做相關的處理,希望對您有些幫助 ...
>>< face="Verdana, Arial, Helvetica">
謝謝 China Join 長官的回應 , 但我前面說過
....不想將打開 cursor 的程式碼寫在別的 VCL 中(如主Form)...
我想將無滑鼠控制的動作模組化,甚至獨立寫成另一個元件 (TNoMouseStringGrid) , 所以希望所有控制碼都在 StringGrid 中解決掉
|
China Join
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:81 回覆:242 積分:89 註冊:2003-03-12
發送簡訊給我
|
報告 bruce0211 前輩關於這個類似問題之前有討論過 ... http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27555 可是小弟執行起來還有些問題,而且如 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31817 所發表的問題,滑鼠偵測上也需要改進,如果您解決了這個問題
的話能將程式碼分享上來嗎?,小弟對這個問題也很有興趣ㄋ< >
謝謝! < >
|
lcsboy
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:87 回覆:622 積分:394 註冊:2002-06-18
發送簡訊給我
|
To bruce0211: 關掉的Mouse動作, 我還有個小方法給點建議 裝上Spy++, 然後你就可以看到Mouse所有相關的事件(如WM_MOUSEMOVE, WM_NCHITTEST, ....) 然後就可以徹底把它給關了, 乖乖的聽你的話作事 ![]() 讓控制程式行為如同
|
bruce0211
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:157 回覆:668 積分:279 註冊:2002-06-13
發送簡訊給我
|
謝謝 lcsboy 長官 , 目前進度如下,已可隱藏 StringGrid 滑鼠游標了(根據 Justmade 長官資料攔截 CM_MOUSEENTER, CM_MOUSELEAVE 訊息),而攔截上下左右鍵還是得用 OnKeyDown ...
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TWndMethod StringGrid_WindowProc;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
StringGrid_WindowProc=StringGrid1->WindowProc; StringGrid1->WindowProc=MyWindowProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyWindowProc(TMessage &Message)
{ //Memo1->Lines->Add(IntToStr(Message.Msg)); if (Message.Msg==WM_NCHITTEST) //WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_NCLBUTTONDOWN
{
//ShowMessage(Message.LParam);
//if (Message.WParam== SC_CLOSE)
//ShowMessage(Message.WParam);
return;
} /*
//WM_KEYDOWN 在 Grid 瀏覽模式可攔上下鍵,但在編輯模式中無法攔上下鍵
if (Message.Msg==WM_KEYDOWN) //WM_CHAR(可視字元) ,WM_KEYDOWN(不可視字元)
{
return;
}
*/ if (Message.Msg==CM_MOUSELEAVE) //滑鼠離開本元件時,打開系統游標
{
ShowCursor(true);
} if (Message.Msg==CM_MOUSEENTER) //滑鼠進入本元件時,關閉系統游標
{
ShowCursor(false);
}
// 呼叫-原始訊息處理程序
StringGrid_WindowProc(Message); }
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key>=37 && Key<=40) Key=0; //攔掉上下左右鍵
}
//---------------------------------------------------------------------------
|
China Join
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:81 回覆:242 積分:89 註冊:2003-03-12
發送簡訊給我
|
可是滑鼠移動太快會抓不到進入和離開的事件
|