我已经开始编写自己的终端模拟器。 该项目一旦实现,将是VanDyke SecureCRT的复制品。
它应该支持 Telnet 和 SSH 协议,如果一切顺利,也许还会支持更多。
目前我正在研究其中最简单的一个,即 Telnet。
该应用程序是 MFC MDI,这是我需要您的建议的地方。 如何最好地构建它?
为每个协议创建一个文档模板? 这似乎是一种可怕的浪费,因为大多数代码都是相同的。
所有事情都应该在 Document 类中完成吗? 并且视图仅用于显示?
或者让视图完成连接、读取用户输入和显示服务器输出的所有工作?
应该有两个视图吗?每个协议一个? 据我所知,这不是一件容易做到的事 最好的方法是让我回到两个文档模板场景。
我已经编写了一个工作命令行 telnet 客户端并且 目前我已经到了需要决定如何继续使用 Windows 的地步。
在 MFC 中,您通常不会对文档模板类进行太多工作(我想说根本没有)。文档模板是资源 ID 与文档、框架窗口和视图类的关联。该框架处理其所有操作,我不明白为什么人们可能想要修改其行为。相反,您可以在应用程序类的
CSingleDocTemplate
成员中创建 CMultiDocTemplate
(SDI) 或 InitInstance()
(MDI) 类的实例 - 每个所需组合一个实例。
一种解决方案可能是:
CWinApp::InitInstance()
中定义两个文档类型(1)(用于 Telnet 和 SSH)和两个文档模板实例,我会说,存储两个实例指针。
GetDocument()
)。(1) 如果您发现两个协议的数据和/或操作非常相似或几乎相同,那么这样的实现将是“可怕的浪费”,您可以定义一个共同的祖先或“基础”文档类(带有一些虚拟或纯虚拟成员)并修改两个文档类,以便它们继承自该类,而不是
CDocument
。UpdateData()
、OnUpdate()
和 UpdateAllViews()
函数。要编写“纯粹”MFC,请尝试构建程序,以便文档类不
#include
其视图类,即文档类不应该“知道”或对其视图做出假设。要执行特殊更新,您可以对 lHint
函数的 pHint
和 UpdateAllViews()
参数中所需的信息进行编码; UpdateAllViews(NULL, 0, NULL)
调用意味着所有文档视图的完全更新。
定义两个或多个视图类并不是特别困难,至少我不明白为什么。您甚至可以找到对同一文档使用两个或三个视图类的示例,例如在同一个 MDI 子框架下或在单独的子框架中(在这种情况下,框架将它们命名为“图形”和“表单”) ,例如 Document1[1]、Document1[2] 等)。如果视图操作本质上是相同的,您可以简单地定义一种视图类型并调用基文档类的虚拟成员函数(这实际上会调用重写的视图类型)。