当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 在Dialog中使用Menu和Toolbar

VC++
用VC++创建自定义向导程序
自定义 CRichEditCtrl 控件
Office 2000 风格的停泊、智能型菜单
黑客攻击手段之偷梁换柱
完善 CPopupText 类
让工具条显示256色图像
定制编辑框的上下文菜单
列表控件排序功能的实现
一个优秀的网格控件CGridCtrl
如何用代码动态添加控件
如何在编辑框中使用IAutoComplete接口
应用程序中添加“Coolbars”的简单方法
介绍一个有Toolbar功能的可重用类 CPopupText
在工具栏按钮上添加文本标签
类似Dreamweaver的颜色选择器
如何设置ListView控件的完全行(Full Row)选项
如何enable/disable菜单项
关于CEdit控件的透明 --作者:monsoon
动态菜单项、状态条提示、工具条提示问题
CAnimateCtrl::Open的使用问题

VC++ 中的 在Dialog中使用Menu和Toolbar


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 388 ::
收藏到网摘: n/a

在Dialog中使用Menu和Toolbar
作者:xujian

本文适合初学者

前言
在用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() 中添加如下代码:
//加载菜单m_menu.LoadMenu(IDR_MENU1);//设置当前菜单SetMenu(&m_menu);//当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单
二、如何往基于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(CDlgMenuTo