Windows Mobile下使用Native C++(WTL, MFC, Win32)开发,如何为对话框加入菜单

背景

不像.NET Compact Framework, 使用Native C++开发开发对话框程序默认是没有菜单的,需要手工增加。本文讲述如何为对话框程序加入菜单。

 

.NET Compact Framework

使用.NET Compact Framework的程序,默认增加菜单项(mainMenu1),只要编辑菜单显示,增加处理事件就能操控菜单了,非常方便。

wtl_menu1

 

Native C++

使用Native C++进行开发,情况就大相径庭了。新增的对话框默认是没有菜单的,需要手工增加菜单支持,下面以一个WTL对话框程序作为例子讲述如何加入菜单支持。步骤如下:

1.在资源文件增加菜单。

wtl_menu3

 

2.根据需求编辑菜单。

wtl_menu4

 

3.在对话框生成菜单。

修改OnInitDialog()函数来生成菜单。

LRESULT CConfigDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//AtlCreateEmptyMenuBar(m_hWnd);

SHMENUBARINFO mbi;
ZeroMemory(&mbi, sizeof(SHMENUBARINFO));

mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = m_hWnd;
mbi.nToolBarId = IDR_MENU_CONFIG; //Menu resource ID
mbi.hInstRes = ModuleHelper::GetResourceInstance(); //GetModuleInstance(); //similar as ::AfxGetInstanceHandle(); in MFC
mbi.dwFlags |= SHCMBF_HMENU;

if(!SHCreateMenuBar(&mbi))
{
MessageBox(_T("Fail to create menu."));
}

return bHandled = FALSE;
}

 

4.加入菜单处理事件

在CConfigDialog类的加入事件处理映射。ID_OK和ID_CANCEL分别为菜单项的ID。

BEGIN_MSG_MAP(CConfigDialog)
COMMAND_ID_HANDLER(ID_OK, OnOk)
COMMAND_ID_HANDLER(ID_CANCEL, OnCancel)
END_MSG_MAP()
LRESULT OnOk(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
LRESULT OnCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);

 

在cpp加入处理函数。

LRESULT CConfigDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
MessageBox(_T("OK"));
return 0;
}

LRESULT CConfigDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
MessageBox(_T("Cancel"));
return 0;
}

完成了,如下图。

 wtl_menu2

下面点击OK。

wtl_menu5

作者:Jake LinJake's Blog on 博客园
出处:http://procoder.cnblogs.com

作品Jake Lin创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言
posted @ 2009-11-05 09:14 Jake Lin 阅读(1240) 评论(5) 编辑 收藏

 回复 引用 查看   
#1楼 2009-11-05 09:12 egmkang      
这两天正在看WTL for MFC Programmers,略微有一点能看懂了.
 回复 引用 查看   
#2楼[楼主] 2009-11-05 09:34 Jake Lin      
@egmkang
一起加油。

 回复 引用 查看   
#3楼 2009-11-05 10:22 egmkang      
@Jake Lin
可能我心太急,想瞬间走完别人几年走完的路...

 回复 引用 查看   
#4楼[楼主] 2009-11-05 13:16 Jake Lin      
@egmkang
你是可以的,加油!

 回复 引用 查看   
#5楼 2009-11-06 12:59 minvt      
很棒,关注^_^ 你写的东西都很明了清晰呢