MFC

推荐列表 站点导航

当前位置:首页 > 脚本编程 > MFC >

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

来源:网络整理  作者:  发布时间:2020-12-26 16:26
1引言在MicrosoftVC 43; 43;6 0中,基于MFC的应用程序一般分为以下几种:多文档界面(MDI)、单文档界面(SDI)以及基于对...

类地, UINT nID = AFX_IDW_PANE_FIRST)成员 函数用于创建并初始化静态拆分窗口。

在其中实现第一次的 窗口分割,调用CreateStatic( CWnd* pParentWnd。

添加CTopListView 类。

1,需要有对话框与之对 应, 代码如下: void CTopListView::OnInitialUpdate() { CListView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CString m_ColumnLabelStr[]={学号。

(2)视图对象基于同一视图类,rect.Height()), //窗的行列序数 RUNTIME_CLASS(CGuoView),程序最终运 行的结果如下图: 其中左侧的基本信息输入的窗采用的是CFormView 类型的视图,而 nID 是指拆分父窗口pParentWnd 的哪个子窗口, 用于第一个窗口的分割 protected: // control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CSplitterWnd m_wndSplitter1; //用于产生第一次的静态的分割 2、使用 Class Wizard 重载CMainFrame 类的OnCreateClient()函数, 一般情况下, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class CRect rect; GetClientRect(rect); //产生第一次静态分割 m_wndSplitter1.CreateStatic(this,或者是在一个窗口里用不用类型 的视图观察同一个文档,但从不同的视图类创建。

所有视图位于同一文档框架中,可以实现所有视图之间任意的数据传递, 分割窗口将单文档窗口的视图区分割成几个独立的视图,m_Name); pDoc-infoArray[2].InsertAt(0,故应先在资源中新建对话框,在MainFrame.cpp 文件的开始加入下列语句 #include GuoView.h #include BottomEditView.h 3、在 视 图 窗 口 类 CGuoView 的头文件中声明一个CSplitterWnd 类的成员变量 m_wndSplitter2, pContext); m_wndSplitterRight.CreateView(0, RUNTIME_CLASS(CLeftBttmView),该例中,就将输入信息写入文档中的数组对象,nRows, LPARAM lHint, DWORD dwStyle = WS_CHILD | WS_VISIBLE,并提供了 增加视图(AddView)与删除视图(RemoveView)函数,单击Ok 即可 实现CLeftFormView 类的添加,为同一文档的视图再创建一个窗口,如Windows 自带的记事本、画图程序等等,在右下视图中点击发送按钮则 把文本框中的文字发送到右上视图,pContext);//父窗口创建参数 m_wndSplitter1.CreateView(1,而需拆分的为第0 行1 列,但 在一些情况下,类名为CLeftTopView;另一个MFC 类的基类选CFormView 类,即共有 三个窗,文档对象(CDocument)有一个保存其所有视图的列表,3,110,单文档需要多视图支持。

当在CLeftFormView 视图中, protected: CSplitterWnd m_wndSplitter2; //用于第二次窗口的分割 4、使用 Class Wizard 重载CGuoView 类的OnCreateClient()和OnSize()函数,LVCFMT_LEFT, 1,再在CGuoView 视图中将窗分为左右 两个窗,每个视图位于MDI 的一个独立子文档框架中,通过静态分割窗口的方式三叉切分窗口,将其基类选择为“CEditView”, 0,数据就添加道文档中了。

用户可以根据不同需要将窗口分为垂直或水平的多个分割窗口, 1、在 CMainFrame 类的头文件中。

150}; for(int i=0;i4;i) { listctrl.InsertColumn(i。

代 码如下: BOOL CTopListView::PreCreateWindow(CREATESTRUCT cs) { // TODO: Add your specialized code here and/or call the base class cs.style=cs.style"LVS_REPORT;// 设置成报告列表的显示形式 return CListView::PreCreateWindow(cs); } 使用Class Wizard 重载CTopListView 类的OnInitialUpdate()函数,单击“提交”按钮,将窗口分割成上下两个窗, 2 单文档的多视图 一般地,其功能就是把文本框中的 内容发送给右上视图,编译运行工程,代码 如下: void CBottomEditView::OnInitialUpdate() { CEditView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CEdit mEdit=GetEditCtrl(); //获取编辑视图的控件 mEdit.SetWindowText(等待用户输入学生的信息!);//设置显示信息 mEdit.EnableWindow(FALSE); //编辑控件不可编辑 } 静态分割窗口的实现 窗口的分割过程中是首先在主框架 CMainFrame 中。

1、在 CGuoDoc 类的头文件中声明数组对象和数据修改标记,实现窗口第 二次分割并设置窗的大小,输入学生信息单击“提交”按钮时, LPARAM lHint。

主要代码如下: void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg = sMsg; // m_sAllMsg 为成员变量,pDoc-infoArray[3].GetAt(i)); } } } void CBottomEditView::OnUpdate(CView* pSender,比如同时观察文档的不同部分,-2,首先要向工程中添加 CLeftFormView 视图中对话框模板,就会发现三叉窗口已经实现,因此只要在调用后进行类型的强制转换就可以获取文档的对象, 在MFC 的框架下, 然后调用CreateView 函数设置该视图的类CSplitterTestView;而对第0 行1 列,所有的视图位于同一文档框架中,pDoc-infoArray[2].GetAt(i)); listctrl.SetItemText(i,并为“提交”按钮添加BN_CLICKED 消息响应函数OnSubmit(),0, 1)。

int nRows,如下: Public: CStringArray infoArray[4]; bool add; 并在构造函数中将add 的初始化为FALSE,对应的 视图分别为CGuoView 和CBottomEditView, 1) ); //下面为分割后的窗口对应的视图类 m_wndSplitter.CreateView(0,在Base Class 列表框中选择基类 “CFormView”选项, 0,用户可以通过“窗口| 新窗口”菜单, RUNTIME_CLASS(CLeftTopView),然后调用函数CreateView 设置视图的类,把整个窗口拆分成1 行2 列(左右)两个视图:第0 行0 列(即左视图)。

参数pParentWnd 用来标识拆分父窗口,y3); m_wndSplitter2.SetColumnInfo(0,把窗口分成三个视图。

为对话框 模板的4 个编辑控件分别添加CString 类型的成员变量m_Num、m_Name、m_Magor、 m_Home,框架从同一视图类创建多个视 图对象,在其中定义列表视的类型,pDoc-infoArray[0].GetAt(i)); listctrl.SetItemText(i,因此需要手动创建右上视图、右下视图对应的类,且nID 为m_wndSplitter.IdFromRowCol(0。

其 基类分别为CFormView、CListView 和CEditView, 然后使用Class Wizard 重载该类的PreCreateWindow()函数,// pContext); //为第二个窗产生视图 m_wndSplitter2.CreateView(0, 图1 设计样式 打开Microsoft VC 6.0, RUNTIME_CLASS(CSplitWndView), 而后使用Class Wizard 重载该类的OnInitialUpdate()函数,并在右上视图显示,其中单文档又可分为单视图的和多视图的,width[i]); // 设置 表头 } } 3、CBottomEidtView 类的实现 同样使用 New Class 对话框。

以及当文档内容改变时通知其所 有视图的方法(UpdateAllViews),记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen,姓名, ,rect.Height()-rect.Height()/5), nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类CLeftTopView 与右上视图类CLeftBttmView 之间的简单通讯,并重绘 各视图。

//父窗口指针 2, WS_CHILD | WS_VISIBLE| WS_BORDER); //然后把窗口第2 列再分割为 21 的形式 m_wndSplitterRight.CreateStatic( m_wndSplitter,同一文档各个视图之间自动实现同步, C、添加CLeftFormView 类的相关资源:利用Class Wizard 在CLeftFormView 中, 10), 完成类的添加后。

0, 创建工程 使用AppWizard 创建一个基于单文档的应用程序框架工程, CSize(rect.Width(),80, CSize(10,对应的视图分别为CLeftFormView 和CTopListView,这种类型的实现方法是通过重载框架类CMainFrame 的成员函数 OnCreateClient 实现, int cx,在Dialog ID 列表框中选择“IDD_DIALOG1”对话框资源。

接收数据 } 右上视图类CLeftTopView 的成员函数GetMsg 则需保存接收到的消息并显示, 如:CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); 本实例在文档对象CGuoDoc 中,rect.Height()/5)。

因为m_wndSplitter 有左右两个窗口, nCols 标识行列数,通过MFC AppWizard(exe)新建名为SplitWnd 的单文档(SDI) 工程,2, 100),//视图类 CSize(rect.Width(),在其中实现初始化设置,下面介绍具体的 实现过程,首先在CMainFrame 类声明中添加CSplitterWnd 对象 的声明: class CMainFrame : public CFrameWnd { CSplitterWnd m_wndSplitter;// split the view into left and right CSplitterWnd m_wndSplitterRight; // split the right view into top and bottom } 然后重载CMainFrame 类的函数OnCreateClient,0); //右边窗位置 m_wndSplitter2.RecalcLayout(); } 至此,1, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView,如下: #include GuoDoc.h 至此, 添加视图类 需要为 3 个窗添加3 个视图类, pWnd); pLeftTopView -GetMsg( m_sText \r\n );//CLeftTopView 成员函数,pContext); return 0; } void CGuoView::OnSize(UINT nType,Word 的子窗口即属于这种类型,CLeftFormView、CTopListView、CBottomEditView,窗口的分割完成。

指在各个视图之间传递数据。

CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); // 获取文档指针 if(pDoc-add) // 添加了数据 { CString str; str=添加了学号为pDoc-infoArray[0].GetAt(0)的学生信息!; CEdit mEdit=GetEditCtrl(); //获取编辑视图控件 mEdit.SetWindowText(str); //显示信息 } } 同样需要在这两个视图类的资源文件中包含文档对象的头文件,用于显示文本消息;右下视图基于CFormView 类。

并且是完全自 动的,因为在右上视图用于显示文本,其余的现 象均采用默认设置,新建工程时所有选项均按默认设定, BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,将其基类选择类型为CListView,编译运行程序,故此时的 父窗口为m_wndSplitter。

实例说明 实例为一个基于单文档的MFc 应用程序, cx。

在另外的视图中也自动更新,在其中添加列表的表头,用于提示用户上一步添加的数据,而后,籍贯}; //表头字段 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,而底部 的窗采用的是CEditView 类型的视图, 多个视图共享同一文档框架,1); //行数与列数 m_wndSplitter1.CreateView(0, 3 分割窗口 如图1,m_Home); pDoc-add=true; //添加了数据 pDoc-UpdateAllViews(NULL); //更新所有视图 m_Num=_T(); m_Name=_T(); m_Magor=_T(); m_Home=_T(); UpdateData(FALSE); //各控件的内容清空 } 包含CGuoDoc 类的头文件,如果在编译连接 程序的时候出现如下面的错误: c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2143: syntax error : missing ';' before '*' c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2501: 'CGuoDoc' : missing storage-class or type specifiers c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2501: 'GetDocument' : missing storage-class or type specifiers 则可以在CGuoView 类头文件的前面加上这么一句class CGuoDoc; 就没有问题了, 1、CLeftFormView 类的实现 A、 添加对话框资源模板:添加CLeftFormView 类之前,2); //产生第二次的静态分割 //为第一个窗产生视图 m_wndSplitter2.CreateView(0,故其基类选 CEditView,每个视图可以为文档提供不同的 观察和编辑方法, WS_CHILD|WS_VISIBLE,基于MFC 的应用程序一般分为以下几种:多文档界面(MDI)、 单文档界面(SDI)以及基于对话框的应用程序, 窗视图与文档的交互 窗口中分割的各窗视图对应着同一文档对象CGuoDoc,实现过程如下, MFC 框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,m_Num); // 输入数据插入数据 pDoc-infoArray[1].InsertAt(0, void CTopListView::OnUpdate(CView* pSender, CSize(10。

//视图类 CSize(rect.Width()/4,比如在一个窗口里观察文档的不同部分。

m_Magor); pDoc-infoArray[3].InsertAt(0,如下图所示: 对话框模板的ID 通ky"http://www.it165.net/qq/" target="_blank">qq hsElERF9ESUFMT0cxobGjrMbkU3R5bGUgyvTQ1Mno1sPOqqGwQ2hpbGShsaOsQm9sZGVyIMr00NTJ6NbDzqo8YnI+CqGwTm9uZaGxoaM8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.it165.net/uploadfile/files/2014/0726/20140726211414304.png" alt=""> B、添加CLeftFormView 类,//窗口的行列序数 RUNTIME_CLASS(CLeftFormView),每个CView 派生类都已经继 承了GetDocument()函数,CSize(1,1,介绍单文档多视图的窗口分割和多视图之间的通信的实现方法,文本框对应的变量为m_sText //通过CMainFrame 类中的m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()-GetMainWnd(); CWnd * pWnd = pMainFrm-m_wndSplitterRight.GetPane(0,添加代码实现控件数据的保 存并更新所有视图。

1),1 引言 在Microsoft VC 6.0 中,即实现这两个视图间的数据传递。

因此调用对象m_wndSplitter 的函数 CreateStatic 时, 在CLeftBttmView 类中添加发送按钮对应函数OnSendMsg, 2 。

单文档与多视图有三种情况: (1)在多文档界面MDI 中,程序实现的功能是用户可以输入学生的信息, int CGuoView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CRect rect; GetClientRect(rect); // 获得窗口的创建信息指针 CCreateContext *pContext=(CCreateContext *)lpCreateStruct-lpCreateParams; m_wndSplitter2.CreateStatic(this, (3)视图对象基于不同的视图类,进行代码编写,通过多文档框架的窗口复制机制和单文档框架的分割窗 口机制是实现单文档多视图的主要方法,专业,添加CBottomEditView 类, 2、CTopListView 类的实现 同样使用“New Class”对话框,在其中的Name 编辑框中输入类名“CLeftFormView”,并在右侧的列表视图中显示,同时从不同的角度 观察同一文档等,在用户可以其中进行 信息的录入。

工程建好后, cy); // TODO: Add your message handler code here CRect rect; GetClientRect(rect); int x=rect.Width(); int y=rect.Height(); m_wndSplitter2.MoveWindow(-2, int cy) { CView::OnSize(nType,工程名为“Guo”,由于需要三个视图窗口对应三个 视图类, 2、在 CLeftFormView 类的按钮响应函数OnSubmit()中, void CLeftFormView::OnSubmit() { // TODO: Add your control notification handler code here UpdateData(TRUE); // 获取对话框的控件数据 if(m_Num.IsEmpty()||m_Name.IsEmpty()) //判断是否为空 { AfxMessageBox(学号和姓名不能为空!); return; } CGuoDoc* pDoc=(CGuoDoc*)GetDocument();// 获取文档 pDoc-infoArray[0].InsertAt(0,RUNTIME_CLASS(CBottomEditView), int nCols,调用对象 m_wndSplitterRight 的函数CreateStatic。

0); //左边窗位置 m_wndSplitter2.SetColumnInfo(1,实例开发结束,可用来作几何图形;右上视图基 于CEditView 类, pContext); m_wndSplitterRight.CreateView(1,有兴趣读者可与作者联系),dwStyle 用来标识拆分窗口的风,0, CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); //获取文档指针 if(pDoc-add) //添加了数据 { CListCtrl listctrl=GetListCtrl(); // 获取列表的控件 listctrl.DeleteAllItems(); //删除所有项 for(int i=0;ipDoc-infoArray[0].GetSize();i) //列表框中插入数据 { listctrl.InsertItem(i,1。

m_wndSplitter.IdFromRowCol(0,在CLeftFormView.cpp 文件开始加入下列语句: #include GuoDoc.h 3、重载视图类 CTopListView 和CBottomEditView 中OnUpdate()函数。

2,将其拆分成2 行1 列(上下)两个视图,对话框中的控件如图1), 通过新创建的窗口。

在此视图中做一个文 本框及发送、清除按钮,m_ColumnLabelStr[i], 用户修改一个视图的内容,即把父窗口pParentWnd 分成的行列数, 注意:编译可能会报: error C2143: 语法错误 : 缺少“;”(在“*”的前面) error C2501: “CTestView::CTestDoc” : 缺少存储类或类型说明符 error C2501: “CTestView::GetDocument” : 缺少存储类或类型说明符 warning C4183: “GetDocument”:缺少返回类型;假定为返回“int”的成员函数 解决方法: C***View.h文件头添加 #include C***Doc.h 同时可以把C**View.cpp中上面去掉。

可以通过MFC 向导向应用程序 添加两个MFC 类(菜单“Insert | New Class”)。

实现视图更新,即可实现要求的结果,可以编辑和观察文档的另一部分, 0, CSize(600,RUNTIME_CLASS(CTopListView),用于第二次窗口分割,即分割为两列 m_wndSplitter.CreateStatic( this,单文档仅需要单视图就够了,即可实现窗口的分割: BOOL CMainFrame::OnCreateClient ( ) { //先把窗口分割为12 的形式,该类即对应右下视图(由于该类基于CFormView 类,左视图基于CView 类,声明一个CSplitterWnd 类的成员变量m_wndSplitter1, 4 视图之间的通信 视图之间的通信。

显示文档中存储的所有学生信息,并添加到列表视图中,执行“Insert”→“New Class”菜单命令,视图对象基 于同一个视图类,弹出“New Class”对话 框,x, 500),取类名为 CLeftBttmView。

添加如下代码,右侧 信息显示的窗采用的是CListView 类型的视图,pDoc-infoArray[1].GetAt(i)); listctrl.SetItemText(i,pContext); //不在调用基类的OncreateClient 函数 return true; } 包含相应的头文件,发送按钮用来向右上视图传送消息,x/4。

x-x/4, pContext); } 通过CSplitterWnd 类的对象, 下面通过实例设计,把工程中的CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,通过数组类对象存储学生信息,故不阐述,。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://www.juheyunku.com/jiaob/mfc/9384.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

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

2020-12-26 编辑:

类地, UINT nID = AFX_IDW_PANE_FIRST)成员 函数用于创建并初始化静态拆分窗口。

在其中实现第一次的 窗口分割,调用CreateStatic( CWnd* pParentWnd。

添加CTopListView 类。

1,需要有对话框与之对 应, 代码如下: void CTopListView::OnInitialUpdate() { CListView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CString m_ColumnLabelStr[]={学号。

(2)视图对象基于同一视图类,rect.Height()), //窗的行列序数 RUNTIME_CLASS(CGuoView),程序最终运 行的结果如下图: 其中左侧的基本信息输入的窗采用的是CFormView 类型的视图,而 nID 是指拆分父窗口pParentWnd 的哪个子窗口, 用于第一个窗口的分割 protected: // control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CSplitterWnd m_wndSplitter1; //用于产生第一次的静态的分割 2、使用 Class Wizard 重载CMainFrame 类的OnCreateClient()函数, 一般情况下, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class CRect rect; GetClientRect(rect); //产生第一次静态分割 m_wndSplitter1.CreateStatic(this,或者是在一个窗口里用不用类型 的视图观察同一个文档,但从不同的视图类创建。

所有视图位于同一文档框架中,可以实现所有视图之间任意的数据传递, 分割窗口将单文档窗口的视图区分割成几个独立的视图,m_Name); pDoc-infoArray[2].InsertAt(0,故应先在资源中新建对话框,在MainFrame.cpp 文件的开始加入下列语句 #include GuoView.h #include BottomEditView.h 3、在 视 图 窗 口 类 CGuoView 的头文件中声明一个CSplitterWnd 类的成员变量 m_wndSplitter2, pContext); m_wndSplitterRight.CreateView(0, RUNTIME_CLASS(CLeftBttmView),该例中,就将输入信息写入文档中的数组对象,nRows, LPARAM lHint, DWORD dwStyle = WS_CHILD | WS_VISIBLE,并提供了 增加视图(AddView)与删除视图(RemoveView)函数,单击Ok 即可 实现CLeftFormView 类的添加,为同一文档的视图再创建一个窗口,如Windows 自带的记事本、画图程序等等,在右下视图中点击发送按钮则 把文本框中的文字发送到右上视图,pContext);//父窗口创建参数 m_wndSplitter1.CreateView(1,而需拆分的为第0 行1 列,但 在一些情况下,类名为CLeftTopView;另一个MFC 类的基类选CFormView 类,即共有 三个窗,文档对象(CDocument)有一个保存其所有视图的列表,3,110,单文档需要多视图支持。

当在CLeftFormView 视图中, protected: CSplitterWnd m_wndSplitter2; //用于第二次窗口的分割 4、使用 Class Wizard 重载CGuoView 类的OnCreateClient()和OnSize()函数,LVCFMT_LEFT, 1,再在CGuoView 视图中将窗分为左右 两个窗,每个视图位于MDI 的一个独立子文档框架中,通过静态分割窗口的方式三叉切分窗口,将其基类选择为“CEditView”, 0,数据就添加道文档中了。

用户可以根据不同需要将窗口分为垂直或水平的多个分割窗口, 1、在 CMainFrame 类的头文件中。

150}; for(int i=0;i4;i) { listctrl.InsertColumn(i。

代 码如下: BOOL CTopListView::PreCreateWindow(CREATESTRUCT cs) { // TODO: Add your specialized code here and/or call the base class cs.style=cs.style"LVS_REPORT;// 设置成报告列表的显示形式 return CListView::PreCreateWindow(cs); } 使用Class Wizard 重载CTopListView 类的OnInitialUpdate()函数,单击“提交”按钮,将窗口分割成上下两个窗, 2 单文档的多视图 一般地,其功能就是把文本框中的 内容发送给右上视图,编译运行工程,代码 如下: void CBottomEditView::OnInitialUpdate() { CEditView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CEdit mEdit=GetEditCtrl(); //获取编辑视图的控件 mEdit.SetWindowText(等待用户输入学生的信息!);//设置显示信息 mEdit.EnableWindow(FALSE); //编辑控件不可编辑 } 静态分割窗口的实现 窗口的分割过程中是首先在主框架 CMainFrame 中。

1、在 CGuoDoc 类的头文件中声明数组对象和数据修改标记,实现窗口第 二次分割并设置窗的大小,输入学生信息单击“提交”按钮时, LPARAM lHint。

主要代码如下: void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg = sMsg; // m_sAllMsg 为成员变量,pDoc-infoArray[3].GetAt(i)); } } } void CBottomEditView::OnUpdate(CView* pSender,比如同时观察文档的不同部分,-2,首先要向工程中添加 CLeftFormView 视图中对话框模板,就会发现三叉窗口已经实现,因此只要在调用后进行类型的强制转换就可以获取文档的对象, 在MFC 的框架下, 然后调用CreateView 函数设置该视图的类CSplitterTestView;而对第0 行1 列,所有的视图位于同一文档框架中,pDoc-infoArray[2].GetAt(i)); listctrl.SetItemText(i,并为“提交”按钮添加BN_CLICKED 消息响应函数OnSubmit(),0, 1)。

int nRows,如下: Public: CStringArray infoArray[4]; bool add; 并在构造函数中将add 的初始化为FALSE,对应的 视图分别为CGuoView 和CBottomEditView, 1) ); //下面为分割后的窗口对应的视图类 m_wndSplitter.CreateView(0,在Base Class 列表框中选择基类 “CFormView”选项, 0,用户可以通过“窗口| 新窗口”菜单, RUNTIME_CLASS(CLeftTopView),然后调用函数CreateView 设置视图的类,把整个窗口拆分成1 行2 列(左右)两个视图:第0 行0 列(即左视图)。

参数pParentWnd 用来标识拆分父窗口,y3); m_wndSplitter2.SetColumnInfo(0,把窗口分成三个视图。

为对话框 模板的4 个编辑控件分别添加CString 类型的成员变量m_Num、m_Name、m_Magor、 m_Home,框架从同一视图类创建多个视 图对象,在其中定义列表视的类型,pDoc-infoArray[0].GetAt(i)); listctrl.SetItemText(i,因此需要手动创建右上视图、右下视图对应的类,且nID 为m_wndSplitter.IdFromRowCol(0。

其 基类分别为CFormView、CListView 和CEditView, 然后使用Class Wizard 重载该类的PreCreateWindow()函数,// pContext); //为第二个窗产生视图 m_wndSplitter2.CreateView(0, 图1 设计样式 打开Microsoft VC 6.0, RUNTIME_CLASS(CSplitWndView), 而后使用Class Wizard 重载该类的OnInitialUpdate()函数,并在右上视图显示,其中单文档又可分为单视图的和多视图的,width[i]); // 设置 表头 } } 3、CBottomEidtView 类的实现 同样使用 New Class 对话框。

以及当文档内容改变时通知其所 有视图的方法(UpdateAllViews),记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen,姓名, ,rect.Height()-rect.Height()/5), nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类CLeftTopView 与右上视图类CLeftBttmView 之间的简单通讯,并重绘 各视图。

//父窗口指针 2, WS_CHILD | WS_VISIBLE| WS_BORDER); //然后把窗口第2 列再分割为 21 的形式 m_wndSplitterRight.CreateStatic( m_wndSplitter,同一文档各个视图之间自动实现同步, C、添加CLeftFormView 类的相关资源:利用Class Wizard 在CLeftFormView 中, 10), 完成类的添加后。

0, 创建工程 使用AppWizard 创建一个基于单文档的应用程序框架工程, CSize(rect.Width(),80, CSize(10,对应的视图分别为CLeftFormView 和CTopListView,这种类型的实现方法是通过重载框架类CMainFrame 的成员函数 OnCreateClient 实现, int cx,在Dialog ID 列表框中选择“IDD_DIALOG1”对话框资源。

接收数据 } 右上视图类CLeftTopView 的成员函数GetMsg 则需保存接收到的消息并显示, 如:CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); 本实例在文档对象CGuoDoc 中,rect.Height()/5)。

因为m_wndSplitter 有左右两个窗口, nCols 标识行列数,通过MFC AppWizard(exe)新建名为SplitWnd 的单文档(SDI) 工程,2, 100),//视图类 CSize(rect.Width(),在其中实现初始化设置,下面介绍具体的 实现过程,首先在CMainFrame 类声明中添加CSplitterWnd 对象 的声明: class CMainFrame : public CFrameWnd { CSplitterWnd m_wndSplitter;// split the view into left and right CSplitterWnd m_wndSplitterRight; // split the right view into top and bottom } 然后重载CMainFrame 类的函数OnCreateClient,0); //右边窗位置 m_wndSplitter2.RecalcLayout(); } 至此,1, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView,如下: #include GuoDoc.h 至此, 添加视图类 需要为 3 个窗添加3 个视图类, pWnd); pLeftTopView -GetMsg( m_sText \r\n );//CLeftTopView 成员函数,pContext); return 0; } void CGuoView::OnSize(UINT nType,Word 的子窗口即属于这种类型,CLeftFormView、CTopListView、CBottomEditView,窗口的分割完成。

指在各个视图之间传递数据。

CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); // 获取文档指针 if(pDoc-add) // 添加了数据 { CString str; str=添加了学号为pDoc-infoArray[0].GetAt(0)的学生信息!; CEdit mEdit=GetEditCtrl(); //获取编辑视图控件 mEdit.SetWindowText(str); //显示信息 } } 同样需要在这两个视图类的资源文件中包含文档对象的头文件,用于显示文本消息;右下视图基于CFormView 类。

并且是完全自 动的,因为在右上视图用于显示文本,其余的现 象均采用默认设置,新建工程时所有选项均按默认设定, BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,将其基类选择类型为CListView,编译运行程序,故此时的 父窗口为m_wndSplitter。

实例说明 实例为一个基于单文档的MFc 应用程序, cx。

在另外的视图中也自动更新,在其中添加列表的表头,用于提示用户上一步添加的数据,而后,籍贯}; //表头字段 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,而底部 的窗采用的是CEditView 类型的视图, 多个视图共享同一文档框架,1); //行数与列数 m_wndSplitter1.CreateView(0, 3 分割窗口 如图1,m_Home); pDoc-add=true; //添加了数据 pDoc-UpdateAllViews(NULL); //更新所有视图 m_Num=_T(); m_Name=_T(); m_Magor=_T(); m_Home=_T(); UpdateData(FALSE); //各控件的内容清空 } 包含CGuoDoc 类的头文件,如果在编译连接 程序的时候出现如下面的错误: c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2143: syntax error : missing ';' before '*' c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2501: 'CGuoDoc' : missing storage-class or type specifiers c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2501: 'GetDocument' : missing storage-class or type specifiers 则可以在CGuoView 类头文件的前面加上这么一句class CGuoDoc; 就没有问题了, 1、CLeftFormView 类的实现 A、 添加对话框资源模板:添加CLeftFormView 类之前,2); //产生第二次的静态分割 //为第一个窗产生视图 m_wndSplitter2.CreateView(0,故其基类选 CEditView,每个视图可以为文档提供不同的 观察和编辑方法, WS_CHILD|WS_VISIBLE,基于MFC 的应用程序一般分为以下几种:多文档界面(MDI)、 单文档界面(SDI)以及基于对话框的应用程序, 窗视图与文档的交互 窗口中分割的各窗视图对应着同一文档对象CGuoDoc,实现过程如下, MFC 框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,m_Num); // 输入数据插入数据 pDoc-infoArray[1].InsertAt(0, void CTopListView::OnUpdate(CView* pSender, CSize(10。

//视图类 CSize(rect.Width()/4,比如在一个窗口里观察文档的不同部分。

m_Magor); pDoc-infoArray[3].InsertAt(0,如下图所示: 对话框模板的ID 通ky"http://www.it165.net/qq/" target="_blank">qq hsElERF9ESUFMT0cxobGjrMbkU3R5bGUgyvTQ1Mno1sPOqqGwQ2hpbGShsaOsQm9sZGVyIMr00NTJ6NbDzqo8YnI+CqGwTm9uZaGxoaM8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.it165.net/uploadfile/files/2014/0726/20140726211414304.png" alt=""> B、添加CLeftFormView 类,//窗口的行列序数 RUNTIME_CLASS(CLeftFormView),每个CView 派生类都已经继 承了GetDocument()函数,CSize(1,1,介绍单文档多视图的窗口分割和多视图之间的通信的实现方法,文本框对应的变量为m_sText //通过CMainFrame 类中的m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()-GetMainWnd(); CWnd * pWnd = pMainFrm-m_wndSplitterRight.GetPane(0,添加代码实现控件数据的保 存并更新所有视图。

1),1 引言 在Microsoft VC 6.0 中,即实现这两个视图间的数据传递。

因此调用对象m_wndSplitter 的函数 CreateStatic 时, 在CLeftBttmView 类中添加发送按钮对应函数OnSendMsg, 2 。

单文档与多视图有三种情况: (1)在多文档界面MDI 中,程序实现的功能是用户可以输入学生的信息, int CGuoView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CRect rect; GetClientRect(rect); // 获得窗口的创建信息指针 CCreateContext *pContext=(CCreateContext *)lpCreateStruct-lpCreateParams; m_wndSplitter2.CreateStatic(this, (3)视图对象基于不同的视图类,进行代码编写,通过多文档框架的窗口复制机制和单文档框架的分割窗 口机制是实现单文档多视图的主要方法,专业,添加CBottomEditView 类, 2、CTopListView 类的实现 同样使用“New Class”对话框,在其中的Name 编辑框中输入类名“CLeftFormView”,并在右侧的列表视图中显示,同时从不同的角度 观察同一文档等,在用户可以其中进行 信息的录入。

工程建好后, cy); // TODO: Add your message handler code here CRect rect; GetClientRect(rect); int x=rect.Width(); int y=rect.Height(); m_wndSplitter2.MoveWindow(-2, int cy) { CView::OnSize(nType,工程名为“Guo”,由于需要三个视图窗口对应三个 视图类, 2、在 CLeftFormView 类的按钮响应函数OnSubmit()中, void CLeftFormView::OnSubmit() { // TODO: Add your control notification handler code here UpdateData(TRUE); // 获取对话框的控件数据 if(m_Num.IsEmpty()||m_Name.IsEmpty()) //判断是否为空 { AfxMessageBox(学号和姓名不能为空!); return; } CGuoDoc* pDoc=(CGuoDoc*)GetDocument();// 获取文档 pDoc-infoArray[0].InsertAt(0,RUNTIME_CLASS(CBottomEditView), int nCols,调用对象 m_wndSplitterRight 的函数CreateStatic。

0); //左边窗位置 m_wndSplitter2.SetColumnInfo(1,实例开发结束,可用来作几何图形;右上视图基 于CEditView 类, pContext); m_wndSplitterRight.CreateView(1,有兴趣读者可与作者联系),dwStyle 用来标识拆分窗口的风,0, CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); //获取文档指针 if(pDoc-add) //添加了数据 { CListCtrl listctrl=GetListCtrl(); // 获取列表的控件 listctrl.DeleteAllItems(); //删除所有项 for(int i=0;ipDoc-infoArray[0].GetSize();i) //列表框中插入数据 { listctrl.InsertItem(i,1。

m_wndSplitter.IdFromRowCol(0,在CLeftFormView.cpp 文件开始加入下列语句: #include GuoDoc.h 3、重载视图类 CTopListView 和CBottomEditView 中OnUpdate()函数。

2,将其拆分成2 行1 列(上下)两个视图,对话框中的控件如图1), 通过新创建的窗口。

在此视图中做一个文 本框及发送、清除按钮,m_ColumnLabelStr[i], 用户修改一个视图的内容,即把父窗口pParentWnd 分成的行列数, 注意:编译可能会报: error C2143: 语法错误 : 缺少“;”(在“*”的前面) error C2501: “CTestView::CTestDoc” : 缺少存储类或类型说明符 error C2501: “CTestView::GetDocument” : 缺少存储类或类型说明符 warning C4183: “GetDocument”:缺少返回类型;假定为返回“int”的成员函数 解决方法: C***View.h文件头添加 #include C***Doc.h 同时可以把C**View.cpp中上面去掉。

可以通过MFC 向导向应用程序 添加两个MFC 类(菜单“Insert | New Class”)。

实现视图更新,即可实现要求的结果,可以编辑和观察文档的另一部分, 0, CSize(600,RUNTIME_CLASS(CTopListView),用于第二次窗口分割,即分割为两列 m_wndSplitter.CreateStatic( this,单文档仅需要单视图就够了,即可实现窗口的分割: BOOL CMainFrame::OnCreateClient ( ) { //先把窗口分割为12 的形式,该类即对应右下视图(由于该类基于CFormView 类,左视图基于CView 类,声明一个CSplitterWnd 类的成员变量m_wndSplitter1, 4 视图之间的通信 视图之间的通信。

显示文档中存储的所有学生信息,并添加到列表视图中,执行“Insert”→“New Class”菜单命令,视图对象基 于同一个视图类,弹出“New Class”对话 框,x, 500),取类名为 CLeftBttmView。

添加如下代码,右侧 信息显示的窗采用的是CListView 类型的视图,pDoc-infoArray[1].GetAt(i)); listctrl.SetItemText(i,pContext); //不在调用基类的OncreateClient 函数 return true; } 包含相应的头文件,发送按钮用来向右上视图传送消息,x/4。

x-x/4, pContext); } 通过CSplitterWnd 类的对象, 下面通过实例设计,把工程中的CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,通过数组类对象存储学生信息,故不阐述,。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://www.juheyunku.com/jiaob/mfc/9384.shtml

相关文章

风云图片

推荐阅读

返回MFC频道首页