Mobile 上实现基于对话框的带图标的自绘菜单
几经折磨,终于功成,放这里以作备份,也希望对其他需要的朋友有所帮助。
说明:
mobile项目中要求实现带图标的菜单,也没仔细调查,直接调用现成的SetMenuItemBitmaps,结果一编译,惨啦,mobile不支持。于是Google查找,找到Brent Corkum的BCMenu,功能好强大呀,赶紧移过来,一编译,里面又是一堆东西通不过,特别是碰到“NONCLIENTMETRICS”未定义(NONCLIENTMETRICS,是什么,有谁知道,能告诉我一下吗。),气馁了,准备不用它了。从头来过,继续找啊找,又找到了querw的TBCMenu,代码一看,呀,还是要用到BCMenu呀。虽然没能直接用,但是对自绘菜单有了个了解了。继而进入郑恒 (lbird)的MenuEx,终于能编译通过了,可惜的是,不是基于对话框的,好吧,也就这么移过来吧。因为接触win编程不久,没经验。发现只要一添加ON_WM_INITMENU,编译就出错啊,一看。晕,,,mobile上又不能用。这下傻了。该怎么办呢。。。。
Fish说只需要处理 :
//WM_DRAWITEM:绘制菜单的样式
//WM_MEASUREITEM:指定要绘制菜单的大小
//WM_INITMENU:把框架菜单全部改成带MF_OWNERDRAW标志
就可以了,可是WM_INITMENU不支持呀,还有怎么改成带MF_OWNERDRAW标志呢?经过一番查找,原来mobile支持ON_WM_INITMENUPOPUP,嘿嘿嘿,OK了,正好满足我的需求。。。。开足马力开始调试了。。。。
部分代码:
在头文件中包含MenuEx.h,添加成员变量: CToolBar m_wndToolBar; CMenuEx m_menu;
BEGIN_MESSAGE_MAP(CIconMenuDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
ON_WM_DRAWITEM()
ON_WM_MEASUREITEM()
ON_WM_INITMENUPOPUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CIconMenuDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
BOOL b = m_wndToolBar.Create(this);
BOOL b1 = m_wndToolBar.LoadToolBar(IDR_TOOLBAR1);
m_menu.LoadMenu(IDR_MENU1);
CMenu *p = m_menu.GetSubMenu(0);
p->TrackPopupMenu(TPM_TOPALIGN, 10, 110,this);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CIconMenuDlg::OnInitMenuPopup(CMenu* pPopupMenu,UINT nIndex,BOOL bSysMenu )
{
m_menu.InitPopupMenu(pPopupMenu,IDR_TOOLBAR1,&m_wndToolBar);
}
void CIconMenuDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(!nIDCtl) m_menu.DrawItem(lpDrawItemStruct);
}
void CIconMenuDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if(!nIDCtl) m_menu.MeasureItem(lpMeasureItemStruct);
}
参考:
- 《自绘菜单的实现》作者:querw
http://www.vckbase.com/document/viewdoc/?id=1200 - 《一种漂亮的自绘菜单》作者:郑恒 (lbird)
http://www.vckbase.com/document/viewdoc/?id=537 - 《简单实现菜单自绘》作者:Fish
http://blog.csdn.net/Blue_Dream_/archive/2009/02/03/3860881.aspx - 《Cool Owner Drawn Menus with Bitmaps》By Brent Corkum
http://blog.csdn.net/Blue_Dream_/archive/2009/02/03/3860881.aspx