说明: 切分窗口是对动态创建机制的运用
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++
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-27 19:54:50