MFC MDI 指南/最佳实践

问题描述 投票:0回答:1

我已经开始编写自己的终端模拟器。 该项目一旦实现,将是VanDyke SecureCRT的复制品。

它应该支持 Telnet 和 SSH 协议,如果一切顺利,也许还会支持更多。

目前我正在研究其中最简单的一个,即 Telnet。

该应用程序是 MFC MDI,这是我需要您的建议的地方。 如何最好地构建它?

  • 为每个协议创建一个文档模板? 这似乎是一种可怕的浪费,因为大多数代码都是相同的。

  • 所有事情都应该在 Document 类中完成吗? 并且视图仅用于显示?

  • 或者让视图完成连接、读取用户输入和显示服务器输出的所有工作?

  • 应该有两个视图吗?每个协议一个? 据我所知,这不是一件容易做到的事 最好的方法是让我回到两个文档模板场景。

我已经编写了一个工作命令行 telnet 客户端并且 目前我已经到了需要决定如何继续使用 Windows 的地步。

c++ mfc mdi
1个回答
0
投票

在 MFC 中,您通常不会对文档模板类进行太多工作(我想说根本没有)。文档模板是资源 ID 与文档、框架窗口和视图类的关联。该框架处理其所有操作,我不明白为什么人们可能想要修改其行为。相反,您可以在应用程序类的

CSingleDocTemplate
成员中创建
CMultiDocTemplate
(SDI) 或
InitInstance()
(MDI) 类的实例 - 每个所需组合一个实例。

一种解决方案可能是:

  • CWinApp::InitInstance() 中定义两个文档类型
    (1)
    (用于 Telnet 和 SSH)和两个文档模板实例,我会说,存储两个实例指针。
  • 正如上面评论中所建议的,连接服务器、发送或接收数据等操作应该在文档类中完成。
  • 视图类应该执行诸如读取用户输入和呈现文档类获取的数据之类的事情(2)(3)
  • 视图被视为 GUI 对象。它可以直接或最好通过文档的成员函数修改其关联文档中的数据 (
    GetDocument()
    )。

(1) 如果您发现两个协议的数据和/或操作非常相似或几乎相同,那么这样的实现将是“可怕的浪费”,您可以定义一个共同的祖先或“基础”文档类(带有一些虚拟或纯虚拟成员)并修改两个文档类,以便它们继承自该类,而不是

CDocument

(2) 实施提示:检查
UpdateData()
OnUpdate()
UpdateAllViews()
函数。
(3) 您可能希望为连接/发送/读取操作使用单独的线程,特别是如果您连接到多个服务器和/或您的 api 仅是同步/阻塞的。这些操作可以“冻结”您的应用程序,直到服务器响应。

要编写“纯粹”MFC,请尝试构建程序,以便文档类不

#include
其视图类,即文档类不应该“知道”或对其视图做出假设。要执行特殊更新,您可以对
lHint
函数的
pHint
UpdateAllViews()
参数中所需的信息进行编码;
UpdateAllViews(NULL, 0, NULL)
调用意味着所有文档视图的完全更新。

定义两个或多个视图类并不是特别困难,至少我不明白为什么。您甚至可以找到对同一文档使用两个或三个视图类的示例,例如在同一个 MDI 子框架下或在单独的子框架中(在这种情况下,框架将它们命名为“图形”和“表单”) ,例如 Document1[1]、Document1[2] 等)。如果视图操作本质上是相同的,您可以简单地定义一种视图类型并调用基文档类的虚拟成员函数(这实际上会调用重写的视图类型)。

© www.soinside.com 2019 - 2024. All rights reserved.