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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 364 ::
收藏到网摘: 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