码迷,mamicode.com
首页 > 其他好文 > 详细

切分窗口

时间:2015-07-15 13:24:50      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:mfc

说明: 切分窗口是对动态创建机制的运用


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++


版权声明:本文为博主原创文章,未经博主允许不得转载。

切分窗口

标签:mfc

原文地址:http://blog.csdn.net/meetings/article/details/46889355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!