請教PopupMenu的問題.. |
尚未結案
|
旅者
一般會員 發表:5 回覆:9 積分:2 註冊:2004-02-13 發送簡訊給我 |
請問有人知道如何解決此問題嗎??
我想在滑鼠移到第一張圖時popup出menu1,移到第二張圖時popup出menu2,也就是說,單純移動滑鼠到某些物件上,就會popup出menu,而不需要點擊...
但卻發現..當有menu已popup出來時,若不先點擊滑鼠,讓menu消失,就無法觸發其他物件的MouseMove事件....我希望在有menu已popup時,當滑鼠移到第二圖上時,原本popup出來的menu會消失,並另外popup出第二張圖的menu...請問要如何做到這種效果呢??
|
Cooky Kid
初階會員 發表:5 回覆:68 積分:44 註冊:2002-07-11 發送簡訊給我 |
先說聲抱歉,以下僅僅是個想法,而非code,提供給你參考...
1.你是設定用滑鼠點選menu1時,才會跳出PopUp1視窗?若是,請繼續看。
2.設定一個共用的timer,當PopUp1視窗跳出後,即開始作用--偵測滑鼠是否在menu1選單範圍中,若否,則關閉PopUp1視窗與timer偵測;
3.當滑鼠點選menu2時,PopUp2視窗跳出後,timer即開始作用--偵測滑鼠是否在menu2選單範圍中,若否,則關閉PopUp2視窗與timer偵測; 看看這是否如你所預期?
Good luck!!! 人生就像是盒中的巧克力,除非你試了,要不然,你永遠都不知道它是什麼樣的口味。--阿甘正傳
|
旅者
一般會員 發表:5 回覆:9 積分:2 註冊:2004-02-13 發送簡訊給我 |
|
Cooky Kid
初階會員 發表:5 回覆:68 積分:44 註冊:2002-07-11 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 請問有人知道如何解決此問題嗎?? 我想在滑鼠移到第一張圖時popup出menu1,移到第二張圖時popup出menu2,也就是說,單純移動滑鼠到某些物件上,就會popup出menu,而不需要點擊... 但卻發現..當有menu已popup出來時,若不先點擊滑鼠,讓menu消失,就無法觸發其他物件的MouseMove事件....我希望在有menu已popup時,當滑鼠移到第二圖上時,原本popup出來的menu會消失,並另外popup出第二張圖的menu...請問要如何做到這種效果呢??旅者你好< >: >!如果你還想要其它的辦法,試試我的吧< >! 精神: <>依你的意思,你將popmenu show出是寫在mousemove事件內,而問題發生在第一個popmenu沒有消失時,第二個mousemove的事件會被擋掉,跟本沒辦法觸發,所以第二個popmenu沒辦法彈出! 解決之道應是用偵測system mouse的動作事件比較直覺,因為這樣可以順利偵則滑鼠事件,那剛好我之前有研究過Mouse System Hook的問題,所以有一段source code剛好有用上! 範例: In Unti.h ~~~ class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TMemo *Memo1; TMemo *Memo2; TPopupMenu *PopupMenu1; TMenuItem *Test1; TPopupMenu *PopupMenu2; TMenuItem *Fuck1; TButton *Button2; void __fastcall Button1Click(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall Memo1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall Memo2MouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall Button2Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; ~~~ In Unit.cpp ~~~ TForm1 *Form1; HHOOK hMouseHook; bool IfPopMenu1Pop=false; bool IfPopMenu2Pop=false; void GetPopMenuShowPos(long* x,long* y,TMemo* memo); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- LRESULT CALLBACK MouseHook(int iCode,WPARAM wParam,LPARAM lParam) { if (iCode>=0) { if (iCode==HC_ACTION) { TEventMsg msg; msg = *((TEventMsg*)(lParam)); if (msg.message==WM_MOUSEMOVE) { TPoint p; p.x=msg.paramL; p.y=msg.paramH; TPoint t; t=Form1->Memo1->ScreenToClient(p); if (t.x>=Form1->Memo1->Left && t.x<=Form1->Memo1->Width+Form1->Memo1->Left && t.y>=Form1->Memo1->Top && t.y<=Form1->Memo1->Top+Form1->Memo1->Height) { if (IfPopMenu2Pop==true) { IfPopMenu2Pop=false; mouse_event(MOUSEEVENTF_LEFTDOWN,p.x,p.y,0,GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_LEFTUP ,p.x,p.y,0,GetMessageExtraInfo()); } if (IfPopMenu1Pop==false) { TPoint ShowPos1; GetPopMenuShowPos(&(ShowPos1.x),&(ShowPos1.y),Form1->Memo1); IfPopMenu1Pop=true; } } if (t.x>=Form1->Memo2->Left && t.x<=Form1->Memo2->Width+Form1->Memo2->Left && t.y>=Form1->Memo2->Top && t.y<=Form1->Memo2->Top+Form1->Memo2->Height) { if (IfPopMenu1Pop==true) { IfPopMenu1Pop=false; mouse_event(MOUSEEVENTF_LEFTDOWN,p.x,p.y,0,GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_LEFTUP ,p.x,p.y,0,GetMessageExtraInfo()); } if (IfPopMenu2Pop==false) { TPoint ShowPos2; GetPopMenuShowPos(&(ShowPos2.x),&(ShowPos2.y),Form1->Memo2); IfPopMenu2Pop=true; } } } } return 0; } return CallNextHookEx(hMouseHook,iCode,wParam,lParam); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { hMouseHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)MouseHook,HInstance,0); if (!hMouseHook) ShowMessage("Fail to Hook!"); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender,TCloseAction &Action) { UnhookWindowsHookEx(hMouseHook); } //--------------------------------------------------------------------------- void __fastcall TForm1::Memo1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { IfPopMenu1Pop=true; TPoint p; GetPopMenuShowPos(&(p.x),&(p.y),Memo1); PopupMenu1->Popup(p.x,p.y); } //--------------------------------------------------------------------------- void __fastcall TForm1::Memo2MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { IfPopMenu2Pop=true; TPoint t; GetPopMenuShowPos(&(t.x),&(t.y),Memo2); PopupMenu2->Popup(t.x,t.y); } //--------------------------------------------------------------------------- void GetPopMenuShowPos(long* x,long* y,TMemo* memo) { TPoint p,t; p.x=memo->Left; p.y=memo->Top; t.x=memo->Width-memo->Left; t.y=memo->Height-memo->Top; p=memo->ClientToScreen(p); t=memo->ClientToScreen(t); *x=(p.x+t.x)/2; *y=(p.y+t.y)/2; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { UnhookWindowsHookEx(hMouseHook); } //---------------------------------------------------------------------------圖例: 注意: 1. 這個範例是用2個Memo,旅者你用Image應沒差 2. 範例中只有兩個元件,旅者你如果有多個Image的話,要自行修改程式,增加和善度 3. 範例中的popmenu皆在所屬memo的正中央show出 4. 以你在mousemove事件中show popmenu的方式,只要滑鼠在Image上動作的話,popmenu就會一值存在,這與一般popmenu的行為模式不太同,此範例不論好不好,只是照你的意思做 That's all! 發表人 - |
旅者
一般會員 發表:5 回覆:9 積分:2 註冊:2004-02-13 發送簡訊給我 |
的確..誠如Cooky Kid所言...在下後來就是使用了Timer自己去控制popup...雖然,也碰過些問題,所幸目前的解決狀況還算順利...^^..只不過,這樣的作法在有相當多地方要popup出menu時...一方面,易拖長運算時間,一方面也很麻煩..^^u..(這就是目前的隱憂...^^u)
m8815010(版主大大??)的建議相當不錯呢...之前在下也考慮過去攔截系統滑鼠的訊息,無奈不知如何入手....現在就可以試試了..^^,總之,很感謝兩位的建議與幫助,在下萬分感謝....^_^
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 的確..誠如Cooky Kid所言...在下後來就是使用了Timer自己去控制popup...雖然,也碰過些問題,所幸目前的解決狀況還算順利...^^..只不過,這樣的作法在有相當多地方要popup出menu時...一方面,易拖長運算時間,一方面也很麻煩..^^u..(這就是目前的隱憂...^^u) m8815010(版主大大??)的建議相當不錯呢...之前在下也考慮過去攔截系統滑鼠的訊息,無奈不知如何入手....現在就可以試試了..^^,總之,很感謝兩位的建議與幫助,在下萬分感謝....^_^旅者你好: 聽你的口氣好像還沒 >! 那就有空試一下先吧!看看有什麼問題再一起討論吧!我自已試的結果是還> >! 另外程式只有兩個元件做測試,並且在"開始"鍵按下才開始測試,這些都寫死了,你要應用時可能要改寫比較多,以利自行使用! >! |
旅者
一般會員 發表:5 回覆:9 積分:2 註冊:2004-02-13 發送簡訊給我 |
嗯嗯..您的SourceCode..在下是沒直接Copy下來測試啦..^^|||..不過,我知道Hook主要是哪些部份控制..所以自己另外寫了一段測試程式,測試這功能..結果是OK的..沒問題..^^
只不過,後來太貪心..把原本使用Timer抓滑鼠判斷位置的程式都轉移給MouseHook來處理..就開始發生狀況(關閉程式時,會發生錯誤訊息)..經一些簡單的測試,估計是Hook的處理程序太過冗長,以致第一個Hook尚未處理完,又接到下一個Hook的關係..(大概吧,在下也不太清楚..)..所以現在就變成Timer與MouseHook並行制,各自分擔一部份,免得過勞死...^^u
總之,您所提供的方式大致沒問題,再次感謝您...^^
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |