切分窗口

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

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

切分窗口的相关文章

guake 3.4发布,支持切分窗口

guake是一款下拉式终端,美观实用. 近日发布了3.4版本,在3.4版本中支持了切分窗口功能.如图所示,还是比较实用的一个功能. 目前ubuntu仓库中还未更新,需要使用pip安装,或者自行从源码编译安装. Guake 在2018年被移植到了GTK3, 由于新的Guake是基于GTK3和Python3,开发人员决定跳过版本号1.x和2.x,直接升级到Guake 3. 基于GTK2的旧版本,则被放到了分支0.8.x中,并不再维护. 源码: github 官方主页: guake-project 在

C++MFC编程笔记day04 运行时类信息和窗口的动态、静态切分

运行时类信息 程序在运行时,获取对象类的信息及类的继承关系 实现: 1.定义类继承自CObject类. 2.类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC() 3.使用: BOOL IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类 CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替. 示例: #include "stdafx.h

QT 5 初学1 多窗口切分-续

转载:omydocument 主窗口本身就带着菜单,工具栏,和状态栏,作为一个基本应用,这些都不用操心. 一个工具,需要把窗口切分成三部分,左边,右上,右下.左边显示选择的功能,右上是主窗口.右下作为状态窗口. 在上篇的基础上,采用系统窗口形式,不再在main上开窗口.也就是用桌面设计模式. 1 #include "mainwindow.h" 2 #include <QApplication> 3 int main(int argc, char *argv[]) 4 { 5

MFC的窗口分割的设计与实现以及CSplitterWnd 类分析

1 引言 在Microsoft VC++ 6.0 中,基于MFC 的应用程序一般分为以下几种:多文档界面(MDI). 单文档界面(SDI)以及基于对话框的应用程序.其中单文档又可分为单视图的和多视图的, 一般情况下,单文档仅需要单视图就够了,如Windows 自带的记事本.画图程序等等,但 在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度 观察同一文档等. 在MFC 的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了 增加视图(AddVi

积累的VC编程小技巧之框架窗口及其他

1.修改主窗口风格 AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名.窗口是叠加型的.可改变窗口大小等.要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs.CWnd::PreCreateWindow 函数先于窗口创建函数执行.如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT

窗口分割

我们在使用OutLook或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何创建类似的界面,也实现窗口的任意的分割呢?要解决这个问题,在Visual C++6.0编程中就需要使用到MFC提供的CSplitterWnd类.CSplitterWnd看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充.当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸.虽然VC6.0支持从AppWizar

VC编程小技巧之框架窗口及其他

1.修改主窗口风格 AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名.窗口是叠加型的.可改变窗口大小等.要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs.CWnd::PreCreateWindow 函数先于窗口创建函数执行.如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT

关于emacs的缓冲区与窗口

Emacs的“缓冲区”是脱离窗口或框架独立存在的. 我们所看到的Emacs“窗口”并非Emacs的窗口,而是Emacs的图形窗口框架(GUI windows frames).在未有图形化窗口之前,Emacs已经可以在“终端”运行了,用Windows的术语来说,就是“控制台"程 序. 本质上,窗口和框架只是显示缓冲区内容的工具.缓冲区内可以包含文件内容,可以是Emacs内部自定义的,譬如*Messages*,*scratch*,或*help*等,也可以是用户自定制而其中内容未写入文件的. Emac

VC 中窗口的销毁

http://blog.csdn.net/oldmtn/article/details/6904697 基础知识很重要,Win32中的窗口句柄和MFC窗口类对象的2个概念.前者被后者包装了起来. 先看下MSDN中的TN017中的文章 In the case of C++ Windows objects that do perform auto-cleanup, you must callDestroyWindow. If you use operator delete directly, the