在Dialog中使用Menu和Toolbar

来源:互联网 发布:淘宝开放平台api 申请 编辑:程序博客网 时间:2024/06/06 12:27

本文适合初学者

前言

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

大小:11.2K

运行效果如下图

 

我们先建立一个基于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() 中添加如下代码

01.//添加一个平面工具条
02.if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT ,  WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS,
03.CRect(4,4,0,0)) ||  !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )
04.{
05.TRACE0("failed to create toolbar\n");
06.return FALSE;
07.}
08.m_wndtoolbar.ShowWindow(SW_SHOW);
09.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(); <b>afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);</b> //}}AFX_MSG
4.DECLARE_MESSAGE_MAP()

[3.2] 在CDlgMenuToolbarDlg.cpp添加函数的实现代码

01.//工具栏提示
02.BOOL CDlgMenuToolbarDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
03.{
04.ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
05. 
06.// UNICODE消息
07.TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
08.TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
09.//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中添加消息映射,请看如下代码中的黑体部分

view source
print?
1.BEGIN_MESSAGE_MAP(CDlgMenuToolbarDlg, CDialog)
2.//{{AFX_MSG_MAP(CDlgMenuToolbarDlg)
3.ON_WM_PAINT() <b>ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )</b> //}}AFX_MSG_MAP
4.END_MESSAGE_MAP()

四、其它

为了使你的程序看起来更酷,还可以在CDlgMenuToolbarDlg::OnPaint()中修改代码实现Dialog 填充颜色。

1.CPaintDC dc(this);
2.CRect rect;
3.GetClientRect(rect);
4.dc.FillSolidRect(rect, RGB(60,110,170));

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

原创粉丝点击