【MFC】【停靠窗口】的建立及其内部【控件的嵌入】

来源:互联网 发布:矩阵的张量积的行列式 编辑:程序博客网 时间:2024/06/05 16:32

以VS2010为例,创建一个MFC多文档应用程序,在第二步Aplication Type中的Project style选Visual Studio风格。然后点Finish。

这个模板程序创建了FileView、ClassView、OutputWnd、PropertiesWnd这4个停靠窗口。下面以ClassView为例说明停靠窗口及其内部控件的建立过程。

 一、建立停靠窗

1、以CDockablePane为基类,创建ClassView类,类名为CClassView

 2、在主框架类CMainFrame(位于MainFrm.h)中定义CClassView 的对象m_wndClassView(稍后在CClassView 中会看到一个CViewTree的对象与此对象同名,注意他们的含义是不同的),ClassView这个停靠窗口就是主框架创建过程中,用m_wndClassView这个对象创建的。

 3、在MainFrm.cpp的OnCreate函数内的// Enable enhanced windows management dialog 之前创建停靠窗ClassView。语句如下:

if (!m_wndClassView.Create(_T( "Title" ), this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_CLASSVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
 {
  TRACE0("Failed to create Class View window\n");
  return FALSE; // failed to create
 }

        m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);  

        DockPane(&m_wndClassView);

 注:第一个参数是停靠窗口的标题

        this表示在当前位置(也就是主框架)创建此停靠窗

        CRect(0, 0, 200, 200)表示ClassView在悬浮状态时的默认大小

         ID_VIEW_CLASSVIEW是本停靠窗口的资源ID

         WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI  这些是停靠窗的一些风格设置

 至此,停靠窗口ClassView  就建好了。

 二、在停靠窗中嵌入树形控件     

1、用Class Wizard添加类CViewTree,基类设为CTreeCtrl

2、在ClassView.h中包含CViewTree.h。 

      #include "CViewTree.h"

3、在类CClassView中,添加树形控件的成员变量

 protected:

            CViewTree   m_wndClassView;

 4、用Class Wizard向导在ClassView.cpp中添加消息WM_CREATE的响应函数

      向导在程序中添加了3个内容:

       (1)在CClassView的消息映射表中添加了

                 BEGIN_MESSAGE_MAP(CClassView, CDockablePane)

                           ON_WM_CREATE()

                            .........

                 END_MESSAGE_MAP() 

        (2)在CClassView的实现中添加函数体

                  int CClassView::OnCreate(LPCREATESTRUCT lpCreateStruct)

                  {                  ..................                }

        (3)在CClassView中添加成员函数的声明

                     protected: 

                             afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 

5、接下来就是在OnCreate函数体中添加树形控件的创建代码

         CRect rectDummy;
          rectDummy.SetRectEmpty();

          // Create views:
          const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT |          TVS_HASBUTTONS | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

          if (!m_wndClassView.Create(dwViewStyle, rectDummy, this, 2))
          {
                    TRACE0("Failed to create Class View\n");
                    return -1;      // fail to create
          }

至此,树形控件就建立完了,用变量m_wndClassView引用CTreeCtrl的成员函数就可以对树控件进行相应的操作了。

例如:

        HTREEITEM hRoot = m_wndClassView.InsertItem(_T("FakeApp classes"), 0, 0);
        m_wndClassView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);

        HTREEITEM hClass = m_wndClassView.InsertItem(_T("CFakeAboutDlg"), 1, 1, hRoot);
        m_wndClassView.InsertItem(_T("CFakeAboutDlg()"), 3, 3, hClass);

       

        展开树形结构的结点(如果有子结点)

        m_wndClassView.Expand(hClass, TVE_EXPAND);

        m_wndClassView.Expand(hRoot, TVE_EXPAND);

        hClass、hRoot为子项句柄。 

6、用Class Wizard在添加WM_SIZE和 WM_PAINT的消息响应函数

       Class Wizard在 ClassView.cpp中添加的3个部分同上面第4步。

      (1)在OnSize函数体中加入如下代码:      

       if (GetSafeHwnd() == NULL)  

        {
                return;
        }

        CRect rectClient;
        GetClientRect(rectClient);

        int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;    
        m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
        m_wndClassView.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER); 

      (2)在OnPaint函数体中加入如下代码:

        CRect rectTree;
        m_wndClassView.GetWindowRect(rectTree);
        ScreenToClient(rectTree);

        rectTree.InflateRect(1, 1);
        dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW));

 7、为树控件添加点击消息响应

       用Class Wizard为类CViewTree添加TVN_SELCHANGED消息响应函数(在VS2010中是=TVN_SELCHANGED,其他版本是不是这样我也不清楚)

在函数体里加上

       HTREEITEM selitem = GetSelectedItem();

       CString seltext = GetItemText(selitem);

     【或者直接将这2句写成  CString seltext = GetItemText( GetSelectedItem() );】

       MessageBox( seltext );   

       如果工程设置为 Use Multi-Byte Character Set ,则用下边这种方法。

       MessageBox( _T(seltext ) ); 

 

在停靠框中嵌入控件的过程基本就是这样了。以后有新的发现会更新本帖。

原创粉丝点击