TComboBox及TRadioGroup要如何取得座標值 |
尚未結案
|
markov
中階會員 ![]() ![]() ![]() 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
|
m8815010
版主 ![]() ![]() ![]() ![]() ![]() 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 我在實作時發現TComboBox及TRadioGroup都沒有mousedown,mouseup,mousemove, 因此我利用WindowProc去攔截上述三個事件, 基本上是攔到的,但是他們的座標值只有在TRadioGroup的邊綠有所變化,TComboBox及TRadioGroup永遠是x=1,y=512 要我要如何取得座標值markov你好 |
markov
中階會員 ![]() ![]() ![]() 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
我也有想到應該去攔截他的子物件,
但是不會做
static inline void ValidCtrCheck(TMouseComboBoxEx *) { new TMouseComboBoxEx(NULL); } //--------------------------------------------------------------------------- __fastcall TMouseComboBoxEx::TMouseComboBoxEx(TComponent* Owner) : TComboBox(Owner) { EnumChildWindows(Handle,(WNDENUMPROC)MouseComboBoxEnumChildProc,0); OldMouseComboBoxChildWndProc=GetWindowLong(hMouseComboBoxControl,GWL_WNDPROC); SetWindowLong(hMouseComboBoxControl,GWL_WNDPROC,(LONG)MouseComboBoxClildWindowProc); } //--------------------------------------------------------------------------- namespace Mousecomboboxex { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TMouseComboBoxEx)}; RegisterComponents("Samples", classes, 0); } } //--------------------------------------------------------------------------- void __fastcall TMouseComboBoxEx::FMouseUp(TWMMouse &WMMouse) { if(FOnMouseUp) { TMouseButton MouseButton; TShiftState ShiftState; if(WMMouse.Keys==MK_LBUTTON) { ShiftState=ShiftState << ssLeft; MouseButton=mbLeft; } else if(WMMouse.Keys==MK_CONTROL) ShiftState=ShiftState << ssCtrl; else if(WMMouse.Keys==MK_MBUTTON) { ShiftState=ShiftState << ssMiddle; MouseButton=mbRight; } else if(WMMouse.Keys==MK_RBUTTON) { ShiftState=ShiftState << ssRight; MouseButton=mbMiddle; } else if(WMMouse.Keys==MK_SHIFT) ShiftState=ShiftState << ssShift; FOnMouseUp(this,MouseButton,ShiftState,WMMouse.XPos,WMMouse.YPos); } } //--------------------------------------------------------------------------- void __fastcall TMouseComboBoxEx::FMouseDown(TWMMouse &WMMouse) { if(FOnMouseDown) { TMouseButton MouseButton; TShiftState ShiftState; if(WMMouse.Keys==MK_LBUTTON) { ShiftState=ShiftState << ssLeft; MouseButton=mbLeft; } else if(WMMouse.Keys==MK_CONTROL) ShiftState=ShiftState << ssCtrl; else if(WMMouse.Keys==MK_MBUTTON) { ShiftState=ShiftState << ssMiddle; MouseButton=mbRight; } else if(WMMouse.Keys==MK_RBUTTON) { ShiftState=ShiftState << ssRight; MouseButton=mbMiddle; } else if(WMMouse.Keys==MK_SHIFT) ShiftState=ShiftState << ssShift; FOnMouseDown(this,MouseButton,ShiftState,WMMouse.XPos,WMMouse.YPos); } } void __fastcall TMouseComboBoxEx::FMouseMove(TWMMouse &WMMouse) { if(FOnMouseMove) { TMouseButton MouseButton; TShiftState ShiftState; if(WMMouse.Keys==MK_LBUTTON) ShiftState=ShiftState << ssLeft; else if(WMMouse.Keys==MK_CONTROL) ShiftState=ShiftState << ssCtrl; else if(WMMouse.Keys==MK_MBUTTON) ShiftState=ShiftState << ssMiddle; else if(WMMouse.Keys==MK_RBUTTON) ShiftState=ShiftState << ssRight; else if(WMMouse.Keys==MK_SHIFT) ShiftState=ShiftState << ssShift; FOnMouseMove(this,ShiftState,WMMouse.XPos,WMMouse.YPos); } } BOOL CALLBACK MouseComboBoxEnumChildProc(HWND hwnd,LPARAM lParam) { hMouseComboBoxControl=hwnd; return true; } LRESULT CALLBACK MouseComboBoxClildWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { if (uMsg==WM_MOUSEMOVE) { TWMMouse WMMouse; WMMouse.Msg=uMsg; WMMouse.Keys=wParam; WMMouse.XPos=LOWORD(lParam); WMMouse.YPos=HIWORD(lParam); FMouseMove(WMMouse);//這一行會錯 } return CallWindowProc((FARPROC)OldMouseComboBoxChildWndProc,hwnd,uMsg,wParam,lParam); } |
markov
中階會員 ![]() ![]() ![]() 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
一時手快,貼錯了,又刪不掉上一篇
static inline void ValidCtrCheck(TMouseComboBoxEx *) { new TMouseComboBoxEx(NULL); } //--------------------------------------------------------------------------- __fastcall TMouseComboBoxEx::TMouseComboBoxEx(TComponent* Owner) : TComboBox(Owner) { EnumChildWindows(Handle,(WNDENUMPROC)MouseComboBoxEnumChildProc,0); OldMouseComboBoxChildWndProc=GetWindowLong(hMouseComboBoxControl,GWL_WNDPROC); SetWindowLong(hMouseComboBoxControl,GWL_WNDPROC,(LONG)MouseComboBoxClildWindowProc); MouseComboBoxParentWindowProc=WindowProc; WindowProc=MouseComboBoxHookWindowProc; } //--------------------------------------------------------------------------- namespace Mousecomboboxex { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TMouseComboBoxEx)}; RegisterComponents("Samples", classes, 0); } } //--------------------------------------------------------------------------- void __fastcall TMouseComboBoxEx::FMouseUp(TWMMouse &WMMouse) { if(FOnMouseUp) { TMouseButton MouseButton; TShiftState ShiftState; if(WMMouse.Keys==MK_LBUTTON) { ShiftState=ShiftState << ssLeft; MouseButton=mbLeft; } else if(WMMouse.Keys==MK_CONTROL) ShiftState=ShiftState << ssCtrl; else if(WMMouse.Keys==MK_MBUTTON) { ShiftState=ShiftState << ssMiddle; MouseButton=mbRight; } else if(WMMouse.Keys==MK_RBUTTON) { ShiftState=ShiftState << ssRight; MouseButton=mbMiddle; } else if(WMMouse.Keys==MK_SHIFT) ShiftState=ShiftState << ssShift; FOnMouseUp(this,MouseButton,ShiftState,WMMouse.XPos,WMMouse.YPos); } } //--------------------------------------------------------------------------- void __fastcall TMouseComboBoxEx::FMouseDown(TWMMouse &WMMouse) { if(FOnMouseDown) { TMouseButton MouseButton; TShiftState ShiftState; if(WMMouse.Keys==MK_LBUTTON) { ShiftState=ShiftState << ssLeft; MouseButton=mbLeft; } else if(WMMouse.Keys==MK_CONTROL) ShiftState=ShiftState << ssCtrl; else if(WMMouse.Keys==MK_MBUTTON) { ShiftState=ShiftState << ssMiddle; MouseButton=mbRight; } else if(WMMouse.Keys==MK_RBUTTON) { ShiftState=ShiftState << ssRight; MouseButton=mbMiddle; } else if(WMMouse.Keys==MK_SHIFT) ShiftState=ShiftState << ssShift; FOnMouseDown(this,MouseButton,ShiftState,WMMouse.XPos,WMMouse.YPos); } } void __fastcall TMouseComboBoxEx::FMouseMove(TWMMouse &WMMouse) { if(FOnMouseMove) { TMouseButton MouseButton; TShiftState ShiftState; if(WMMouse.Keys==MK_LBUTTON) ShiftState=ShiftState << ssLeft; else if(WMMouse.Keys==MK_CONTROL) ShiftState=ShiftState << ssCtrl; else if(WMMouse.Keys==MK_MBUTTON) ShiftState=ShiftState << ssMiddle; else if(WMMouse.Keys==MK_RBUTTON) ShiftState=ShiftState << ssRight; else if(WMMouse.Keys==MK_SHIFT) ShiftState=ShiftState << ssShift; FOnMouseMove(this,ShiftState,WMMouse.XPos,WMMouse.YPos); } } void __fastcall TMouseComboBoxEx::MouseComboBoxHookWindowProc(TMessage &Message) { if (Message.Msg==WM_MOUSEMOVE) { TWMMouse WMMouse; WMMouse.Msg=Message.Msg; WMMouse.Keys=Message.WParam; WMMouse.XPos=Message.LParamLo; WMMouse.YPos=Message.LParamHi; FMouseMove(WMMouse); } MouseComboBoxParentWindowProc(Message); } BOOL CALLBACK MouseComboBoxEnumChildProc(HWND hwnd,LPARAM lParam) { hMouseComboBoxControl=hwnd; return true; } LRESULT CALLBACK MouseComboBoxClildWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { if (uMsg==WM_MOUSEMOVE) { TWMMouse WMMouse; WMMouse.Msg=uMsg; WMMouse.Keys=wParam; WMMouse.XPos=LOWORD(lParam); WMMouse.YPos=HIWORD(lParam); //FMouseMove(WMMouse); } return CallWindowProc((FARPROC)OldMouseComboBoxChildWndProc,hwnd,uMsg,wParam,lParam); } |
m8815010
版主 ![]() ![]() ![]() ![]() ![]() 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 一時手快,貼錯了,又刪不掉上一篇 |
markov
中階會員 ![]() ![]() ![]() 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |