环境:VC6.0 SP6
最近在一个程序需要用到CDialogBar,于是按照一般步骤,先在资源视图中添加了一个Dialog,定义好了ID。然后添加了一些需要的EDIT_BOX和COMBOBOX。
由于需要初始化其中的一些控件,于是按照CDialog的方式开始用ClassWizard添加控件。此时发现提示“没有关联的类,是否建立一个新的类”。然后很自然的点击了“是”。然后在CMainFrame 中添加了CDialogBar m_dlgBarXXX的声明。等一切准备好,开始编译才发现出现错误!
原因:CDialog不是继承于CDialog的,而是CControlBar。
开始我试着把所有的CDialog都改为CDialogBar,但还是不行。试图从Class Wizard中直接继承于CDialogBar,居然没有CDialogBar这个基类……FT
原因:CDialogBar没有初始化函数OnInitDialog,而且其默认的构造函数也有区别。
如何使用CDialogBar呢?google一下还是有点收获,还是可以通过自己修改解决的。
首先,还是按照正常的方式,在资源对话框中添加CDialogBar的资源,然后以这个ID建立一个CDialog的类CDlgbarXXX。此时这个类是基于CDialog的。
然后,在CDlgBarXXX类中(包括h文件和cpp文件),将所有的CDialog都替换为CDialogBar。并且在cpp文件中的BEGIN_MESSAGE_MAP也做同样的修改。
接着,在cpp文件中,将默认的构造函数改为如下
CDlgBarXXX :: CDlgBarXXX()
{
// ...
}
此时,编译通过就没有问题了……但你会发现不能使用OnInitDialog???
继续,在h文件的//}}AFX_MSG下一行,插入以下代码
afx_msg LONG OnInitDialog(UINT, LONG);
cpp文件中需要在//}}AFX_MSG_MAP下面添加
ON_MESSAGE(WM_INITDIALOG, OnInitDialog)
再在cpp文件中添加下面的代码
LONG CDlgbarXXX::OnInitDialog(UINT wParam, LONG lParam)
{
BOOL bRet = HandleInitDialog(wParam, lParam);
if(!UpdateData(FALSE))
{
TRACE0("Warning, Unalbe to init update./n");
}
// Add Code here
return bRet;
}
另外还有CButton的使用,如果不加其他说明,CButton显示出来将会是灰色,无法点击,即使你用Class Wizard添加了Click的代码。
解决方法:在h文件中添加
afx_msg void OnUpdateButton(CCmdUI * pCmdUI);
在cpp文件中添加消息映射
ON_UPDATE_COMMAND_UI(IDC_BUTTON, OnUpdateButton)
以及响应函数
void CDlgbarXXX::OnUpdateButton(CCmdUI * pCmdUI)
{
pCmdUI -> Enable(TRUE);
}
现在,你就可以象使用CDialog一样,使用CDialogBar了……
参见:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q185672