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

請教PopupMenu的問題..

尚未結案
旅者
一般會員


發表:5
回覆:9
積分:2
註冊:2004-02-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-22 17:55:35 IP:203.74.xxx.xxx 未訂閱
請問有人知道如何解決此問題嗎?? 我想在滑鼠移到第一張圖時popup出menu1,移到第二張圖時popup出menu2,也就是說,單純移動滑鼠到某些物件上,就會popup出menu,而不需要點擊... 但卻發現..當有menu已popup出來時,若不先點擊滑鼠,讓menu消失,就無法觸發其他物件的MouseMove事件....我希望在有menu已popup時,當滑鼠移到第二圖上時,原本popup出來的menu會消失,並另外popup出第二張圖的menu...請問要如何做到這種效果呢??
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-22 23:40:16 IP:211.76.xxx.xxx 未訂閱
先說聲抱歉,以下僅僅是個想法,而非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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-23 09:05:53 IP:203.74.xxx.xxx 未訂閱
1.你是設定用滑鼠點選menu1時,才會跳出PopUp1視窗?若是,請繼續看。 不是..是移到圖上時就pupupmenu,並不是popup出視窗...所以在下找不到關閉已Popup出來的PopupMenu的方法....^^||| 感謝您的建議...^^
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-23 12:02:41 IP:211.76.xxx.xxx 未訂閱
抱歉!昨晚睡前才看後回應,所以忽略了您一部份的敘述。sorry.... < >< > 還是建議您使用 >< >< > 人生就像是盒中的巧克力,除非你試了,要不然,你永遠都不知道它是什麼樣的口味。--阿甘正傳
m8815010
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-23 13:24:05 IP:61.63.xxx.xxx 未訂閱
引言: 請問有人知道如何解決此問題嗎?? 我想在滑鼠移到第一張圖時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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-25 09:23:16 IP:203.74.xxx.xxx 未訂閱
的確..誠如Cooky Kid所言...在下後來就是使用了Timer自己去控制popup...雖然,也碰過些問題,所幸目前的解決狀況還算順利...^^..只不過,這樣的作法在有相當多地方要popup出menu時...一方面,易拖長運算時間,一方面也很麻煩..^^u..(這就是目前的隱憂...^^u) m8815010(版主大大??)的建議相當不錯呢...之前在下也考慮過去攔截系統滑鼠的訊息,無奈不知如何入手....現在就可以試試了..^^,總之,很感謝兩位的建議與幫助,在下萬分感謝....^_^
m8815010
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-25 09:45:53 IP:61.63.xxx.xxx 未訂閱
引言: 的確..誠如Cooky Kid所言...在下後來就是使用了Timer自己去控制popup...雖然,也碰過些問題,所幸目前的解決狀況還算順利...^^..只不過,這樣的作法在有相當多地方要popup出menu時...一方面,易拖長運算時間,一方面也很麻煩..^^u..(這就是目前的隱憂...^^u) m8815010(版主大大??)的建議相當不錯呢...之前在下也考慮過去攔截系統滑鼠的訊息,無奈不知如何入手....現在就可以試試了..^^,總之,很感謝兩位的建議與幫助,在下萬分感謝....^_^
旅者你好: 聽你的口氣好像還沒 >! 那就有空試一下先吧!看看有什麼問題再一起討論吧!我自已試的結果是還> >! 另外程式只有兩個元件做測試,並且在"開始"鍵按下才開始測試,這些都寫死了,你要應用時可能要改寫比較多,以利自行使用! >!
旅者
一般會員


發表:5
回覆:9
積分:2
註冊:2004-02-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-31 13:56:48 IP:203.74.xxx.xxx 未訂閱
嗯嗯..您的SourceCode..在下是沒直接Copy下來測試啦..^^|||..不過,我知道Hook主要是哪些部份控制..所以自己另外寫了一段測試程式,測試這功能..結果是OK的..沒問題..^^ 只不過,後來太貪心..把原本使用Timer抓滑鼠判斷位置的程式都轉移給MouseHook來處理..就開始發生狀況(關閉程式時,會發生錯誤訊息)..經一些簡單的測試,估計是Hook的處理程序太過冗長,以致第一個Hook尚未處理完,又接到下一個Hook的關係..(大概吧,在下也不太清楚..)..所以現在就變成Timer與MouseHook並行制,各自分擔一部份,免得過勞死...^^u 總之,您所提供的方式大致沒問題,再次感謝您...^^
系統時間:2024-11-23 16:53:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!