MFC中選單項的動態新增 刪除與響應

2021-06-20 12:34:56 字數 1124 閱讀 6786

在編寫遊戲地圖編輯器時涉及到選單項的動態新增和動態響應,本文記錄了碰到的一些問題和解決方法。

因為遊戲地圖是分層次儲存和顯示的,所以在編輯器主選單中有個layer選單,這個選單中的選單項除了乙個"show only"選單項和乙個sperator,其它的選單項是根據地圖中的層數和層的名字動態新增的,所以在編譯期無法知道選單項的個數,也無法用on_command巨集將這些選單項與命令處理函式相關聯。本來還有乙個on_command_range巨集,可以將某個範圍內的id與乙個command handler相關聯,但是這樣的話,我必須在這個巨集中指定最大的id號。因為我不知道實際的地圖到底會有多少層,所以我不想讓動態新增的選單項在id上有個上限。

layer選單的第乙個選單項是"show only",它響應了update_command_ui訊息,我在這個響應函式裡先刪除"show only"之後的所有選單項,然後檢查地圖實際有多少層,取得地圖各層的名字,再根據實際的層數新增選單項。

刪除選單項的**如下:

nitemcount = playermenu->getmenuitemcount();

for (i = 2;i < nitemcount;i++)

這樣刪除的話就有問題。因為我是根據選單項的位置來刪除的,而每執行一次

playermenu->deletemenu(i,mf_byposition)就少乙個選單項,其後的選單項的位置偏移就會減一,最後刪除的結果就非我所預期的了。

解決辦法是用mf_bycommand根據id來刪除,或者

nitemcount = playermenu->getmenuitemcount();

for (i = 2;i < nitemcount;i++)

這樣我就能保證刪除所有上一次動態新增上去的選單項了。

動態新增選單項我是這樣做的:

nmaxpos = playermenu->getmenuitemcount() - 1;

if (0 == ncode)

return true;}}

return cview::oncmdmsg(nid, ncode, pextra, phandlerinfo);

ncode為0表示是命令訊息,為-1就表示是update_command_ui訊息。我在動態新增選單項時讓它們的id順序遞增,這樣方便處理。

MFC中選單項的動態新增 刪除與響應

在編寫遊戲地圖編輯器時涉及到選單項的動態新增和動態響應,本文記錄了碰到的一些問題和解決方法。因為遊戲地圖是分層次儲存和顯示的,所以在編輯器主選單中有個layer選單,這個選單中的選單項除了乙個 show only 選單項和乙個sperator,其它的選單項是根據地圖中的層數和層的名字動態新增的,所以...

用gtk寫的動態新增刪除選單 選單項 子選單的介面

介面 menu.h menu.h dynamic menu facility.ifndef menu h define menu h struct path nc 獲得選單項的名字 gchar g menu item get label gtkwidget menu item 獲得path的各個名字...

如何動態新增選單 選單項 子選單 右鍵選單

有關選單的操作主要用到 cmenu 類,當然也可用相應 api函式,cmenu 類只是mfc 對api 中操作選單的函式的封裝而已。不過能用類就盡量用類,類的組織方式好唄,看著也舒服。若是sdk 程式設計,那就用 api吧。cmenu menumain,menu1 首先 定義cmenu物件 一 建立...