[MFC]解决单文档创建Dock窗口出现DockPane()未定义问题

来源:互联网 发布:最小的windows系统 编辑:程序博客网 时间:2024/05/29 14:26

问题描述

近来,要编写一个用于显示处理影像的单文档程序,这个程序需要在右侧单独显示影像图层列表,并实现可停靠可浮动的特性。经过查阅资料,发现利用MFC的CDockablePane类可以实现,于是通过教程进行创建,但是在Dock实现的最后一步出现问题,也就是在CMainFrame类中的OnCreate中添加如下代码时,编译器提醒DockPane()未定义。

DockPane(&m_layers_pane);

图1 错误提示

问题原由

后来才发现,我所创建的单文档程序中的CMainFrame类的基类是CFrameWnd,而DockPane()函数是包含在CFrameWndEx类中的,也就是说,如果CMainFrame的基类能改为CFrameWndEx的话,上述问题便可解决


解决方法

如何使CMainFrame的基类为CFrameWndEx呢?

在类视图中可以查看CMainFrame的基类,但是却无法更改,如果不嫌麻烦的话,可以参考CFrameWndEx类中DockPane()的实现代码,在CFrameWnd中自行添加实现,但无疑这种方法十分不可取。

如果不去自己实现DockPane()的功能,那只能重新创建项目,将CMainFrame的基类设置为CFrameWndEx。

在重新创建项目的时候,设置向导的最后一步是设置各个生成类的信息,但是当我想修改CMainFrame的基类时发现,这个选项是灰色的,即无法修改,如图2所示。


图2 无法修改

我想,这应该与设置向导中前面几步的设置有关,于是我返回上面几步查看,果然,在选择用户界面功能的时候,有多个选项可供选择,如图3所示,在“命令栏(菜单/工具栏/功能区)”设置中,有三个选项, 如果选择“使用经典菜单”,则在之后的“生成的类”中CMainFrame的基类便是CFrameWnd,如果选择其它两个中的一个,则CMainFrame的基类便是CFrameWndEx。这里我选择“使用菜单栏和工具栏”。


图3 命令栏方案选择

继续下一步,直到最后“生成的类”,查看CMainFrame的基类便默认为CFrameWndEx了。


图4 基类已变为CFrameWndEx类

好了,根据上面发的教程,最终可以成功创建出Dock窗口。


图5 程序创建结果

原创粉丝点击