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

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

    CSplitterWnd

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

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

    1.

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

    2.

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

    3.

    从重载的OnCreateClient函数中调用类CSplitterWndCreateCreateStatic成员函数。

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

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

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

    重要的函数讲解:

    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成员函数)。

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

    应用举例:

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

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

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

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

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

    CSplitterWnd m_splitterWnd;

    4.       重载父框架CMainFrameCFrameWnd::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的指针,获得CMainFrameCsplitterWnd类型的成员变量m_splitterWnd;然后调用m_splitterWndGetPane函数;即可获得;

    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);

    三.自定义的消息;

    from:http://blog.csdn.net/nupt123456789/article/details/7455471

  • 相关阅读:
    log4j在eclipse下使用
    Java实现IOS推送(利用javapns1.6)
    [转]浅谈多核CPU、多线程与并行计算
    关于select的字段加别名的语法
    [转]maven环境快速搭建
    Java实现IOS推送(Javapns2.2)
    千年服务器GM命令及使用详解
    [转载 蓝韦巍]类似浩方、VS对战平台系统的实现
    召唤和删除怪物程序段
    WPE下载 & WPE & 各版本下载 及 教程
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501328.html
Copyright © 2011-2022 走看看