一个偶然的机会又重新接触了MFC窗口的分割,自己结合资料重新写了一个窗口分割的程序,现将具体流程跟大家分享一下:

1.我们先创建一个MFC单文档类的程序,具体分割方式先将单文档整个客户区分成两行一列,首先我们在MFC的CMainFrame类中定义一个CSplitterWnd类的对像m_wndSplitter,在主窗口类中我们可以通过对象m_wndSplitter,调用CSplitterWnd类的所有成员函数,为了将窗口分割成两行一列,我们在CMainFrame类中重载OnCreateClient函数,在OnCreateClient函数中编写代码,我们现将窗口分割:

CRect rect;
   GetClientRect(&rect); //产生第一次静态分割
   m_wndSplitter.CreateStatic(this, //父窗口指针
  2,1); //行数与列数

将主窗口分割成两行一列

然后将分割的窗口与一个特定的类关联起来。

m_wndSplitter.CreateView(0,0, //窗格的行列序数
  RUNTIME_CLASS(CFengeView),//视图类

CSize(rect.Width(),rect.Height()-rect.Height()/5),pContext);//父窗口创建参数

m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(Cliftdown),
  CSize(rect.Width(),rect.Height()/5),pContext); //给分割的窗口关联上对于的类
 //不在调用基类的OncreateClient函数
return true;

这里分割开的两个窗口一个关联基础视类,另一个因为我们要用作一些信息的显示用,我们创建一个新类,这个新类的基础类是CEditView,完成后要注意头文件也要关联上,否则CMainFrame 不认识新创建的类。运行一下如果报以下错误:

error C2143: syntax error : missing ';' before '*'
                             error C2501: 'CFengeDoc' : missing storage-class or type specifiers
                             error C2501: 'GetDocument' : missing storage-class or type specifiers

我们在视类的头文件的开头添加#include "fengeDoc.h"即可,再次运行

OK接下来我们要在这个基础上再次进行分割,将第一行分割成两列,第一行的第一列我们要求它有输入功能主要是信息的录入,以及按钮的添加,第一行的第二列我们要求它一列表的形式显示

我们添加录入的信息。为了完成以上功能我们首先添加一个对话框资源,给这个对话框资源关联上一个新类,新类的基础类是 CFormView,同时为了能以一个类表的形式显示录入的信心我们还有添加一个新的类,这个类的基础类是CListView,好了类添加完成我们要在第一次分割的基础上再次分割,这次分割的流程和第一次的思路是一样的,但要注意几点不同:1.我们要在基础视类中添加一个CSplitterWnd类的对像m_wndSplitter1,2.直接在基础视类中重载OnCreate函数中添加分割代码具体代码如下:

CRect rect;
 GetClientRect(&rect); //  获得窗口的创建信息指针
CCreateContext *pContext=(CCreateContext *)lpCreateStruct->lpCreateParams;
m_wndSplitter1.CreateStatic(this,1,2); //产生第二次的静态分割
 //为第一个窗格产生视图
m_wndSplitter1.CreateView(0,0,//窗口的行列序数
  RUNTIME_CLASS(Cliftup),//视图类
CSize(rect.Width()/4,rect.Height()),//
pContext);
//为第二个窗格产生视图
m_wndSplitter1.CreateView(0,1,RUNTIME_CLASS(Crightup),CSize(1,1),pContext);
return 0;

同时在主视类中添加OnSize函数并在函数中添加代码:

CView::OnSize(nType, cx, cy);
CRect rect;
GetClientRect(&rect);
int x=rect.Width();
int y=rect.Height();
m_wndSplitter1.MoveWindow(-2,-2,x,y+3);
m_wndSplitter1.SetColumnInfo(0,x/4,0); //左边窗格位置
m_wndSplitter1.SetColumnInfo(1,x-x/4,0); //右边窗格位置
m_wndSplitter1.RecalcLayout();

除了要添加上识别头文件外,还要注意当程序报错说找不到CListView类时我们在新建的Crightup类的头文件中添加# include <afxcview.h>。给对话框中的按钮添加一个消息响应函数,消息响应函数就在对话框所关联的类下即Cliftup类。为了将我们在对话框中录入的信息显示出来,要先创建一个数组用来存放这些信息,这里我们在CFengeDoc类中创建一个CStringArray类型的数字infoArray[4],同时定义一个BOOL类型的变量add;注意一定要在构造函数中给add初始化要不然会报错的,接下来给对话框的四个编辑框关联上四个CString类型的变量。分别是m_num,m_name,m_zhuanye,m_home.

下边我们要做的是把几块儿视图区联系起来,首先在Cliftup类下的按钮响应函数中填写一下代码:

UpdateData(TRUE);

if(m_num.IsEmpty()||m_name.IsEmpty())

{

AfxMessageBox("填写不能为空");

return 1;

}

CFengeDoc*pDoc=((CFengeDoc*)GetDocument();

pDoc->InfoArray[0].InsertAt(0,m_num);

pDoc->InfoArray[1].InsertAt(0,m_name);

pDoc->InfoArray[2].InsertAt(0,m_zhuanye);

pDoc->InfoArray[3].InsetAt(0,m_home);

pDoc->add=true; //添加了数据
pDoc->UpdateAllViews(NULL); //更新所有视图
m_num=_T("");
m_name=_T("");
m_zhuanye=_T("");
m_home=_T("");
UpdateData(FALSE); //各控件的内容清空

接下来在Cliftdown类中重载OnInitialUpdate() 函数,在函数中添加代码:

CEdit &mEdit=GetEditCtrl(); //获取编辑视图的控件
mEdit.SetWindowText("等待用户输入学生的信息!");//设置显示信息
mEdit.EnableWindow(FALSE); //编辑控件不可编辑

再次在Cliftdown类中重载另一个函数OnUpdate,在函数中添加代码:

CFengeDoc* pDoc=(CFengeDoc*)GetDocument(); // 获取文档指针
if(pDoc->add) // 添加了数据
{
CString str;
str="已经成功添加了学号为"+pDoc->infoArray[0].GetAt(0)+"的学生信息!";
CEdit &mEdit=GetEditCtrl(); //获取编辑视图控件
mEdit.SetWindowText(str); //显示信息

}

然后再Crightup类中重载函数OnInitialUpdate() ,在函数中添加代码:

CString m_ColumnLabelStr[]={"学号","姓名","专业","籍贯"};
//表头字段
CListCtrl& listctrl=GetListCtrl();//获取列表的控件
DWORD dwStyle = listctrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;
// 选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;
dwStyle |=LVS_EX_UNDERLINEHOT;
listctrl.SetExtendedStyle(dwStyle);//列表风格
int width[6]={80,80,110,150};
for(int i=0;i<4;i++)
{
listctrl.InsertColumn(i,m_ColumnLabelStr[i],LVCFMT_LEFT,width[i]);

}

在Crightup类中重载函数PreCreateWindow并添加代码:

cs.style=cs.style|LVS_REPORT;// 设置成报告列表的显示形式

同时再次在Crightup类中重载函数OnUpdate,并在函数中添加代码:

CFengeDoc* pDoc=(CFengeDoc*)GetDocument(); //获取文档指针都要获取文档类指针,把文档类当成了桥梁
if(pDoc->add) //添加了数据
{
CListCtrl& listctrl=GetListCtrl(); // 获取列表的控件
listctrl.DeleteAllItems(); //删除所有项
for(int i=0;i<pDoc->infoArray[0].GetSize();i++) //列表框中插入数据
{ listctrl.InsertItem(i,pDoc->infoArray[0].GetAt(i));
listctrl.SetItemText(i,1,pDoc->infoArray[1].GetAt(i));
listctrl.SetItemText(i,2,pDoc->infoArray[2].GetAt(i));
listctrl.SetItemText(i,3,pDoc->infoArray[3].GetAt(i));
}

}

OK现在运行一下:

MFC窗口分割以及各窗口间的通讯的更多相关文章

  1. MFC程序实现窗口分割,视图快捷插入控件和插入列表

    将视图中插入列表: 1.创建一个MFC应用程序,在MFC Wizard中,生成的类选项,如图 2.选择CListView作为基类 3.在CXXView.cpp(XX为你的程序名)重写虚函数OnInit ...

  2. VS2010 MFC中 窗口分割的实现

    分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...

  3. MFC 窗口分割与通信

    一.关于CSplitterWnd类我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何创 ...

  4. MFC 窗口分割

    动态分割窗口: BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { , , CSize(, ...

  5. MFC永久窗口对象与临时窗口对象

    这篇讲得很清楚,就转过来了,原文如下: 因项目需要,最近在学习MFC,下午在一篇教程中提到了临时窗口.永久窗口,作者让读者自行查阅MSDN,了解临时窗口与永久窗口的概念,出于好奇,出于方便,直接百度一 ...

  6. MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 转

    MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决   在多线程设计中,许多人为了省事,会将对话框类或其它类的指针传给工作线程,而在工作线程中调用该类的成员函数或成员变量等等. ...

  7. 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

    如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的, ...

  8. vim 窗口分割命令

    如何在一个窗口下面同时打开两个以及以上的文件,有横向跟纵向两种方式 一.如果在终端中开没有打开vim,可以: 横向分割显示: $ vim -o filename1 filename2 纵向分割显示: ...

  9. MFC软件工程架构模型-模式窗口-非模式窗口

    1. SDI单文档界面: MDI多文档界面.有多个"关闭-最大化-最小化"等这样的窗口嵌套 基于对话框的软件模型 2.模式对话框和非模式对话框 模式对话框:使用DoMoel(),弹 ...

随机推荐

  1. Java中NaN和-0.0f的比较问题

    简单的说,比较两个int型或long型的数据没有什么问题,可以用==来判断,但对浮点数(float与double)来说,需要对Float.NaN和0.0这个两个特殊数字作额外的处理.Float.NaN ...

  2. COCOS2D-X 精灵创建随笔

    CCSprite类中创建Sprite的方法都是静态的: static CCSprite* create ( )  创建一个无图片显示的精灵,可随后用 setTexture 方法设置显示图片 stati ...

  3. PureMVC(JS版)源码解析(七):Mediator类

    之前的博文中,我们分析了SimpleCommand类和MacroCommand类,这两个类用作"业务逻辑(business logic)"处理,今天,我们讲一些和UI界面相关联的M ...

  4. android开发之国际化

    国际化,听起来高大上,做起来很简单. 我们来实现一个简单的效果,让应用根据系统的语言来做不同的显示,假如android系统默认是英语,应用就以英文的形式显示,如果android系统默认是中文,则应用就 ...

  5. Ⅲ.AngularJS的点点滴滴-- 路由

    路由ngRoute (需要依赖ngRoute模块) <html> <script src="http://ajax.googleapis.com/ajax/libs/ang ...

  6. samba环境搭建

    1.安装samba软件 sudo apt-get install samba cifs-utils samba-common 2.创建与windows共享目录 mkdir share chmod 77 ...

  7. a标签的简单用法

    1.href="#"的作用:页面中有滚动,可以直接回到顶部. <a href="#">回到最顶端</a> 2.href="ur ...

  8. .net单元测试——解除依赖

    最近在看.net单元测试艺术,我也喜欢单元测试,这里写一下如何在测试中解除对象间的依赖. 假如有这样的一个需求,当用户登陆时,我需要对用户名和密码进行验证,然后再将用户名写入日志中. public c ...

  9. c# HttpWebRequest与HttpWebResponse 绝技(转载)

    c# HttpWebRequest与HttpWebResponse 绝技    如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧.本文章会对Http请求时的Get和P ...

  10. AbstractMethodError using UriBuilder on JAX-RS

    问题描述:Eclipse调试JAX-RS服务没问题,但是在发布服务端时候抛出异常 java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder. ...