zoukankan      html  css  js  c++  java
  • MFC拆分窗口及它们之间的数据交换(转)

    转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471

    源代码:http://download.csdn.net/detail/nuptboyzhb/4221531

    CSplitterWnd

    CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口是一个包含有多个窗格的窗口。窗格通常是应用程序特定的由CView派生的对象,但它也可以是具有适当子窗口ID的任何CWnd对象。

    一个CSplitterWnd对象通常被嵌入CFrameWnd或CMDIChildWnd父对象。你应按如下步骤创建一个CSplitterWnd对象:

    1.

    在父框架中嵌入一个CSplitterWnd成员变量。

    2.

    重载父框架的CFrameWnd::OnCreateClient成员函数。

    3.

    从重载的OnCreateClient函数中调用类CSplitterWnd的Create或CreateStatic成员函数。

    3.1调用Create成员函数可以创建一个动态的分隔器窗口。

    3.2 使用CreateStatic成员函数可以创建一个静态分隔器窗口。

    4. 从重载的OnCreateClient函数中调用类CSplitterWnd的CreateView成员函数;

    重要的函数讲解:

    BOOL Create( CWnd* pParentWnd,
                 int nMaxRows,
                 int nMaxCols,
                 SIZE sizeMin,
                 CCreateContext* pContext,
                 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
                 UINT nID = AFX_IDW_PANE_FIRST
               );
    返回值:如果成功则返回非零值;否则返回0
    参数:

    pParentWnd

    分隔器窗口的父框架窗口。

    nMaxRows

    分隔器窗口中的最大行数。这个值不能超过2。

    nMaxCols

    分隔器窗口中的最大列数。这个值不能超过2。

    sizeMin

    指出显示一个窗格所需的最小尺寸。

    pContext

    指向一个CCreateContext结构的指针。多数情况下,这个值可以是传递给父框架窗口的pContext

    dwStyle

    指定窗口的风格。

    nID

    此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRST。

    BOOL CreateStatic( CWnd* pParentWnd,
                       int nRows,
                       int nCols,
                       DWORD dwStyle = WS_CHILD | WS_VISIBLE,
                       UINT nID = AFX_IDW_PANE_FIRST
                     );

    返回值:如果成功则返回非零值;否则返回0。
    参数:

    pParentWnd

    分隔器窗口的父框架窗口。

    nRows

    行数。这个值必须不超过16。

    nCols

    列数。这个值必须不超过16。

    dwStyle

    指定窗口的风格。

    nID

    此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRSH。

    virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
    返回值:如果成功则返回非零值;否则返回0。
    参数:

    row

    指定用来放置新视的分隔器窗口行。

    col

    指定用来放置新视的分隔器窗口列。

    pViewClass

    指定新视的CRuntimeClass。

    sizeInit

    指定新视的初始尺寸。

    pContext

    指向用来创建此视的创建环境的指针(通常,该pContext被传递给在其中创建此分隔器窗口的父框架的重载的OnCreateClient成员函数)。

    注意: 第三个参数CruntimeClass为RUNTIME_CLASS(类名);如果该类是资源类,那么该类的父类必须是CformView,

    应用举例:

    1.       新建一个单文档的应用程序,命名为SplitterWndDemo;

    2.       插入一个对话框的资源,作为其中一个分割窗口;为对话框添加相应的控件;

    2.1设置对话框的属性:将样式设置为下层;禁止使用标题栏;边框选择‘调整大小’;其他格式暂时都不设置;

    2.2为对话框创建一个类,类名CLeftView;父类选择为CFormView;

    3.       在CMainFrame嵌入一个CSplitterWnd成员变量。

    CSplitterWnd m_splitterWnd;

    4.       重载父框架CMainFrame的CFrameWnd::OnCreateClient成员函数,编辑代码如下:

     1 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
     2 
     3 {
     4 
     5 // TODO: Add your specialized code here and/or call the base class
     6 
     7 //获得主窗口的大小
     8 
     9 CRect rect;
    10 
    11 GetClientRect(&rect);
    12 
    13 //产生第一次静态切分
    14 
    15 m_splitterWnd.CreateStatic(this, //父窗口指针
    16 
    17                                                                    1,    //行数
    18 
    19                                                                    2);   //列数
    20 
    21 //为第1个窗格产生视图
    22 
    23 m_splitterWnd.CreateView(0,0,
    24 
    25            RUNTIME_CLASS(CLeftView),
    26 
    27            CSize(rect.Width()/4,rect.Height()),
    28 
    29            pContext); 
    30 
    31 
    32 //为第2个窗格产生视图
    33 
    34 m_splitterWnd.CreateView(0,1,  //窗格的行、列序数
    35 
    36            RUNTIME_CLASS(CSplitterWndDemoView),//视图类
    37 
    38            CSize(rect.Width()-rect.Width()/5,rect.Height()),//初始化大小 
    39 
    40            pContext);//父窗口的创建参数
    41 
    42 return TRUE;//不再调用基类的OnCreateClient函数
    43 
    44 //return CFrameWnd::OnCreateClient(lpcs, pContext);
    45 
    46 }


    注意:要添加头文件#include "SplitterWndDemoView.h"

    #include "LeftView.h"

    由于CSplitterWndDemoView是应用程序的视图类,在其头文件中添加文档类的头文件#include"SplitterWndDemoDoc.h",否则会报错:'CSplitterWndDemoDoc' : missing storage-class or type specifiers

    至此,界面已经完成

    拆分窗口之间的数据传递:

    .应用文档类进行数据传递

    每一个由View类派生出来的类,都可以调用CView::GetDocument,获得当前应用程序文档类的指针;然后进行类型转换;注意,要将文档类的头文件包含进去;

    举例:(继续上述应用程序的编程)

    1.      为文档类添加一个CString类型的成员变量m_str;

    2.      为CLeftView添加一个按钮控件和一个编辑框控件;为编辑框控件关联一个CString类型的成员变量;对按钮控件添加消息响应函数,并编辑代码如下:

    UpdateData();

    CSplitterWndDemoDoc *pDoc =(CSplitterWndDemoDoc*)GetDocument();//获取文档

    pDoc->m_str=m_edit_data;//传递数据

        pDoc->UpdateAllViews(NULL);//更新所有视图

    3.      在CSplitterWndDemoView::OnDraw(CDC* pDC)编辑代码如下:

    CSplitterWndDemoDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

        pDC->TextOut(200,200,pDoc->m_str);

    二.通过获得对方视图的指针,进行操作的交互

    通过AfxGetApp()获得应用程序的指针,然后再通应用程序的指针获得主框架CMainFrame的指针,然后有CMainFrame的指针,获得CMainFrame的CsplitterWnd类型的成员变量m_splitterWnd;然后调用m_splitterWnd的GetPane函数;即可获得;

    1.      为视图类添加一个CString类型的成员变量m_str_view;

    2.      为CleftView再添加一个按钮控件;编辑代码如下:

    CSplitterWndDemoApp *pApp = (CSplitterWndDemoApp *)AfxGetApp();//获得应用程序的指针

    CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;//获得主框架的指针

    CSplitterWndDemoView *pView = (CSplitterWndDemoView *)pFrame->m_splitterWnd.GetPane(0,1);//获得视图类的指针

    pView->m_str_view=m_edit_data;//数据传递

    pView->Invalidate();//重绘视图

    注意:添加相应类的头文件:

    #include "MainFrm.h"

    #include "SplitterWndDemoView.h"

    3.      修改CsplitterWndDemoView类的OnDraw(CDC* pDC)函数

    pDC->TextOut(200,300,m_str_view);

    三.自定义的消息;

     

     

  • 相关阅读:
    SPOJ SAMER08A
    SPOJ TRAFFICN
    CS Academy Set Subtraction
    CS Academy Bad Triplet
    CF Round 432 C. Five Dimensional Points
    CF Round 432 B. Arpa and an exam about geometry
    SPOJ INVCNT
    CS Academy Palindromic Tree
    身体训练
    简单瞎搞题
  • 原文地址:https://www.cnblogs.com/vranger/p/3163509.html
Copyright © 2011-2022 走看看