在Dialog中使用Menu和Toolbar

在用VC编程时,界面制作远不如Delphi、VB轻易。我又经常用到基于Dialog编写应用程序。而在直接在Dialog利用Toolbar和Menu的资料很少。而我有机会可以总结一些经验,供大家分享,希望能得到见教。

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

一、怎样往基于Dialog的程序添加manu

[1.1] 先添加manu(IDR_MENU1)资源,并加上需要的manu项。
[1.2] 编纂对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性,在属性对话框中选择IDR_MENU1即可。
 

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

[1.3.1]在CDlgMenuToolbarDlg类声名中添加成员变量CMenu m_menu
再在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码:
//加载manum_menu.LoadMenu(IDR_MENU1);//设置当前manuSetMenu(&m_menu);//当你不需要manu时可以用 SetMenu(NULL);来打消当前manu二、怎样往基于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_MAPEND_MESSAGE_MAP()
四、其它
为了使你的程序看起来更酷,还可以在CDlgMenuToolbarDlg::OnPaint()中修改代码实现Dialog 填充颜色。

CPaintDC dc(this);CRect rect; GetClientRect(rect); dc.FillSolidRect(rect, RGB(60,110,170));
好了,编译运行看看效果吧!希望本文能够给您一些提示!

转载于:https://www.cnblogs.com/MVC2/archive/2009/06/20/1507403.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值