zoukankan      html  css  js  c++  java
  • 关于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上,添加一个列表框,和编辑栏,或者其它的空间,并对其进行响应。这里我就不多说了。下面这个图片,是我编写完成之后的效果。

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/mysunnyday/p/2341867.html
Copyright © 2011-2022 走看看