cplusplus

CDialogBar(转)

上一篇 / 下一篇  2011-11-08 10:02:23 / 个人分类:VC

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;

}

http://hi.baidu.com/hbmubai/blog/item/20e94458f6e64489800a18a9.html

TAG: CDialogBar

 

评分:0

我来说两句

Open Toolbar