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你好: 這是因為這兩個物件都是組合式的!以 >),它是由 class="code"> TForm1 *Form1; int i=0; HWND hEditControl; LONG OldEditWndProc; BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam); LRESULT CALLBACK My_WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam) { hEditControl=hwnd; return true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { EnumChildWindows(ComboBox1->Handle,(WNDENUMPROC)EnumChildProc,0); OldEditWndProc=GetWindowLong(hEditControl,GWL_WNDPROC); SetWindowLong(hEditControl,GWL_WNDPROC,(LONG)My_WindowProc); } //--------------------------------------------------------------------------- LRESULT CALLBACK My_WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { if (uMsg==WM_LBUTTONDOWN) Form1->Caption=IntToStr( i); return CallWindowProc((FARPROC)OldEditWndProc,hwnd,uMsg,wParam,lParam); } 嗯,上述是一個偵測TComboBox上的Edit物件的訊息的例子,應該還要加上你之前用windowproc攔TComboBox的 那部驟才完整(外圈 內裏),就看markov兄你自已怎麼整合了! 參著! |
markov
中階會員 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
我也有想到應該去攔截他的子物件,
但是不會做
現在看了範例之後,惑然開朗.
但是我有二個問題,
第一個是為什麼 >
class="code">
typedef void __fastcall(__closure *MouseUp_Action)(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
typedef void __fastcall(__closure *MouseDown_Action)(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
typedef void __fastcall(__closure *MouseMove_Action)(TObject *Sender,TShiftState Shift, int X, int Y);
HWND hMouseComboBoxControl;
LONG OldMouseComboBoxChildWndProc;
BOOL CALLBACK MouseComboBoxEnumChildProc(HWND hwnd,LPARAM lParam);
LRESULT CALLBACK MouseComboBoxClildWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
//---------------------------------------------------------------------------
class PACKAGE TMouseComboBoxEx : public TComboBox
{
private:
MouseUp_Action FOnMouseUp;
MouseDown_Action FOnMouseDown;
MouseMove_Action FOnMouseMove;
protected:
void __fastcall FMouseUp(TWMMouse &Msg);
void __fastcall FMouseDown(TWMMouse &Msg);
void __fastcall FMouseMove(TWMMouse &Msg); BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_LBUTTONUP, TWMMouse, FMouseUp)
VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMMouse, FMouseDown)
VCL_MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouse, FMouseMove)
END_MESSAGE_MAP(TComboBox)
public:
__fastcall TMouseComboBoxEx(TComponent* Owner);
__published:
__property MouseUp_Action {read= FOnMouseUp,write= FOnMouseUp};
__property MouseDown_Action {read= FOnMouseDown,write= FOnMouseDown};
__property MouseMove_Action {read= FOnMouseMove,write= FOnMouseMove};
};
//.cpp
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 發送簡訊給我 |
一時手快,貼錯了,又刪不掉上一篇
補充一點問題不止 >) //. class="code">
typedef void __fastcall(__closure *MouseUp_Action)(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
typedef void __fastcall(__closure *MouseDown_Action)(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
typedef void __fastcall(__closure *MouseMove_Action)(TObject *Sender,TShiftState Shift, int X, int Y);
HWND hMouseComboBoxControl;
LONG OldMouseComboBoxChildWndProc;
BOOL CALLBACK MouseComboBoxEnumChildProc(HWND hwnd,LPARAM lParam);
LRESULT CALLBACK MouseComboBoxClildWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
//---------------------------------------------------------------------------
class PACKAGE TMouseComboBoxEx : public TComboBox
{
private:
MouseUp_Action FOnMouseUp;
MouseDown_Action FOnMouseDown;
MouseMove_Action FOnMouseMove;
TWndMethod MouseComboBoxParentWindowProc;
void __fastcall MouseComboBoxHookWindowProc(TMessage &Message);
protected:
void __fastcall FMouseUp(TWMMouse &Msg);
void __fastcall FMouseDown(TWMMouse &Msg);
void __fastcall FMouseMove(TWMMouse &Msg); BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_LBUTTONUP, TWMMouse, FMouseUp)
VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMMouse, FMouseDown)
VCL_MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouse, FMouseMove)
END_MESSAGE_MAP(TComboBox)
public:
__fastcall TMouseComboBoxEx(TComponent* Owner);
__published:
__property MouseUp_Action {read= FOnMouseUp,write= FOnMouseUp};
__property MouseDown_Action {read= FOnMouseDown,write= FOnMouseDown};
__property MouseMove_Action {read= FOnMouseMove,write= FOnMouseMove};
};
//.cpp
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 發送簡訊給我 |
引言: 一時手快,貼錯了,又刪不掉上一篇 補充一點問題不止 >) ..... >>< face="Verdana, Arial, Helvetica"> 嗯,markov兄不曉得你可不可接受替代性的做作,例如下例,因為我看到你的程式碼一堆,看了有點手軟了!所以看看可不可以接受替代的方式,再說囉! < class="code"> In .h ~~ class TForm1 : public TForm { __published: // IDE-managed Components TComboBox *ComboBox1; TApplicationEvents *ApplicationEvents1; //add this line void __fastcall ApplicationEvents1Message(tagMSG &Msg, bool &Handled); //add this line private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; ~~ In .cpp ~~ TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled) { if (Msg.message==WM_LBUTTONDOWN) { POINT point; point.y=HIWORD(Msg.lParam); point.x=LOWORD(Msg.lParam); if (PtInRect(ComboBox1->ClientRect,point)) //ShowMessage("我被按下了!"); //嗯,剛發現這裏這showmessage會怪怪的(因為會有新視窗的關係),先用其它的方式 Memo1->Lines->Add("Success"); } } ~~ 參著! 發表人 - |
markov
中階會員 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |