一个偶然的机会又重新接触了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. PAT---1001. A+B Format (20)

    #include<stdio.h> int main(){ //定义要读入的两个整数 int a,b; //定义好放拆项用的数组 ]; //读入两个整数 scanf("%d%d& ...

  2. 5 Ways to Use Log Data to Analyze System Performance--reference

    Recently we looked across some of the most common behaviors that our community of 25,000 users looke ...

  3. 手动创建Servlet--J2EE学习笔记

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Serv ...

  4. 基于AFNetworking3.0网络封装

    概述 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于 ...

  5. bootstrap-datetimepicker 时间表箭头不能显示

    我使用的是bootstrap-datetimepicker+bootstrap v3,但这个插件使用的时候,并没有和V3相匹配,仍然调用的是bootstrap V2的图标,代码是: <i cla ...

  6. jquery中Live方法不可用,Jquery中Live方法失效

    jquery中Live方法不可用,Jquery中Live方法失效 >>>>>>>>>>>>>>>>> ...

  7. VM的Linux CentOS系统的VMTools的手动安装

    VM的Linux CentOS系统的VMTools的手动安装 一是没时间安装,另外是一直用的是VM的绿色版,里面没有Linux.iso 文件 今天晚上安装上了 linux 的vmtools ,再也不用 ...

  8. 我对WindowsPhone8的一些反大众看法.

    最近看到网上好多人抱怨wp8的系统设计.我个人有一些观点.实在是不吐不快! 1.为什么系统没有重力感应开关.   答:因为这部分开关功能不是wp8所必备的.只是APP的一个功能.所以.错误在APP上因 ...

  9. Struts2多文件上传

    第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content=&q ...

  10. winform中的chat

    百度一下 源代码下载:百度一下