• 关于CDialogBar的编程


            今天编程过程中,涉及到了CDialogBar的编程,在网上看了一些资料,虽然看明白了,但是写的不是很透明,如果对于一个初学者来说,肯定会头疼,下面,我在这里详细的介绍一下这方面的知识,以及怎样编程。

            在CDialogBar编程之前,我们首先要明确一点,CDialogBar是CControlBar派生出来的,而CControlBar又是从CWnd派生出来的,所以CDialogBar并不是从CDialog派生出来的,这点一定注意,它是从CWnd间接派生出来的!明确这一点之后,我们开始写一个CDialogBar的程序。在CDialogBar创建完成之后,我们看上去效果好像和一个CToolBar一样,因此呢,在显示过程中,也有类似CToolBar在窗口中的设置。下面是编程的操作步骤:

    1、首先,我们新建一个工程,工程名字可以随便输入,在这里我们设置为MyDlgBar,进入下一步,选择“单文档应用程序”,然后直接点击完成即可。

    2、我们既然要创建一个CDialogBar,那么我们首先在资源窗口中,插入一个对话框资源,然后我们打开资源向导,这时,向导会提示我们插入的对话框是一个新的资源,它要我们创建这个资源,我们直接点击确定,输入资源名称,这里我输入的是CNewDlgBar,在选择基类的时候呢,我们会发现,并没有我们想要的CDialogBar类,没关系,我们可以选择CDialog这个类,注意:并不是因为CDialog是CDialogBar的基类,而作出这样的选择!而是因为CDialogBar非常的类似dialog box(对话框),CDialogBar也是可以在里面添加控件的,因此我们选择CDialog这个类,选择之后是要进行必要的修改的。修改步骤如下:

            1)在CNewDlgBar的头文件中,在“class CNewDlgBar : public CDialog”这行代码中将“CDialog”更改为CDialogBar,也就是将我们新建的这个类的基类,改为CDialogBar作为基类。

            2)在CNewDlgBar的源文件中,在“CNewDlgBar::CNewDlgBar(CWnd* pParent /*=NULL*/)
    : CDialogBar(CNewDlgBar::IDD, pParent)”中,我们将CDialogBar的参数全部删除,结果是“CNewDlgBar::CNewDlgBar(CWnd* pParent /*=NULL*/)
    : CDialogBar()”,因为在CDialogBar的构造函数中,是没有任何参数的。

    然后我们编译目前的工程,不会再有错误发生了。接下来,我们要创建这个CDialogBar,并且将它在我们的窗口中显示出来。

    3、创建CDialogBar,我们是在Create这个虚函数中完成的。那么我们首先在CNewDlgBar这个类中,增加一个Create虚函数。我们知道,现在我们所做的修改,都是基于CDialog之上进行的,因为在创建的时候,我们是将CDialog作为基类创建的,因此,系统给我们增加的这个函数的参数都是针对CDialog类的,我们也要进行如下修改:

            1)在CNewDlgBar的头文件中,找到定义Create这个虚函数的地方,对参数进行修改,修改结果是:

    virtual BOOL Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID);

            2)在CNewDlgBar源文件中,做同样的修改,修改结果是:BOOL CNewDlgBar::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID) ;

    修改之后,我们就要在里面修改代码,去覆盖基类的Create函数。

    4、添加代码后,结果是:

    BOOL CNewDlgBar::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 );
    OnInitDialog();
    return bRes;
    //return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
    }

    5、细心的人,会看见,我在上面的代码中增加了一个消息处理函数:OnInitDialog();
    这个函数是在窗口创建完成之后发送的,因此我们要对这个消息进行处理。步骤如下:

            1)在CNewDlgBar的头文件中,在

    class CNewDlgBar : public CDialogBar
    {

    。。。。。。

    // Implementation
    protected:

    // Generated message map functions
    //{{AFX_MSG(CNewDlgBar)
    。。。。。。

    //}}AFX_MSG

    //在此处定义
    afx_msg BOOL OnInitDialog ();


    DECLARE_MESSAGE_MAP()

    。。。。。。
    };

    中定义相应消息的函数原形。

            2)在CNewDlgBar的源文件中,定义消息影射,在

    BEGIN_MESSAGE_MAP(CNewDlgBar, CDialogBar)
    //{{AFX_MSG_MAP(CNewDlgBar)
    。。。。。。
    //}}AFX_MSG_MAP

    //在此处定义
    ON_MESSAGE(WM_INITDIALOG, OnInitDialog)
    END_MESSAGE_MAP()

    中定义消息影射。接下来,我们就要编写消息相应代码。

    6、也是在源文件中完成,结果如下:

    BOOL CNewDlgBar::OnInitDialog()   
    {
    UpdateData(FALSE);//数据交换重点.....必须有使得数据可以进行交换
    return TRUE;
    }

    7、万事俱备,只欠东风,我们只要在CMainFrame中,将其创建并且显示就可以了。这段代码,我们是放在CMainFrame的OnCreate函数中完成的,结果如下:

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    。。。。。。

    if (!m_newdlgbar.Create(this, IDD_NEWDLGBAR, CBRS_LEFT | WS_VISIBLE | WS_CHILD | CBRS_GRIPPER, 
          IDD_NEWDLGBAR))
    {
    }
    m_newdlgbar.SetBarStyle(m_wndToolBar.GetBarStyle() | 
          CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
    m_newdlgbar.EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_newdlgbar);

    。。。。。。

    return 0;
    }

         最后还有一步,也是很重要的,就是在资源窗口中,将我们新建的这个窗口的属性,改为child,这步也是很重要的,否则会出现致命的错误!其他的可以随自己意改,一般都选择None即可。

            至此我们便完成了CDialogBar的创建。我们可以在CDialogBar上,添加一个列表框,和编辑栏,或者其它的空间,并对其进行响应。这里我就不多说了。下面这个图片,是我编写完成之后的效果。

  • 相关阅读:
    U1. 广度优先搜索(BFS)和 广度优先搜索(DFS)
    C5. Spring 服务的注册与发现(Spring Cloud Eureka)
    S3. Android 消息推送
    S2. Android 常用控件
    S12. Android 检查更新功能实现
    S1. Android 功能大全
    B9 Concurrent 重入锁(ReentrantLock)
    117.dom2事件
    106.事件的传播机制
    105.事件对象及兼容处理
  • 原文地址:https://www.cnblogs.com/mysunnyday/p/2341867.html
Copyright © 2020-2023  润新知