CDialogBar使用手记--一片叶子的世界

来源:百度文库 编辑:神马文学网 时间:2024/04/28 09:05:47
CDialogBar使用手记
关键词:CDialogBar
调试了两天CDialogBar,终于搞定了。其中参考了CSDN上的几篇文章(CSDN还是不错的)。
现在把调试心得写出来。
―――――――――――――――――――――――――――
以下一部分文章来自于CSDN的houen_study,我稍稍修改了一下文字:)
那就使用CDialogBar就可以拥有和CDialog一样的方便和快捷。
步骤1:添加一个CDialogBar派生类
在资源中添加一个对话框,再采用类向导来添加类,找不到CDialogBar作为基类吧,可以先用CDialog作为基类产生一个,然后把所以的“CDialog”替换为“CDialogBar”,替换完成了。编译一下,^_^有错误吧!!(当然有错误,CDialogBar是从CControlBar中继承过来的,不是从CDialogBar继承过来的,不能直接替换)请看步骤2。
步骤2:解决编译错误并完善该类
其实错误就是构着函数调用基类时有问题,: CDialogBar(/*CDlgBar::IDD, pParent*/) 象这样注释掉就可以了,添加一个类似OnInitDialog的函数,在CDialogBar中是不存在OnInitDialog的消息的,至少我还不知道。
因为初始化是在创建后调用的,所以我们就重写virtual BOOL Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID);这个函数。注意哦用向导添加的Create函数的参数是不对的喔,要按照上面的修改过来。
下面是实现代码(很简单的)
BOOL CDlgXXX::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID)
{
// TODO: Add your specialized code here and/or call the base class
BOOL bRes= CDialogBar::Create(pParentWnd,nIDTemplate,nStyle,nID );
InitDialogBar();//在类中添加一个成员函数就可以了
return bRes;
}
BOOL CDlgXXX::InitDialogBar()
{
UpdateData(FALSE);//这个一定要啊,这样就会有和CDialog一样的数据交换效果了
return TRUE;
}
其实你也可以不用添加成员函数,只用类向导添加一个OnInitDialog ()函数,然后把CDialogBar::OnInitDialog();这句话注释掉,呵呵,因为CControlBar没有OnInitDialog()。然后添加UpdateData(FALSE);这句话就可以了,在UpdateData后面添加其他的控件初始化的工作就可以了。最后不要忘记在Create函数中显式的调用OnInitDialog()函数。
步骤3:创建和使用
在CMainFrame的OnCreate函数中就可以创建和使用了
if (!m_barAttrib.Create(this,IDD_DLG_COM_ATTRIB,
CBRS_RIGHT|CBRS_GRIPPER, XXX))
{
TRACE0("Failed to create dialogbar\n");
return -1;
}
XXX是一个资源id手工直接在资源的.h文件中添加一条。
步骤4:在添加CDialogBar上添加控件
在你创建的Dialog上面放一个按钮,运行程序试一试,怎么按钮是灰色的,即使在Dialog中添加了响应事件,也没有用。这个问题困扰了我好长时间,最后在CSDN上找到答案。按钮消息不是发到Dialog上,而是直接发给CMainFrame上,也就是说cdialogbar上面的按钮消息只有映射到CMainframe上面才好使。这回你在CMainframe上面处理消息看看,满意了吧。
在CSDN上有人是这么做的:
----------------------------------------------------
这个问题我也遇到过,dialogbar上的控件消息可以直接由Mainframe类处理,如果通过派生CDialogBar类来处理消息的话有时确实会出现明明映射了消息处理函数,但控件就是灰色。
我是这么解决的,在MainFrame里为控件再做一次消息映射,但处理函数里什么都不做,这样控件一定是已经enable了,这时候如果在DialogBar派生类里也做了消息映射那么你的处理函数就已经起作用了。
也就是说在dialogbar派生类处理控件消息比在mainframe中处理优先级高,但在mainframe中有处理函数一定会将控件enable。
-------------------------------------------------------------
但是当我想改变按钮状态的时候,又出现问题了,如何修改按钮的属性都不行,呵呵,又搞不定了:),继续看。。。。。。
步骤5:如何使CDialogBar上的按钮变灰
用下面的方法可以实现:
先在MainFrm.h中加入一个变量:
bool ENABLE;
并手工加入一个消息函数声明:
afx_msg void OnupdataButton(CCmdUI *pCmdUI);
然后在MainFrm.cpp中:
先在初始化中加入:
ENABLE=true;
手工加入一个消息映射:
ON_UPDATE_COMMAND_UI(IDC_BUTTON1,OnupdataButton)
再写函数的实现代码:
void CMainFrame::OnupdataButton(CCmdUI *pCmdUI)
{
if(ENABLE)
{
pCmdUI->Enable(0);
}
Else
{
pCmdUI->Enable(1);
}
}
在你想改变此按钮的是否禁用处只要写ENABLE=!ENABLE;就可以了。呵呵,如果想控制多个按钮的话,就需要设定多个BOOL型变量,分别写消息函数。