用于视图-对话框问题的替代方法,使用对话框条






3.50/5 (4投票s)
2002年6月17日
3分钟阅读

95335

1887
在本文中,我展示了一种替代方法,可以避免在对话框上创建视图的棘手(且通常不稳定)的尝试。
引言
我尝试在对话框上创建一个视图,因此在网上查找了所有相关文章。 有几种尝试这样做的方法,但或多或少所有方法都会产生错误,并且在我看来并没有太大的用处。 所以我决定另辟蹊径。 我通过从CFrameWnd
派生类来创建了一个新的窗口类型(在我的演示项目中称为CDialogWindow
)。 在这个CDialogWindow
中,我使用了 Jorge Vigil 的代码创建了一个视图,该代码来自 http://www.codeguru.com/doc_view/ReplacingView.shtml(我当然对其进行了修改,但仍然感谢 Jorge)。 这个视图是一个CScrollView
,这正是我的主要意图,也许也是你的。 想象一下,在对话框上全尺寸显示位图的任务,该位图不适合对话框窗体。 我自己的任务是显示由 ActiveX 控件生成的视频图像。 我没有真正在对话框中显示此图像,而是在CDialogWindow
中创建了刚刚提到的视图,并向该窗口添加了一个CDialogBar
。 结果看起来几乎像一个包含视图的对话框。
但不幸的是,我不得不面对使用这种简单技术的意外缺点。 由于CDialogBar
没有与自己的类连接,而是与CDialogWindow
类连接,因此无法将变量与控件连接。 这当然意味着所有高级控件,如微调按钮、滚动条等,都需要由“控件”类型的变量表示,都不能使用。 窗口的功能减少到使用方法GetDlgItemInt()
、GetDlgItemText()
、SetDlgItemInt()
、SetDlgItemText()
在文本字段中进行输入和输出。 也许有人可以改进我的项目并告诉我如何在这样的窗口中使用各种控件。
用法
正如你在演示项目中看到的那样,我已将CDialogWindow
添加到一个 MDI 项目中,而没有使用应用程序向导创建的任何类。 因此,如果你将我的项目作为起点,你仍然拥有 MDI 应用程序的所有功能。 我主要没有使用生成的视图类,而是从另一个项目导入了一个类,因为这个类很适合我的目的。 为了向你展示窗口的工作原理,我用简单的文本替换了我的视频图像。 如果你想复制我的一些代码,这对你意味着什么
- 将
CDialogWindow
类复制到你的项目中,并使用DoModeless()
方法创建一个对象,正如你在项目中看到的那样。 - 如果你还想显示任何东西,而不是文档,那么也复制
CExtraView
类,并修改OnDraw()
方法,使其显示你的内容。 - 如果你想创建文档的视图或从你自己的视图类创建一个视图,只需替换
CDialogWindow::OnCreateClient()
中的RUNTIME_CLASS
宏中的类名,并且不要忘记声明CVideoWindow
为你自己的视图类的友元。 当然,你还需要做一些其他小的修改,例如包含头文件等等。
结论
如果你可以改进我的类,请给我发送电子邮件,特别是如果你能够使用对话框栏中的各种控件。 很抱歉,我使用德语版本的 SDK 生成了演示项目。 因此,自动生成的注释是德语的。 这不应妨碍你理解代码,因为我自己的所有代码都用英语注释。