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

如何關閉某一元件的所有滑鼠動作

尚未結案
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-05 15:16:34 IP:210.208.xxx.xxx 未訂閱
在一個 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
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-05 17:04:13 IP:211.23.xxx.xxx 未訂閱
試試再攔WM_MOUSEDOWN, WM_MOUSEUP 至於要看不到滑鼠游標... 在
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-06 08:40:58 IP:210.208.xxx.xxx 未訂閱
目前測試結果 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
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-06 09:11:42 IP:218.170.xxx.xxx 未訂閱
用 ShowCursor(false); 可以隱藏游標,但是要判斷何時隱藏何時顯示,想要光在 StringGrid 處理可能有些困難,小弟以前遇到類似的問題都在他的父物件用 ChildWindowFormPoint 來取得目前滑鼠所在的子物件資訊然後做相關的處理,希望對您有些幫助 ...
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-06 09:55:23 IP:218.16.xxx.xxx 未訂閱
引言: 滑鼠移動的 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-06 10:45:20 IP:211.23.xxx.xxx 未訂閱
To bruce0211:    看來關掉滑鼠的操作, 你快完成了...    不過我想你寫的程式應該不是只有自己在用... 所以建議不要去作關閉滑鼠游標的動作...    免得有User說: 完了, 我的滑鼠被吃掉了 ^^~    多作多錯, 少作少錯, 不作就~~~~
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-06 14:25:53 IP:210.208.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-06 14:44:40 IP:210.208.xxx.xxx 未訂閱
引言: 用 ShowCursor(false); 可以隱藏游標,但是要判斷何時隱藏何時顯示,想要光在 StringGrid 處理可能有些困難,小弟以前遇到類似的問題都在他的父物件用 ChildWindowFormPoint 來取得目前滑鼠所在的子物件資訊然後做相關的處理,希望對您有些幫助 ... < face="Verdana, Arial, Helvetica"> 謝謝 China Join 長官的回應 , 但我前面說過 ....不想將打開 cursor 的程式碼寫在別的 VCL 中(如主Form)... 我想將無滑鼠控制的動作模組化,甚至獨立寫成另一個元件 (TNoMouseStringGrid) , 所以希望所有控制碼都在 StringGrid 中解決掉
China Join
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-06 17:12:24 IP:218.170.xxx.xxx 未訂閱
報告 bruce0211 前輩關於這個類似問題之前有討論過 ...    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27555    可是小弟執行起來還有些問題,而且如    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31817    所發表的問題,滑鼠偵測上也需要改進,如果您解決了這個問題 的話能將程式碼分享上來嗎?,小弟對這個問題也很有興趣ㄋ< > 謝謝! < >
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-07 09:07:44 IP:211.76.xxx.xxx 未訂閱
To bruce0211:    關掉的Mouse動作, 我還有個小方法給點建議    裝上Spy++, 然後你就可以看到Mouse所有相關的事件(如WM_MOUSEMOVE, WM_NCHITTEST, ....)    然後就可以徹底把它給關了, 乖乖的聽你的話作事 讓控制程式行為如同
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-08 08:46:34 IP:210.208.xxx.xxx 未訂閱
謝謝 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
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-08 09:00:10 IP:61.221.xxx.xxx 未訂閱
可是滑鼠移動太快會抓不到進入和離開的事件 
系統時間:2024-04-24 2:21:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!