当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 在对话框程序中插入DialogBar

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

VC++ 中的 在对话框程序中插入DialogBar


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

在对话框程序中插入DialogBar
作者:徐建鹏

下载本文示例源代码

程序运行效果图如下:


在基于MainFrm程序中加入DialogBar很方便,大家都知道,DialogBar有着工具条无法比拟的优越性,它可以任意放置控件,轻松实现如WPS OFFICE的导航功能。但是在基于Dialog的程序怎么实现这种导航功能呢?本文拟针对这个问题提出解决的办法,将困扰本人很久的问题的解决方法和大家一同分享。
大家都知道,CDialogBar不能在Dialog程序中产生的原因是Dialog中没有MainFrm,所以我就从CMiniFrameWnd产生了自己的一个类CMyMiniFrm。
BOOL CMyMiniFrm::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) {	// pass those up in the dialog to leave the OnUpdateUI mechanism to flow	BOOL br = GetParent()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);	// leave the default proc to handles the tooltip updating mechanism	CMiniFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);	return br;	// return what the parent returns}
然后,我们可以从Cstatic产生自己的生成Cdialog类了,其中创建CDialogBar的代码如下
void CStTbar::PreSubclassWindow() {	CStatic::PreSubclassWindow();	RECT rt; GetWindowRect(&rt);	GetParent()->ScreenToClient(&rt);	// hide the place holder, no not destro it I need it to rerout the messages	ShowWindow(SW_HIDE);	// make it on the heap as long CMyMiniFrm::OnNcDestroy call ''delete this''	// save me to map one more message	m_minifrm = new CMyMiniFrm();	m_minifrm->Create( AfxRegisterWndClass(0,0,0),	"",WS_VISIBLE|WS_CHILD,rt,GetParent()/*of placeholder*/);	{	// Initialize dialog bar m_wndMyDialogBar	if (!m_wndMyDialogBar.Create(m_minifrm, GetDlgCtrlID(),	CBRS_RIGHT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,	CG_ID_VIEW_MYDIALOGBAR))	{	TRACE0("Failed to create dialog bar m_wndMyDialogBar\n");	return;	// fail to create	}	m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);	m_minifrm->EnableDocking(CBRS_ALIGN_ANY);	if(rt.right-rt.left > rt.bottom-rt.top)	m_minifrm->DockControlBar(&m_wndMyDialogBar,CBRS_ALIGN_LEFT);	else	// dock verically	m_minifrm->DockControlBar(&m_wndMyDialogBar,CBRS_ALIGN_RIGHT);	m_minifrm->RecalcLayout();	//m_minifrm->DockControlBar(&m_wndMyDialogBar);	}}
然后,我们还要解决消息传递问题。
void CStTbar::PreTranslate(MSG* pMsg){	// forward this to the toolbar	//	if(m_wndMyDialogBar.IsWindowVisible())	m_wndMyDialogBar.OnUpdateCmdUI(m_minifrm,TRUE);}

这样一个在对话框中产生DialogBar的类基本完成。
然后在要使用DialogBar的对话框中增加一个STATIC控件,定义成和准备当作DialogBar使用的Dialog一样的ID号,再给STATIC控件增加CstTbar型的Contrl变量,就可以使用了。

另外,我们只要为该DialogBar创建一个类,在该类中就可以像操作普通对话框一样在ClassWizard中对各控件进行操作或处理各种消息。