VC驿站

?找回密码
?加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 122|亚博体育登录失败: 5
打印 上一主题 下一主题

[原创] VS2017单文档程序窗口分割没有CFormView基类的解决方法

[复制链接]
001
43_avatar_middle
跳转到指定楼层
1#
本帖最后由 HackerWen 于 2019-8-14 11:10 编辑

起因:
? ? ? ? 最近在学习VC++高级版之窗口篇,在学习最后一节课《单文档程序之窗口分割》的时候,出现了一点问题。
? ? ? ? 其实也不是什么大问题,Syc大大视频中的编程环境时xp + VS2008,我的环境的win7 + VS2017,有些不同时正常的,我首先在网上搜了一下,没有找到什么好的解决方法,于是我自己查了msdn,加上自己的一些尝试,解决了这个问题,现在分享一下。

? ? ? ? 目标是将下图底部的日志窗口替换为对话框样式的窗口
? ? ? ? 改之前:
? ? ? ? VS2017单文档程序窗口分割没有CFormView基类的解决方法

? ? ? ? 改之后:
? ? ? ? VS2017单文档程序窗口分割没有CFormView基类的解决方法


经过:
先来回顾一下低版本VS单文档程序窗口分割的几个步骤,这个在视频中都有讲解哦,在课件里也有:
1)新建一个单文档工程:SpliterTest,会默认生成CMainFrame、CSpliterTestApp、CSpliterTestDoc、CSpliterTestView这几个类
? ???其中向导默认将CSpliterTestView的基类选择为CView,这是问题所在

2)各个分割窗口类的添加:类向导、添加MFC类:分组信息类、客户端信息类、日志信息类
? ???CGroupTreeView,基类选择:CTreeView
? ???CClientListView,基类选择CListView
? ???CLogListView,基类选择CListView

3)重载CMainFrame::OnCreateClient函数,进行分割窗口的创建:
? ?
  1. // 对参1窗口进行分割,分成2行1列
  2. // 以后再对第0行窗口进行分割,成为两列
  3. if (!m_wndSplitter.CreateStatic(this, 2, 1))
  4. ? ? ? ? return FALSE;

  5. // 给第0行0列窗口关联一个类,因为0行0列的窗口以后还要被分割,所以目前关联项目自身的CSpliterTestView类
  6. // 给第1行0列的窗口关联CLogListView类
  7. if (!m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS(CSpliterTestView), CSize(0, 260), pContext) ||
  8. ? ? !m_wndSplitter.CreateView( 1, 0, RUNTIME_CLASS(CLogListView), CSize(0, 0), pContext) )
  9. {
  10. ? ? ? ? m_wndSplitter.DestroyWindow();
  11. ? ? ? ? return FALSE;
  12. }

  13. return TRUE;
复制代码

4)响应CMainFrame类的WM_SIZE消息,在OnSize中进行窗口位置的调整,具体代码略

5)响应CSpliterTestView类的WM_CREATE消息,在OnCreate中继续分割窗口:
  1. if (!m_wndSplitter.CreateStatic(this, 1, 2))
  2. ? ? ? ? return FALSE;

  3. CCreateContext *pContext = (CCreateContext *)lpCreateStruct->lpCreateParams;

  4. //给0行0列窗口关联CGroupTreeView类
  5. //给0行1列窗口关联CClientListView类
  6. if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CGroupTreeView), CSize(100, 100), pContext) ||
  7. ? ? !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CClientListView), CSize(0, 0), pContext))
  8. {
  9. ? ? ? ? m_wndSplitter.DestroyWindow();
  10. ? ? ? ? return FALSE;
  11. }

  12. return TRUE;
复制代码

6)响应CSPliterTestView的WM_SIZE消息,在其OnSize中进行窗口位置调整,具体代码略

7)在各个分割视图窗口上添加内容:在各个关联视图类OnInitialUpdate中初始化,具体代码略

8)可放置控件的视图类:CFormView
? ???类向导添加MFC类CFilterFormView,基类选择:CFormView。
? ???此时资源里,就有对话框模版了,就可以拖控件了。将第3)步的1行0列窗口,替换为本类CFilterFormView。运行就可以看到效果了。

好,以上步骤的第8)步,我在VS2012里,是可以进行的,但是在VS2017里,类向导里没有CFormView这个基类~~~噢,这。。。
我在网上没看到什么好的方法,在msdn中有一句话,如下:
VS2017单文档程序窗口分割没有CFormView基类的解决方法

这下我就明白了,在项目创建的时候,也就是上面的第1),View的基类不要选择CView,而是要选择CFormView,改动如下:
1)在项目创建向导的最后一步,View类的基类选择CFormView,这样一运行起来,整个客户区就是对话框模版!!!

2)按照前面的第2)步,添加3个类:
? ???CBaseView,基类选择CView
? ???CGroupTreeView,基类选择:CTreeView
? ???CClientListView,基类选择CListView
? ???为啥要加CBaseView类?因为此时我们不需要日志类CLogListView来关联底部的窗口,我们就把本身客户区的对话框当作底部。
? ???CBaseView类当作CGroupTreeView、CClientListView类的载体,实践证明如果CBaseView的基类选择得太具体了,比如CListView、CTreeView等,会报错。

3)在前面第3)步,CMainFrame类的OnCreateClient里:
? ???0行0列窗口关联CBaseView类,1行0列窗口关联项目自身的CSpliterTestView类

4)参考前面第5)步,响应CBaseView类的WM_CREATE消息,在OnCreate里,继续分割,1行2列:
? ???0行0列关联CGroupTreeView,0行1列关联CClientListView,即可

结果:
改动几个地方之后,就能在底部窗口显示对话框模版了,可以拖控件了,这不是啥高深的技术,就是遇到一点小问题,自己连蒙带猜,查询msdn,得出来的一点经验。
如果大家有其他方法,希望告知哦
VS2017单文档程序窗口分割没有CFormView基类的解决方法




上一篇:读写Unicode编码文件乱码解决方案
08_avatar_middle
2#
在线会员 发表于 前天?14:52 | 只看该作者
论坛又一精华帖出现,支持支持
43_avatar_middle
3#
ico_lz ?楼主| 发表于 前天?16:15 | 只看该作者
SummerGull 发表于 2019-8-14 14:52
论坛又一精华帖出现,支持支持

第一次写帖子,感谢捧场,哈哈
87_avatar_middle
4#
在线会员 发表于 前天?17:16 | 只看该作者
其实最下面一个分割窗体,也可以从CDialog继承,只不过需要自己对有些地方代码改一下就能使用了!
16_avatar_middle
5#
在线会员 发表于 前天?18:39 | 只看该作者
cqzj70 发表于 2019-8-14 17:16
其实最下面一个分割窗体,也可以从CDialog继承,只不过需要自己对有些地方代码改一下就能使用了!

感谢楼主精华帖,受教了
43_avatar_middle
6#
ico_lz ?楼主| 发表于 前天?18:45 | 只看该作者
cqzj70 发表于 2019-8-14 17:16
其实最下面一个分割窗体,也可以从CDialog继承,只不过需要自己对有些地方代码改一下就能使用了!

是嘛,感谢分享,我去试试瞧
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )?tongdun|网站地图wx_jqr

GMT+8, 2019-8-16 10:01

Powered by Discuz! X3.4

? 2009-2019 cctry.com

快速亚博体育登录失败 返回顶部 返回列表