动态菜单的问题
WIN32开发时,通过资源文件定义菜单,如下:
#include "Resource.hpp "
MENUPAINT MENU DISCARDABLE
BEGIN
POPUP "&File "
BEGIN
MENUITEM "&New ", MENU_FILE_NEW
MENUITEM "&Open ", MENU_FILE_OPEN
MENUITEM "&Save ", MENU_FILE_SAVE
MENUITEM "&Save As... ", MENU_FILE_SAVEAS
MENUITEM "&Exit ", MENU_FILE_EXIT
END
POPUP "&Edit "
BEGIN
MENUITEM "&Undo ", MENU_EDIT_UNDO
MENUITEM "&Redo ", MENU_EDIT_REDO
MENUITEM "&Copy ", MENU_EDIT_COPY
MENUITEM "&Cut ", MENU_EDIT_CUT
MENUITEM "&Paste ", MENU_EDIT_PASTE
MENUITEM "&Delete ", MENU_EDIT_DELETE
END
POPUP "&Help "
BEGIN
MENUITEM "&About Paint... ", MENU_HELP_ABOUT
END
END
然后在程序中:
hMenu = LoadMenu(hThisInstance, TEXT( "MENUPAINT "));
/* The class is registered, let 's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Paint ", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
hMenu, /* Use Menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
这样就搞定菜单了,但问题是我想实现修改菜单资源文件后,不用重新编译程序,就可以生效,不知道如何实现,请指点一下.
[解决办法]
用 AppendMenu,ModifyMenu 等API可以实现对菜单的动态修改。
[解决办法]
如果你指的是修改已经编译好的程序里面的资源,可以用一些资源编辑工具。不过添加什么的就不行了,因为你程序中根本没有响应的代码啊。
[解决办法]
我写过一个动态菜单添加的类,
//.h
#pragma once
#include <vector>
#include <map>
#include <algorithm>
#define MIN_MENU_ID 8888
#define MAX_MENU_ID 9999
typedef struct
{
void (*lpHandler)();
void (*lpUpdate)(CCmdUI*);
}FUNC,*LPFUNC;
typedef struct
{
CString m_strMenuName;
UINT m_dMenuID;
FUNC m_menuHandler;
}DYNAMIC_MENUINFO,*LPDYNAMIC_MENUINFO;
class CDynamicMenuManager
{
public:
CDynamicMenuManager(void);
~CDynamicMenuManager(void);
void Initialize();
void AddPopupMenu(CMenu& targetMenu,std::vector <DYNAMIC_MENUINFO> rgpMenuItemInfos,CString strPopupMenuName);
void AddMenuItems(CMenu& targetMenu,std::vector <DYNAMIC_MENUINFO> rgpMenuItemInfos);
void RemovePopupMenu(CMenu& fromMenu,CString strPopupMenuName);
void RemoveMenuItems(CMenu& fromMenu,std::vector <DYNAMIC_MENUINFO> rgpMenuItemInfos);
void RemoveAllAddedMenu();
void UpdateMenuItemUI(CCmdUI* pCmdUI);
UINT GetValidMenuID();
static LRESULT CALLBACK newWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
protected:
int FindMenuInfoPosFromID(UINT uMenuID,bool bErase = false);
CMenu* GetMenuHandle(CMenu& targetMenu,CString strMenuName,int& nPos);
private:
static std::map <UINT,FUNC> m_rgpHandlers;
std::map <CString,CMenu*> m_rgpPopupMenu;
std::vector <DYNAMIC_MENUINFO> m_rgpMenuItemInfos;
std::vector <UINT> m_rgpMenuID;
HWND m_hWnd;
};