CDialogBar 使用

来源:互联网 发布:mac apache安装目录 编辑:程序博客网 时间:2024/04/30 07:24
 步骤1:添加一个CDialogBar派生类


    在资源中添加一个对话框,再采用类向导来添加类,找不到CDialogBar作为基类吧,可以先用CDialog作为基类产生一个,然后把所以的“CDialog”替换为“CDialogBar”,替换完成了。编译一下,有错误!!(当然有错误,CDialogBar是从CControlBar中继承过来的,不是从CDialogBar继承过来的,不能直接替换)。

 步骤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文件中添加一条。
m_barAttrib.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_TOP);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_barAttrib,AFX_IDW_DOCKBAR_LEFT);


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



原创粉丝点击