在Dialog中使用Menu和Toolbar

来源:互联网 发布:食品淘宝怎么上传 编辑:程序博客网 时间:2024/05/17 06:38
前言
在用VC编程时,界面制作远不如Delphi、VB容易。我又常常用到基于Dialog编写应用程序。而在直接在Dialog使用Toolbar和Menu的资料很少。而我有机会可以总结一些经验,供大家分享,希望能得到指教。

运行效果如下图:
外观图
 

我们先建立一个基于Dialog 的程序,我给他起了个名字叫:DlgMenuToolbar。

一、如何往基于Dialog的程序添加菜单
[1.1] 先添加菜单(IDR_MENU1)资源,并加上需要的菜单项。
[1.2] 编辑对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性,在属性对话框中选择IDR_MENU1即可。
  预览

[1.3] 假如您不希望在对话框属性中直接设置菜单,而通过代码在程序中动态生成可以采用如下方法:

[1.3.1]在CDlgMenuToolbarDlg类声名中添加成员变量CMenu m_menu
再在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码:
  1. //加载菜单
  2. m_menu.LoadMenu(IDR_MENU1);
  3. //设置当前菜单
  4. SetMenu(&m_menu);
  5. //当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单
复制代码
二、如何往基于Dialog的程序添加工具栏
[2.1] 先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
[2.2] 在CDlgMenuToolbarDlg类声名中添加成员变量 CToolBar m_wndtoolbar;
[2.3] 在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码
  1. //添加一个平面工具条
  2. if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT ,  WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS,
  3.     CRect(4,4,0,0)) ||        !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )
  4. {
  5.         TRACE0("failed to create toolbar/n");
  6.         return FALSE;
  7. }
  8. m_wndtoolbar.ShowWindow(SW_SHOW);
  9. RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
复制代码
三、为工具栏添加工具提示
[3.1] 在CDlgMenuToolbarDlg类定义中手工添加消息映射函数的定义,如下黑体部分
  1. //{{AFX_MSG(CDlgMenuToolbarDlg)
  2.         virtual BOOL OnInitDialog();
  3.         afx_msg void OnPaint();
  4.         afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
  5.         //}}AFX_MSG
  6.         DECLARE_MESSAGE_MAP()
复制代码
[3.2] 在CDlgMenuToolbarDlg.cpp添加函数的实现代码
  1. //工具栏提示
  2. BOOL CDlgMenuToolbarDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
  3. {
  4.         ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
  5.        
  6.         // UNICODE消息
  7.         TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
  8.         TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
  9.         //TCHAR szFullText[512];
  10.         CString strTipText;
  11.         UINT nID = pNMHDR->idFrom;
  12.        
  13.         if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
  14.                 pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
  15.         {
  16.                 // idFrom为工具条的HWND
  17.                 nID = ::GetDlgCtrlID((HWND)nID);
  18.         }
  19.        
  20.         if (nID != 0) //不为分隔符
  21.         {
  22.                 strTipText.LoadString(nID);
  23.                 strTipText = strTipText.Mid(strTipText.Find(''/n'',0)+1);
  24.                
  25. #ifndef _UNICODE
  26.                 if (pNMHDR->code == TTN_NEEDTEXTA)
  27.                 {
  28.                         lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
  29.                 }
  30.                 else
  31.                 {
  32.                         _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
  33.                 }
  34. #else
  35.                 if (pNMHDR->code == TTN_NEEDTEXTA)
  36.                 {
  37.                         _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
  38.                 }
  39.                 else
  40.                 {
  41.                         lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
  42.                 }
  43. #endif
  44.                
  45.                 *pResult = 0;
  46.                
  47.                 // 使工具条提示窗口在最上面
  48.                 ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
  49.                         SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
  50.                 return TRUE;
  51.         }
  52.         return TRUE;
  53. }
复制代码
[3.3] 在CDlgMenuToolbarDlg.cpp中添加消息映射,请看如下代码中的黑体部分
  1. BEGIN_MESSAGE_MAP(CDlgMenuToolbarDlg, CDialog)
  2.         //{{AFX_MSG_MAP(CDlgMenuToolbarDlg)
  3.         ON_WM_PAINT()
  4.         ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
  5.         //}}AFX_MSG_MAP
  6. END_MESSAGE_MAP()
复制代码
四、其它
为了使你的程序看起来更酷,还可以在CDlgMenuToolbarDlg::OnPaint()中修改代码实现Dialog 填充颜色。
  1. CPaintDC dc(this);
  2. CRect rect;
  3. GetClientRect(rect);
  4. dc.FillSolidRect(rect, RGB(60,110,170));
复制代码

好了,编译运行看看效果吧!希望本文能够给您一些提示!

本文章转自VC驿站。

原创粉丝点击