用彈出選單模擬視窗的選單

2021-04-01 22:59:23 字數 1358 閱讀 2464

在加了skin的不規則區域視窗,視窗選單很難固定在原來的位置,無法用原來的方式實現。這裡提供了一種用彈出選單模擬視窗選單的方法。

首先在視窗的任意乙個區域畫出選單的效果,這個區域我們稱為選單區,我們把每個選單項在視窗中的位置儲存下來

crect m_rcmenu[3];

程式主要要處理三個訊息: wm_lbuttondown、wm_mousemove、wm_enteridle

begin_message_map(cmydlg, cdialog)

//}afx_msg_map

end_message_map()

當滑鼠在選單區內按下的時候,開始用彈出選單模擬視窗選單。

void cmydlg::onlbuttondown(uint nflags, cpoint ptstart)

//這個是選單索引,用它來標示顯示那個選單

m_imenuindex = i;

m_bshowmenu = true;

//選單顯示,如果m_bmenucontinue為true, 不斷顯示新的選單,舊的在wm_enteridle中清除,之所以做這樣的處理,是因為視窗選單要求當選單彈出時,隨著滑鼠在選單區的移動,選單變更為相應的子選單

do while(m_bmenucontinue);  

invalidaterect(&m_rcmenu[m_imenuindex], true);

updatewindow();

m_bshowmenu = false;

cwnd::onlbuttondown(nflags, point);

return;}}

if ( i== 3)

m_imenuindex = -1;

cdialog::onlbuttondown(nflags, point);

然後在onmousemove裡更新選單索引

void cmydlg::onmousemove(uint nflags, cpoint point)

}cdialog::onmousemove(nflags, point);

}在onenteridle將選單取消並重新顯示

void cgameboxshell::onenteridle(uint nwhy, cwnd* pwho)

}m_imenuindex = i;

m_bmenucontinue = true;

sendmessage(wm_cancelmode);

}break;}}

}}

最後,把顯示選單的**補充完整

void cmydlg::showmenu()

這樣,我們就可以完用彈出選單來模擬視窗的選單,你可以在你的不規則視窗上的任何位置實現出選單的效果。

Unity 擴充套件彈出選單視窗

unity 編輯器下提供了系統級的選單彈窗,會阻塞訊息,卡住渲染,以及不能進行搜尋等功能,而它自己有非阻塞版本的彈窗,但不開放給使用者使用,比如這個介面 genericmenu的unity風格版本 public class genericpopupmenu popupwindowcontent pr...

關於彈出選單

在用vc做一些軟體功能的時候,為了方便使用,通常會涉及到托盤程式設計。也就是在程式最小化的時候,會在右下角的托盤區域新增乙個圖示,這個圖示通常會支援彈出選單功能。問題就在這裡出現了,你也許會發現我們使用trackpopupmenu撥出的彈出選單,如果使用者在取消選擇的時候,在桌面任意地方單擊,這個選...

Air彈出選單

有時候,需要對某個控制項使用右鍵選單,右鍵選單的好處是可以隱藏,在需要的時候才開啟。下面是 建立自定義選單 新增右鍵選單 var rightmenu contextmenu new contextmenu rightmenu.hidebuiltinitems 有這句話就不顯示 列印 選單了 var ...