如何讓滑鼠移動起來一格一格的 |
答題得分者是:RaynorPao
|
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請問一下各位先進,有沒有可能在form或image上讓滑鼠移動起來一格一格的(像是限制滑鼠移動的間距)呢?例如5個像素。因為我想讓使用者畫線與畫圓能夠準一些,所以假如有移動的限制的話(一格一格的),就能比較容易畫出直線來。謝謝!marky1 你好: 理論上是可以做得到的,請參考以下的做法 < class="code"> void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int iInterval=5; POINT pt; GetCursorPos(&pt); pt.x=(pt.x/iInterval)*iInterval; pt.y=(pt.y/iInterval)*iInterval; SetCursorPos(pt.x, pt.y); } 可是,恕小弟我直言,總覺得這樣怪怪的?? > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
首先感謝RaynorPao與JerryKuo兩位先進熱心地答覆,謝謝!
小弟將RaynorPao的方法加入我的程式中,如下所示:
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int iInterval = 5; POINT pt; GetCursorPos(&pt); pt.x = (int)(pt.x/iInterval 0.5) * iInterval; pt.y = (int)(pt.y/iInterval 0.5) * iInterval; SetCursorPos(pt.x, pt.y); if( X>=0 && X結果滑鼠的座標數據幾乎無法在StatusBar1顯示出來, 小弟覺得好像是「SetCursorPos(pt.x, pt.y);」這一行指令佔很多CPU資源 小弟也不太確定為什麼會這樣 所以要再請教一下RaynorPao您了 也歡迎其他先進一起討論 謝謝! |
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
|
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 首先感謝RaynorPao與JerryKuo兩位先進熱心地答覆,謝謝! 小弟將RaynorPao的方法加入我的程式中,如下所示:void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int iInterval = 5; POINT pt; GetCursorPos(&pt); pt.x = (int)(pt.x/iInterval 0.5) * iInterval; pt.y = (int)(pt.y/iInterval 0.5) * iInterval; SetCursorPos(pt.x, pt.y); if( X>=0 && X結果滑鼠的座標數據幾乎無法在StatusBar1顯示出來, 小弟覺得好像是「SetCursorPos(pt.x, pt.y);」這一行指令佔很多CPU資源 小弟也不太確定為什麼會這樣 所以要再請教一下RaynorPao您了 也歡迎其他先進一起討論 謝謝! marky1 你好: (1)嗯~~我也發現了會很耗系統資源的問題,不過,這個可能無解,因為那是 Win32 API 造成的,改成這樣看會不會好一點呢?? void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int iInterval=5; POINT pt; GetCursorPos(&pt); int iXR=pt.x%iInterval; int iYR=pt.y%iInterval; if(iXR!=0 || iYR!=0) { int iXQ=pt.x/iInterval; int iYQ=pt.y/iInterval; pt.x=iXR>iInterval/2? (iXQ 1)*iInterval: iXQ*iInterval; pt.y=iYR>iInterval/2? (iYQ 1)*iInterval: iYQ*iInterval; // Memo1->Lines->Add(IntToStr(pt.x) "_" IntToStr(pt.y)); SetCursorPos(pt.x, pt.y); } } (2)是有辦法顯示 Cursor 的位置數據的,因為我一開始的程式碼就有把 Cursor 的位置顯示在 Memo1 裡面,可以正常顯示的 Memo1->Lines->Add(IntToStr(pt.x) "_" IntToStr(pt.y)); (3)建議你 check 自己寫的判斷式看看 > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
感謝RaynorPao您的不吝協助,小弟的問題已圓滿解決,謝謝!
由於小弟需要滑鼠在Form上移動一格一格的,如10,15,20...
所以將程式改寫為如下;若有先進感到不妥,歡迎一起討論。
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( X>=0 && X |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |