CDialogBar的创建和使用

发布时间:2017-3-27 2:49:50 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"CDialogBar的创建和使用",主要涉及到CDialogBar的创建和使用方面的内容,对于CDialogBar的创建和使用感兴趣的同学可以参考一下。

http://blog.csdn.net/ljt350740378/article/details/6433141 CDialogBar的创建和使用 一个朋友让我看一个关于DialogBar的程序,问题是在一个DialogBar中添加一个Tree Control控件,在初始化函数OnInitDialog中使用InsertItem添加一项,结果运行后,始终在DialogBar中显示不出来,后来我又加入了一个Button测试,结果Button是灰色的,根本不能点击。在OnInitDialog中加入断点,程序根本执行不到这个函数。按理说,界面已经显示出来了,早应该调用OnInitDialog函数了。当时百思不得其解。 后来在网上查了一下,才知道CDialogBar根本没有重载OnInitDialog这个函数(你查一下MSDN,就知道CDialog是重载了这个函数的),所以导致我虽然有这个函数,但是始终不调用。这就需要我手动添加这个消息映射。我通过ON_MESSAGE宏,映射了这个消息响应函数,运行结果没问题,Tree Control中有我添加的项了。 剩下的就是Button不能用的问题了。通过网上和自己试验,知道在DialogBar中,Button发出的消息根本就不通过DialogBar,而是直接发到MainFrame中,所以只要在MainFrame中进行响应或者把消息再转发到DialogBar中就可以了。我在CMainFrame类中重载了OnCmdMsg这个函数,在这个函数中,先用DialogBar去拦截消息,这样,只需要在DialogBar中取相应Button的消息就可以了。 下面是我做试验的大致过程: 1、 创建一个单文档的MFC工程,名为MyDialogBar。 2、 要使用DialogBar,当然首先要在ResourceView中添加一个DialogBar了。添加好了DialogBar,ID采用默认的IDD_DIALOGBAR,至于它的properties,就采用默认的好了。 3、 添加一个Tree Control,ID为IDC_TREE,在它的properties对话框Styles选项卡中选择Has buttons、Has lines、Lines at root三个选项,看起来就比较正常了。 4、 然后为这个DialogBar添加一个类,类名为CDlgBar,继承自CDialog,因为在向导中没有CDialogBar这个基类。然后把它的WM_INITDIALOG消息响应函数加上,记住这时我们的DialogBar还是一个CDialog的子类呢。然后给Tree Control映射变量m_tree。 5、 下面就轮到对我们自己的DialogBar动手脚了。 (1)首先中把CDlgBar的基类改成CDialogBar,然后在.cpp文件中,把CDialogBar的构造函数的对CDialog的构造函数去掉,即: 将CDlgBar::CDlgBar(CWnd* pParent /*=NULL*/):CDialog(CDlgBar::IDD, pParent)修改为 CDlgBar::CDlgBar(CWnd* pParent /*=NULL*/) (2)然后把DoDataExchange函数中的CDialog::DoDataExchange(pDX);一句改成CDialogBar::DoDataExchange(pDX);。 (3)把BEGIN_MESSAGE_MAP(CDlgBar, CDialog)中的CDialog改成CDialogBar。 (4)把OnInitDialog函数中的CDialog::OnInitDialog();一句去掉。 6、 在OnInitDialog中添加向Tree Control中插入数据的语句: BOOL CDlgBar::OnInitDialog() {     HTREEITEM hParent = m_tree.InsertItem("parent");     m_tree.InsertItem("boy", hParent);     m_tree.InsertItem("girl", hParent);     return TRUE; // return TRUE unless you set the focus to a control                            // EXCEPTION: OCX Property Pages should return FALSE } 7、 在CMainFrame中添加一个变量:CDlgBar m_wndDlgBar;,当然不能忘了include进头文件DlgBar.h。然后在它的OnCreate函数中创建DialogBar。添加如下语句: if (!m_wnd              DlgBar.Create(this, IDD_DIALOGBAR, WS_CHILD | WS_VISIBLE |                                CBRS_LEFT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |                                CBRS_SIZE_DYNAMIC, IDD_DIALOGBAR)) {         TRACE0("Failed to create dialogbar/n");        return -1;      // fail to create } m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndDlgBar); 这是你可以运行一下,就会看到DialogBar虽然已经加入了,但是里面的tree control中什么都没有。在CDlgBar的OnInitDialog函数中设置断点,调试,也进入不到这个函数中。 8、 这时,你可以在CDlgBar中为WM_INITDIALOG消息映射我们的OnInitDialog函数。这样,当WM_INITDIALOG消息发送到CDlgBar中就可以响应了。 BEGIN_MESSAGE_MAP(CDlgBar, CDialogBar)              //{{AFX_MSG_MAP(CDlgBar)             ON_MESSAGE(WM_INITDIALOG, OnInitDialog)             //}}AFX_MSG_MAP END_MESSAGE_MAP()               这时,你运行一下,就会看到一个断言错误。 在OnInitDialog函数中一开始添加UpdateData(FALSE);,这时你再运行,就会看到我们的tree control中有东西了。 那么这个UpdateData(FALSE);到底干了什么呢?MSDN上说当参数为FALSE时,会调用DoDataExchange函数,对控件进行初始化,当参数为TRUE时,从控件中获取值。 9、 在ResourceView中DialogBar中添加一个按钮,ID为IDC_BTN_TEST,并添加单击响应函数OnBtnTest。里面使用MessageBox(“OK”)来表示响应单击消息。 运行一下,可以看到,按钮是灰色的。 10、 原因是Button的消息发送到了MainFrame,到底有些什么消息,我还不是很清楚。这个问题的解决方法就是在CMainFrame中重载一个函数OnCmdMsg,并在这里面拦截消息发送到我们的CDlgBar中。 BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra,            AFX_CMDHANDLERINFO* pHandlerInfo) {     if(m_wndDlgBar.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))     {             return TRUE;     }     return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } 运行一下我们的程序,就可以看到没有问题了。 11、顺便添加一个tree control的选择消息TVN_SELCHANGED响应函数。在向导里面,选择IDC_TREE,添加它的TVN_SELCHANGED响应函数OnSelchangedTree。如下代码: void CDlgBar::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) {             NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;             HTREEITEM hSelItem = pNMTreeView->itemNew.hItem;// 选择的项             CString strSelText = m_tree.GetItemText(hSelItem);             MessageBox(strSelText);              *pResult = 0; }

上一篇:Unity实现 场景切换 音乐不断
下一篇:

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款