使用位图、图标和颜色的自定义绘制菜单






4.55/5 (8投票s)
2002年9月9日

172101

4717
使用应用程序资源创建所有者绘制菜单
引言
本文档介绍了一种使用Windows XP和图标选择样式的自定义绘制菜单的实现方法。要使用此代码,请下载演示项目。演示项目包含3种菜单样式,演示了如何创建XP菜单和图标选择菜单。要将自定义绘制菜单添加到您自己的项目中,请按照以下6个步骤操作
步骤 1
将以下文件添加到您的项目中
- MenuCH.cpp
- MenuCH.h
第二步
在MainFrm.h中 - 在文件顶部添加此行
#include "MenuCH.h"
步骤 3
在MainFrm.h中 - 添加类型为CMenuCH
的CMainFrame
成员变量。
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
CMenuCH m_FileMenu, m_EditMenu,
m_ViewMenu, m_HelpMenu;
CMenuCH m_ElementMenu;
CMenuCH GraphMenu,ColorMenu;
步骤 4
在MainFrm.cpp中 - 在CMainFrame()
中放置以下语句
/////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_FileMenu.CreatePopupMenu();
m_FileMenu.SetMenuHeight(20);
m_FileMenu.SetMenuWidth(150);
m_FileMenu.SetMenuType(MIT_XP);
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_NEW,
"&New\tCtrl+N",IDB_NEW);
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_OPEN,
"&Open\tCtrl+O",IDB_OPEN);
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_CLOSE,
"&Close");
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_SAVE,
"&Save\tCtrl+S",IDB_SAVE);
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_SAVE_AS,
"Save &As...");
m_FileMenu.AppendMenu(MF_SEPARATOR,0,"");
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_PRINT,
"&Print...",IDB_PRINT);
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_PRINT_PREVIEW,
"Print Pre&view");
m_FileMenu.AppendMenu(MF_ENABLED,ID_FILE_PRINT_SETUP,
"P&rint Setup...");
m_FileMenu.AppendMenu(MF_SEPARATOR,0,"");
m_FileMenu.AppendMenu(MF_ENABLED,ID_APP_EXIT,
"E&xit");
m_EditMenu.CreatePopupMenu();
m_EditMenu.SetMenuHeight(20);
m_EditMenu.SetMenuWidth(165);
m_EditMenu.SetMenuType(MIT_XP);
m_EditMenu.AppendMenu(MF_ENABLED,ID_EDIT_UNDO,
"Redo\tCtrl+Z",IDB_UNDO);
m_EditMenu.AppendMenu(MF_ENABLED,ID_EDIT_REDO,
"Undo\tCtrl+Y",IDB_REDO);
m_EditMenu.AppendMenu(MF_SEPARATOR,0,"");
m_EditMenu.AppendMenu(MF_ENABLED,ID_EDIT_CUT,
"Cut\tCtrl+X",IDB_CUT);
m_EditMenu.AppendMenu(MF_ENABLED,ID_EDIT_COPY,
"Copy\tCtrl+C",IDB_COPY);
m_EditMenu.AppendMenu(MF_ENABLED,ID_EDIT_PASTE,
"Paste\tCtrl+V",IDB_PASTE);
m_ViewMenu.CreatePopupMenu();
m_ViewMenu.SetMenuHeight(20);
m_ViewMenu.SetMenuWidth(170);
m_ViewMenu.SetMenuType(MIT_XP);
m_ViewMenu.AppendMenu(MF_ENABLED,ID_VIEW_TOOLBAR,
"&Toolbar");
m_ViewMenu.AppendMenu(MF_ENABLED,ID_VIEW_STATUS_BAR,
"&Status Bar");
m_HelpMenu.CreatePopupMenu();
m_HelpMenu.SetMenuHeight(20);
m_HelpMenu.SetMenuWidth(160);
m_HelpMenu.SetMenuType(MIT_XP);
m_HelpMenu.AppendMenu(MF_ENABLED,ID_APP_ABOUT,
"&About BmpMenuDemo...",IDB_HELP);
GraphMenu.CreateMenu();
GraphMenu.AppendMenu(MF_ENABLED,ID_GRAPHPART1BOX,"",
NULL,AfxGetApp()->LoadIcon(IDI_LINE));
GraphMenu.AppendMenu(MF_ENABLED,ID_GRAPHPART2BOX,"",
NULL,AfxGetApp()->LoadIcon(IDI_GRAPHIC));
GraphMenu.AppendMenu(MF_ENABLED|MF_MENUBREAK,ID_GRAPHPART3BOX,
"",NULL,AfxGetApp()->LoadIcon(IDI_CIRCLE));
GraphMenu.AppendMenu(MF_ENABLED,ID_GRAPHPART4BOX,"",
NULL,AfxGetApp()->LoadIcon(IDI_POLYGON));
GraphMenu.AppendMenu(MF_ENABLED|MF_MENUBREAK,
ID_GRAPHPART5BOX,"",NULL,AfxGetApp()->LoadIcon(IDI_ARC));
GraphMenu.AppendMenu(MF_ENABLED,ID_GRAPHPART6BOX,"",
NULL,AfxGetApp()->LoadIcon(IDI_TEXT));
m_ElementMenu.CreatePopupMenu();
m_ElementMenu.SetMenuType(MIT_ICON);
m_ElementMenu.AppendMenu(MF_SEPARATOR,0,"");
m_ElementMenu.AppendMenu(MF_POPUP,
(UINT)GraphMenu.m_hMenu,"Element");
ColorMenu.CreatePopupMenu();
ColorMenu.SetMenuHeight(18);
ColorMenu.SetMenuWidth(6);
ColorMenu.SetMenuType(MIT_COLOR);
char clrValue[64];
for(int i=1; i<=16; i++)
{
wsprintf(clrValue,"%d",rgbColors[i-1]);
if( i%4 == 1 )
ColorMenu.AppendMenu(MF_MENUBREAK|MF_ENABLED,
i,clrValue);
else
ColorMenu.AppendMenu(MF_ENABLED,i,clrValue);
}
m_ElementMenu.AppendMenu(MF_POPUP,(UINT)ColorMenu.m_hMenu,
"Colors");
}
步骤 5
在MainFrm.cpp中 - 添加CMainFrame
成员函数CreateMenu()
并放置以下语句
///////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::CreateMenu()
{
CMenu* pMenu = this->GetMenu();
pMenu->RemoveMenu(0,MF_BYPOSITION);
pMenu->RemoveMenu(0,MF_BYPOSITION);
pMenu->RemoveMenu(0,MF_BYPOSITION);
pMenu->RemoveMenu(0,MF_BYPOSITION);
pMenu->RemoveMenu(0,MF_BYPOSITION);
pMenu->InsertMenu(0,MF_BYPOSITION|MF_POPUP,
(UINT)m_FileMenu.m_hMenu,"&File");
pMenu->InsertMenu(1,MF_BYPOSITION|MF_POPUP,
(UINT)m_EditMenu.m_hMenu,"&Edit");
pMenu->InsertMenu(2,MF_BYPOSITION|MF_POPUP,
(UINT)m_ViewMenu.m_hMenu,"&View");
pMenu->InsertMenu(3,MF_BYPOSITION|MF_POPUP,
(UINT)m_HelpMenu.m_hMenu,"&Help");
pMenu->InsertMenu(4,MF_BYPOSITION|MF_POPUP,
(UINT)m_ElementMenu.m_hMenu,"&Element");
}
步骤 6
在MainFrm.cpp中 - 在CMainFrame::OnCreate
中调用CreateMenu()
。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
...
CreateMenu();
}
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。