在編寫遊戲地圖編輯器時涉及到選單項的動態新增和動態響應,本文記錄了碰到的一些問題和解決方法。
因為遊戲地圖是分層次儲存和顯示的,所以在編輯器主選單中有個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物件 一 建立...