首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

动态菜单的有关问题

2012-01-16 
动态菜单的问题WIN32开发时,通过资源文件定义菜单,如下:#includeResource.hpp MENUPAINTMENUDISCARDABLE

动态菜单的问题
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;
};

热点排行