全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1410
推到 Plurk!
推到 Facebook!

如何讓滑鼠移動起來一格一格的

答題得分者是:RaynorPao
marky1
一般會員


發表:17
回覆:29
積分:9
註冊:2003-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-21 01:42:14 IP:140.118.xxx.xxx 未訂閱
請問一下各位先進,有沒有可能在form或image上讓滑鼠移動起來一格一格的(像是限制滑鼠移動的間距)呢?例如5個像素。因為我想讓使用者畫線與畫圓能夠準一些,所以假如有移動的限制的話(一格一格的),就能比較容易畫出直線來。謝謝!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-21 09:24:24 IP:203.73.xxx.xxx 未訂閱
引言: 請問一下各位先進,有沒有可能在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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-21 09:41:33 IP:61.220.xxx.xxx 未訂閱
我認為可以在MouseMove Event取得mouse的(X',Y') 與初始的MouseDown的座標(X,Y)之間做一個filter 5((X'-X)/5)...
marky1
一般會員


發表:17
回覆:29
積分:9
註冊:2003-03-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-21 12:48:16 IP:140.118.xxx.xxx 未訂閱
首先感謝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=0 && YHeight)
  {
    char cor[50];
    wsprintf(cor,"X=%d, Y=%d)", X, Y);
    StatusBar1->Panels->Items[0]->Text = cor;
    ::SetCapture(Handle);
  }
  else
  {
    StatusBar1->Panels->Items[0]->Text = "";
    ::ReleaseCapture();
  }
}
結果滑鼠的座標數據幾乎無法在StatusBar1顯示出來, 小弟覺得好像是「SetCursorPos(pt.x, pt.y);」這一行指令佔很多CPU資源 小弟也不太確定為什麼會這樣 所以要再請教一下RaynorPao您了 也歡迎其他先進一起討論 謝謝!
marky1
一般會員


發表:17
回覆:29
積分:9
註冊:2003-03-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-21 12:53:00 IP:140.118.xxx.xxx 未訂閱
不好意思,這一行「if( X>=0 && X      Y>=0 && YHeight)」貼得有點怪 其實是這樣: if( X>=0 && X=0 && YHeight)
marky1
一般會員


發表:17
回覆:29
積分:9
註冊:2003-03-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-21 12:57:50 IP:140.118.xxx.xxx 未訂閱
咦...怎麼還是貼得有問題 算了,這一行的意思是指如果滑鼠的座標(X,Y)在Form的上方則進入
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-21 13:40:25 IP:203.73.xxx.xxx 未訂閱
引言: 首先感謝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=0 && YHeight)
  {
    char cor[50];
    wsprintf(cor,"X=%d, Y=%d)", X, Y);
    StatusBar1->Panels->Items[0]->Text = cor;
    ::SetCapture(Handle);
  }
  else
  {
    StatusBar1->Panels->Items[0]->Text = "";
    ::ReleaseCapture();
  }
}
結果滑鼠的座標數據幾乎無法在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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-21 17:04:41 IP:140.118.xxx.xxx 未訂閱
感謝RaynorPao您的不吝協助,小弟的問題已圓滿解決,謝謝! 由於小弟需要滑鼠在Form上移動一格一格的,如10,15,20... 所以將程式改寫為如下;若有先進感到不妥,歡迎一起討論。
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  if( X>=0 && X=0 && YHeight)
  {
    int iInterval = 5;
    POINT pt;
    GetCursorPos(&pt);
    int dx = (int)(X/iInterval 0.5) * iInterval - X;
    int dy = (int)(Y/iInterval 0.5) * iInterval - Y;
    if ( dx!=0 || dy!=0 )
      SetCursorPos(pt.x   dx, pt.y   dy);        char cor[50];
    wsprintf(cor,"X=%d, Y=%d)", X, Y);
    StatusBar1->Panels->Items[0]->Text = cor;
    ::SetCapture(Handle);
  }
  else
  {
    StatusBar1->Panels->Items[0]->Text = "";
    ::ReleaseCapture();
  }
}
系統時間:2024-03-29 22:24:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!