VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1614|回复: 9

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

[复制链接]
001
43_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-14 11:10:22 | 显示全部楼层 |阅读模式
本帖最后由 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基类的解决方法

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 支持原创!

查看全部评分





上一篇:读写Unicode编码文件乱码解决方案
下一篇:static控件重绘问题
08_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-14 14:52:56 | 显示全部楼层
论坛又一精华帖出现,支持支持
43_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-14 16:15:10 | 显示全部楼层
SummerGull 发表于 2019-8-14 14:52
论坛又一精华帖出现,支持支持

第一次写帖子,感谢捧场,哈哈
87_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-14 17:16:55 | 显示全部楼层
其实最下面一个分割窗体,也可以从CDialog继承,只不过需要自己对有些地方代码改一下就能使用了!
16_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-14 18:39:32 | 显示全部楼层
cqzj70 发表于 2019-8-14 17:16
其实最下面一个分割窗体,也可以从CDialog继承,只不过需要自己对有些地方代码改一下就能使用了!

感谢楼主精华帖,受教了
43_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-14 18:45:28 | 显示全部楼层
cqzj70 发表于 2019-8-14 17:16
其实最下面一个分割窗体,也可以从CDialog继承,只不过需要自己对有些地方代码改一下就能使用了!

是嘛,感谢分享,我去试试瞧
58_avatar_middle
最佳答案
6 
online_vip 发表于 2019-9-2 22:15:13 | 显示全部楼层
学习了,谢谢师兄。
98_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-23 17:15:16 | 显示全部楼层
驿站越来越好,谢谢老师们的无私奉献
92_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-25 17:38:23 | 显示全部楼层
我在想:怎么用Win32实现这个功能呢?
58_avatar_middle
最佳答案
6 
online_vip 发表于 2019-10-25 23:31:19 | 显示全部楼层
peiyingxuan 发表于 2019-10-25 17:38
我在想:怎么用Win32实现这个功能呢?

看MFC源码。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2019-11-19 04:19

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表