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

3D鼠標輪子混動時,在DBGrid中的小3角不能同步顯示,有何高招?

尚未結案
pwq
一般會員


發表:5
回覆:13
積分:3
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-19 15:26:40 IP:211.148.xxx.xxx 未訂閱
3D鼠標輪子混動時,在DBGrid中的小3角不能同步顯示,有何高招?
pwq
一般會員


發表:5
回覆:13
積分:3
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-27 09:18:12 IP:218.16.xxx.xxx 未訂閱
本人已經解決此問題,現在方法貼出如下: Type   TDBGrid = class(TDBGrid) private FOldGridWnd : TWndMethod; procedure NewGridWnd (var Message : TMessage); public constructor Create(AOwner: TComponent); override; end; //////////////////////////////////////////紅色部分代友需放在以下代碼前 TMDFMainForm = class(TForm) ...... end; implementation {$R *.dfm} constructor TNDBGrid.Create(AOwner: TComponent); begin inherited; FOldGridWnd := WindowProc; WindowProc := NewGridWnd; end; procedure TDBGrid.NewGridWnd(var Message: TMessage); var IsNeg : Boolean; begin if Message.Msg = WM_MOUSEWHEEL then begin IsNeg := Short(Message.WParamHi) < 0; if IsNeg and (DataSource.DataSet<>nil) and DataSource.DataSet.Active then DataSource.DataSet.MoveBy(1) else if not IsNeg and (DataSource.DataSet<>nil) and DataSource.DataSet.Active then DataSource.DataSet.MoveBy(-1) end else FOldGridWnd(Message); end; ........ end.
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-27 14:59:56 IP:210.65.xxx.xxx 未訂閱
Hi:    剛剛看了一篇文章,沒想到在這個問題上也有解,我實際試了一下,確實可行,且更簡單,感謝 Miles,請參照以下文章(Miles 發表部分)     http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41134 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-28 09:06:18 IP:61.150.xxx.xxx 未訂閱
Hi,pwq您好!   請您參考一下這篇文章,看是否能解決您的問題:       http://www.yesky.com/SoftChannel/72342371928440832/20030619/1709082.shtml   
讓Delphi的DBGrid支持鼠標輪
劉東榮 現在的大多數的鼠標都有鼠標輪,比如,當我們瀏覽網頁時,鼠標輪上下移動,網頁就自動上下滾動。鼠標輪的確給我們的操作帶來很多方便,但是,在Delphi的大多數控件中都只支持 MouseDown,MouseUp,MouseMove等事件,而不直接支持MouseWheel事件,我們在幫助客戶設計一個查看程序時就碰到這樣的問題。這個查看程序的數據是放在一個DBGrid中的,數據比較多,超出整個屏幕,如果用鼠標輪上下移動,則DBGrid的光標只在可見範圍內移動,超出屏幕的數據必須用鍵盤或右側的滾動條,給用戶造成極大不方便,客戶強烈要求支持鼠標輪操作。但是查看DBGrid的事件屬性沒有對鼠標輪的支持,怎麼辦呢? 我們知道,Windows操作系統是消息驅動的,因此,如果鼠標輪上下滾動,必然會有相應的事件發生,經過查找資料,我們得知當鼠標輪上下滾動時發生的是WM_MOUSEWHEEL事件,既然這樣,我們如果捕獲這個事件,不就可以處理鼠標輪事件了嗎? 說幹就幹,那就讓我們來為DBGrid增加一個OnMouseWheel事件,製作一個支持鼠標輪的新的DBGrid組件。 讓我們新建一個應用,就叫MyDBGrid吧,選擇菜單File─New Application,然後再選擇菜單File-New-Component 因為我們的新組件是從DBGrid繼承的,所以,Ancestor Type選擇 TDBGrid,Class Name就填我們的組件名稱TmyDbGrid,生成的組件放在Samples頁,點擊OK,則組件的框架就生成了。 現在我們開始做最關鍵的部分。當鼠標輪上下滾動時,發出了WM_MOUSEWHEEL消息,MOUSEWHEEL消息有幾個參數, 1.fwKeys= LOWORD(wParam),表明各種虛擬鍵是否按下,有如下值:
      值          說明 
  MK_CONTROL  按下CTRL鍵 
  MK_LBUTTON  按下鼠標左鍵 
  MK_MBUTTON  按下鼠標中鍵 
  MK_RBUTTON  按下鼠標右鍵 
  MK_SHIFT    按下Shift鍵         2.zDelta = (short) HIWORD(wParam)       鼠標輪滾動的距離,如果向前則為正,向後為負。       3.xPos =(short) LOWORD(lParam) 
     yPos= (short) HIWORD(lParam)
 
    鼠標的位置。 
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-28 09:10:21 IP:61.150.xxx.xxx 未訂閱
 Delphi已經定義了兩個和鼠標輪相關的事件,叫TmouseWheelEvent, TmouseWheelUpDownEvent,分別代表鼠標輪事件和鼠標輪上,下滾動事件。因此,我們先在TmyDbGrid中定義三個私有的事件變量:      fMouseWheel:TMouseWheelEvent;   fMouseWheelUp:TMouseWheelUpDownEvent; //鼠標輪上滾事件   fMouseWheelDown: TMouseWheelUpDownEvent; //鼠標輪下滾事件      然後定義publised中定義事件屬性:     property OnMouseWheel:TMouseWheelEvent read fMouseWheel write fMouseWheel;     property OnMouseWheelUp:TMouseWheelUpDownEvent read fMouseWheelUp write fMouseWheelUp;     property OnMouseWheelDown:TMouseWheelUpDownEvent read fMouseWheelDown write fMouseWheelDown;      然後重載TDBGrid的WndProc函數,        procedure WndProc(var Msg: TMessage);override;    我們在WndProc中捕獲鼠標輪的消息,如下:
 
 var 
  MousePoint:TPoint; 
  Handled:Boolean; 
  shift:TShiftState; 
 begin 
  if(Msg.Msg=WM_MOUSEWHEEL) then //捕獲鼠標輪事件 
   begin 
    MousePoint.X:=LOWORD(Msg.lParam); 
    MousePoint.Y:=HIWORD(Msg.lParam);
    Handled:=false; 
    if(Msg.wParam>0) then //上滾 
      fMouseWheelUp(self,shift,MousePoint,Handled) 
    else //下滾 
      fMouseWheelDown(self,shift,MousePoint,Handled); 
    fMouseWheel(self,shift,HIWORD(Msg.wParam),MousePoint,Handled); 
    if Handled then exit; 
end;     inherited;     end; 
這樣,我們就基本可以處理鼠標輪事件了,編譯我們的組件,然後選擇菜單Components-Inatll Component,將我們的組件安裝在Samples頁下。 讓我們來試驗一下我們做的組件,新建一個應用,然後選擇Samples下的MyDBGrid組件,其它的用法,和DBGRrid完全一樣,但你可以看見,在你的MyDbGrid的事件中,已經有OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown的選項了。 這樣,你可以在OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown中處理你的動作了,我們也完成了客戶的要求,當客戶移動鼠標輪時,我們在OnMouseWheelUp中加入相應代碼,圓滿解決了客戶的要求。
系統時間:2024-06-27 10:20:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!