在Dialog中使用Menu和Toolbar 作者:xujian 我们先建立一个基于Dialog 的程序我给他起了个名字叫:DlgMenuToolbar 一如何往基于Dialog的程序添加菜单 [] 先添加菜单(IDR_MENU)资源并加上需要的菜单项 [] 编辑对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性在属性对话框中选择IDR_MENU即可 [] 假如您不希望在对话框属性中直接设置菜单而通过代码在程序中动态生成可以采用如下方法: []在CDlgMenuToolbarDlg类声名中添加成员变量CMenu m_menu 再在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码//加载菜单m_menuLoadMenu(IDR_MENU);//设置当前菜单SetMenu(&m_menu);//当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单 二如何往基于Dialog的程序添加工具栏 [] 先添加工具栏(IDR_TOOLBAR)资源并画好各个按钮 [] 在CDlgMenuToolbarDlg类声名中添加成员变量 CToolBar m_wndtoolbar; [] 在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码//添加一个平面工具条if (!m_wndtoolbarCreateEx( thisTBSTYLE_FLAT WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS CRect()) || !m_wndtoolbarLoadToolBar(IDR_TOOLBAR) ){ TRACE("failed to create toolbar\n"); return FALSE;}m_wndtoolbarShowWindow(SW_SHOW);RepositionBars(AFX_IDW_CONTROLBAR_FIRST AFX_IDW_CONTROLBAR_LAST ); 三为工具栏添加工具提示 [] 在CDlgMenuToolbarDlg类定义中手工添加消息映射函数的定义如下黑体部分//{{AFX_MSG(CDlgMenuToolbarDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg BOOL OnToolTipText(UINT NMHDR* pNMHDR LRESULT* pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP() [] 在CDlgMenuToolbarDlgcpp添加函数的实现代码//工具栏提示BOOL CDlgMenuToolbarDlg::OnToolTipText(UINT NMHDR* pNMHDR LRESULT* pResult){ ASSERT(pNMHDR>code == TTN_NEEDTEXTA || pNMHDR>code == TTN_NEEDTEXTW); // UNICODE消息 TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; //TCHAR szFullText[]; CString strTipText; UINT nID = pNMHDR>idFrom; if (pNMHDR>code == TTN_NEEDTEXTA && (pTTTA>uFlags & TTF_IDISHWND) || pNMHDR>code == TTN_NEEDTEXTW && (pTTTW>uFlags & TTF_IDISHWND)) { // idFrom为工具条的HWND nID = ::GetDlgCtrlID((HWND)nID); } if (nID != ) //不为分隔符 { strTipTextLoadString(nID); strTipText = strTipTextMid(strTipTextFind(;;\n;;)+); #ifndef _UNICODE if (pNMHDR>code == TTN_NEEDTEXTA) { lstrcpyn(pTTTA>szText strTipText sizeof(pTTTA>szText)); } else { _mbstowcsz(pTTTW>szText strTipText sizeof(pTTTW>szText)); }#else if (pNMHDR>code == TTN_NEEDTEXTA) { _wcstombsz(pTTTA>szText strTipTextsizeof(pTTTA>szText)); } else { lstrcpyn(pTTTW>szText strTipText sizeof(pTTTW>szText)); }#endif *pResult = ; // 使工具条提示窗口在最上面 ::SetWindowPos(pNMHDR>hwndFrom HWND_TOP SWP_NOACTIVATE| SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return TRUE;} [] 在CDlgMenuToolbarDlgcpp中添加消息映射请看如下代码中的黑体部分BEGIN_MESSAGE_MAP(CDlgMenuToolbarDlg CDialog) //{{AFX_MSG_MAP(CDlgMenuTo |