打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

CDialogBar使用手记

关键词CDialogBar                                          

调试了两天CDialogBar,终于搞定了。其中参考了CSDN上的几篇文章(CSDN还是不错的)。

现在把调试心得写出来。

―――――――――――――――――――――――――――

以下一部分文章来自于CSDNhouen_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:创建和使用

CMainFrameOnCreate函数中就可以创建和使用了

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型变量,分别写消息函数。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DialogBar的用法技巧
打造完美的DialogBar(转贴)
白乔原创:VC之美化界面篇
VC常用控件简介 - 电脑编程技巧与维护
MFC中回车,空格,ESC,F1键盘操作对对话框的影响处理
VC窗体设计集锦
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服