一个偶然的机会又重新接触了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. 底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏

    一.实现效果图 二.项目工程结构 三.详细代码编写 1.主tab布局界面,main_tab_layout: 双击代码全选 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  2. 最简单的自定义适配器adapter

    下面是一个非常简单的自定义适配器的总体源码,从这个源码入门,就可以慢慢学会适配器了 适配器的作用: 完成数据和界面控件的绑定,把数据绑定到界面的现实控件条目上(对于listView,应该是listVi ...

  3. java反射性能

    项目中用到了java的反射,可以大大减少代码量.但是反射的性能却不容乐观,做了个简单的测试,如下. public void noreflect() { Person p = new Person(); ...

  4. oracle在敏感操作前创建还原点

    我们都知道,在vmware虚拟机中有一个拍摄快照的功能,我们可以把系统此时的状态保存下来,一方后面遇到不测事件,也好将系统还原,oracle中也有类似功能. 首先创建一张学生表: 向学生表中插入一条数 ...

  5. JavaScript 应用开发 #4:切换任务的完成状态

    在勾选了任务项目左边的对号(复选框)以后,会将任务的状态标记为已完成,取消勾选的话,又会把任务的状态标记为未完成.所以, 我们需要一个可以切换任务完成状态的方法.在任务模型里面,表示任务状态的属性是 ...

  6. Migration of ASP.NET app from IIS6 to IIS7 (7.5)

    For many of us familiar problem. You developing applications under IIS6 and you're about to move the ...

  7. Oracle中not exists 与not in 的使用情况

    1.在oracle11g以上版本,oracle已经做了优化,能够自动将in优化成exists方式,因此oracle11g以上版本,使用in和exists效果是一样的. 2.在oracle中,使用not ...

  8. jquery easyui动态校验,easyui动态验证

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  9. C# addin 开发心得记录

    1.环境 2012 新建项目-2010外接程序 2.新建项-功能区  创建菜单等 发布: 1.InstallShield  2015 2.打包 说明按地址-https://msdn.microsoft ...

  10. 两种隐藏元素方式【display: none】和【visibility: hidden】的区别及由此引出的问题

    此前看到一随笔(@任天缘 原文)讲了这个问题,并总结了: [display: none]:隐藏元素及元素内的所有内容,并且该元素的位置.宽高等其他属性值一并“消失”: [visibility: hid ...