说明: 切分窗口是对动态创建机制的运用
1、分类:动态和静态
动态切分-程序在运行时,由用户拖动分隔条动态的切分窗口。每一个视图窗口使用的是相同的视图类。静态切分-在编码创建时已经完成窗口切分。每一个视图窗口可以使用不同的视图类。(超市的监控)
2 、动态切分
建一个win32简单应用程序, 删除入口函数,将stdafx.h中的头文件 <windows.h> 更改为 <afxwin.h>,Project-->Settings菜单项中设置使用MFC库。
// MFCSplit.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <afxext.h>
//支持动态创建的视图类
class CMyView:public CView
{
public:
virtual void OnDraw(CDC* pDC);
DECLARE_DYNCREATE(CMyView)
};
IMPLEMENT_DYNCREATE(CMyView,CView)
void CMyView::OnDraw(CDC* pDC)
{
pDC->TextOut(10,10,"hello !");
}
class CMainFrame:public CFrameWnd
{
public:
CSplitterWnd m_wndSplit;//用于创建切分窗口的对象
virtual BOOL OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext );
};
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
//创建动态切分
CCreateContext cxt;
cxt.m_pNewViewClass=RUNTIME_CLASS(CMyView);//指定动态创建时使用的视图类
m_wndSplit.Create(this,2,2,CSize(100,100),&cxt);
return TRUE;
}
class CSplitApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CSplitApp theApp;//应用程序全局对象
BOOL CSplitApp::InitInstance()
{
CMainFrame *pFrame= new CMainFrame;
pFrame->Create(NULL,"MFCSplit");
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
};
拖动下边和右边的滑块得到:
CSplitterWnd类----完成窗口切分的类。
#include <afxext.h>//扩展窗口的头文件
3 、静态切分
建一个win32简单应用程序, 删除入口函数,将stdafx.h中的头文件 <windows.h> 更改为 <afxwin.h>,Project-->Settings菜单项中设置使用MFC库。
// static_Split.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <afxext.h>
#include "resource.h"
#include <afxhtml.h>
class CMyView:public CView
{
public:
virtual void OnDraw(CDC* pDC);
DECLARE_DYNCREATE(CMyView)
};
IMPLEMENT_DYNCREATE(CMyView,CView)
//为什么加动态创建,里边包含运行时类信息,下边需要用到运行时类信息
void CMyView::OnDraw(CDC* pDC)
{
pDC->TextOut(10,10,"hello !");
}
class CMainFrame:public CFrameWnd
{
public:
CSplitterWnd m_wndSplit;//切分窗口对象
CSplitterWnd m_wndSplit2;//对左边进行在切分
//CFrameWnd::OnCreateClient-虚函数,会被CFrameWnd::OnCreate调用,
//作用创建框架窗口的客户区对象。
virtual BOOL OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext );
};
// 完成静态切分
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
m_wndSplit.CreateStatic(this,1,2);//一行两列
m_wndSplit2.CreateStatic(&m_wndSplit,2,1,WS_CHILD|WS_VISIBLE,
m_wndSplit.IdFromRowCol(0,0));//基于左边的部分
//手动创建视图
m_wndSplit2.CreateView(0,0,RUNTIME_CLASS(CMyView),
CSize(200,100),pContext); ////用到运行时类信息
m_wndSplit2.CreateView(1,0,RUNTIME_CLASS(CEditView),
CSize(200,100),pContext);
m_wndSplit.CreateView(0,1,RUNTIME_CLASS(CHtmlView),
CSize(200,200),pContext);
//获取根据索引位置指定的视图,来在右边打开一个网页
CHtmlView* pView= (CHtmlView*)m_wndSplit.GetPane(0,1);
//导航
pView->Navigate("http://hao.201201.com/");//既可以是网址,可以显示c盘下的文件夹
//设置分割条位置(下边设置的垂直分割条)
m_wndSplit.SetColumnInfo(0,200,10);//指定左边的理想宽度为200,最小宽度10
return TRUE;
}
class CSplitApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CSplitApp theApp;//全局应用程序对象
BOOL CSplitApp::InitInstance()
{
CMainFrame *pFrame = new CMainFrame;
pFrame->LoadFrame(IDR_MENU1) ;
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
4、动态和静态的区别
动态切分-程序在运行时,由用户动态创建切分,动态切分每个窗口使用的视图是相同的。
静态切分-在编程创建时,就确定了窗口的切分,而且每个窗口视图可以不同。
动态的只需要把类名传入就行,而静态则需要自己调一系列函数
思考:
怎么判断切分出来的窗口之间是独立的还是一个窗口的几部分? 工具:tools->spy++