背景
不像.NET Compact Framework, 使用Native C++開發開發對話方塊程式預設是沒有菜單的,需要手工增加。本文講述如何為對話方塊程式加入菜單。
.NET Compact Framework
使用.NET Compact Framework的程式,預設增加功能表項目(mainMenu1),只要編輯菜單顯示,增加處理事件就能操控菜單了,非常方便。
Native C++
使用Native C++進行開發,情況就大相徑庭了。新增的對話方塊預設是沒有菜單的,需要手工增加菜單支援,下面以一個WTL對話方塊程式作為例子講述如何加入菜單支援。步驟如下:
1.在資源檔增加菜單。
2.根據需求編輯菜單。
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;
}
完成了,如。
下面點擊OK。