引自:http://www.vckbase.com/document/viewdoc/?id=265
在Dialog中使用Menu和Toolbar
作者:xujian
本文適合初學者 我們先建立一個基於Dialog 的程序,我給他起了個名字叫:DlgMenuToolbar。 一、如何往基於Dialog的程序添加菜單 [1.1] 先添加菜單(IDR_MENU1)資源,並加上需要的菜單項。 [1.2] 編輯對話框資源IDD_DLGMENUTOOLBAR_DIALOG的屬性,在屬性對話框中選擇IDR_MENU1即可。 [1.3] 假如您不希望在對話框屬性中直接設置菜單,而通過代碼在程序中動態生成可以採用如下方法: [1.3.1]在CDlgMenuToolbarDlg類聲名中添加成員變量CMenu m_menu二、如何往基於Dialog的程序添加工具欄 [2.1] 先添加工具欄(IDR_TOOLBAR1)資源,並畫好各個按鈕。 [2.2] 在CDlgMenuToolbarDlg類聲名中添加成員變量 CToolBar m_wndtoolbar; [2.3] 在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代碼 //添加一個平面工具條 if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(4,4,0,0)) || !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) ) { TRACE0("failed to create toolbar/n"); return FALSE; } m_wndtoolbar.ShowWindow(SW_SHOW); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);三、爲工具欄添加工具提示 [3.1] 在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() [3.2] 在CDlgMenuToolbarDlg.cpp添加函數的實現代碼 //工具欄提示 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[512]; 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 != 0) //不爲分隔符 { strTipText.LoadString(nID); strTipText = strTipText.Mid(strTipText.Find(''/n'',0)+1); #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, strTipText,sizeof(pTTTA->szText)); } else { lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #endif *pResult = 0; // 使工具條提示窗口在最上面 ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE| SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return TRUE; }[3.3] 在CDlgMenuToolbarDlg.cpp中添加消息映射,請看如下代碼中的黑體部分 BEGIN_MESSAGE_MAP(CDlgMenuToolbarDlg, CDialog) //{{AFX_MSG_MAP(CDlgMenuToolbarDlg) ON_WM_PAINT() ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText ) //}}AFX_MSG_MAP END_MESSAGE_MAP() 四、其它 爲了使你的程序看起來更酷,還可以在CDlgMenuToolbarDlg::OnPaint()中修改代碼實現Dialog 填充顏色。 CPaintDC dc(this); CRect rect; GetClientRect(rect); dc.FillSolidRect(rect, RGB(60,110,170)); 好了,編譯運行看看效果吧!希望本文能夠給您一些提示! |