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

TComboBox及TRadioGroup要如何取得座標值

尚未結案
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-08 22:57:36 IP:220.138.xxx.xxx 未訂閱
我在實作時發現TComboBox及TRadioGroup都沒有mousedown,mouseup,mousemove, 因此我利用WindowProc去攔截上述三個事件, 基本上是攔到的,但是他們的座標值只有在TRadioGroup的邊綠有所變化,TComboBox及TRadioGroup永遠是x=1,y=512 要我要如何取得座標值
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-09 11:04:55 IP:61.63.xxx.xxx 未訂閱
引言: 我在實作時發現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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-09 16:12:10 IP:211.21.xxx.xxx 未訂閱
我也有想到應該去攔截他的子物件, 但是不會做 現在看了範例之後,惑然開朗. 但是我有二個問題, 第一個是為什麼 > 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-09 16:29:06 IP:211.21.xxx.xxx 未訂閱
一時手快,貼錯了,又刪不掉上一篇 補充一點問題不止 >) //. 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-09 21:30:46 IP:203.73.xxx.xxx 未訂閱
引言: 一時手快,貼錯了,又刪不掉上一篇 補充一點問題不止 >) ..... < 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-10 14:44:04 IP:211.21.xxx.xxx 未訂閱
真是不好意思! 讓你看到一堆程式碼, 我本來用意是怕你不懂我所要表達的意思,所以我想用程式碼來最直接 再者謝謝你幫我寫了二種方式的 > 我剛才試了一下
系統時間:2024-05-03 3:06:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!