【问题标题】:Convert MFC Doc/View to?将 MFC 文档/视图转换为?
【发布时间】:2023-03-25 10:35:03
【问题描述】:

我的问题很难形成,但要开始:

我有一个 MFC SDI 应用程序,我已经工作了很长时间,但它似乎从来不适合 Doc/View 架构。 IE。 Doc中没有任何有用的东西。它是多线程的,我需要在线程等方面做更多的事情。

我也梦想将它移植到 Linux X Windows,但我对那个编程环境一无所知。也许 Mac 也是。

我的问题是从这里去哪里?

我想我想从 MFC Doc/View 转换为带有消息循环和窗口过程等的直接 Win API 的东西。但任务似乎很艰巨。

Linux X Windows 环境是否使用类似的消息循环、窗口过程架构?

我可以走一部分吗?就像一次转换一点,而不会使我的程序无法长时间工作?


稍后添加:

我的程序是一个文件比较程序(听起来很简单。)所以,以一种简单的方式说明我的困惑,通常一个文档可以有多个视图,但在这个应用程序中,我有一个视图有多个(两个)文档(文件)。我有一个“比较引擎”,这是我在 DOS 时代第一次写的,它是程序的核心,视图只是查看该例程的输出。有时我认为我的一些“视图”代码在“文档”类中可能有意义,但我几乎不知道从哪里开始将它分成更多类。我最近开始阅读“Programming Windows”第 5 版。作者:Charles Petzold,(我知道那已经过时了 (C) 1998),希望能更好地理解直接 Windows 编程。

C#、NET、MFC、MVC、Qt、wxWidgets 等选项的激增让我不知所措。

我发现我经常无法理解 MFC 框架中发生的事情,因为我的代码中的某些内容无法正常工作,但问题是我并不真正了解 MFC 是如何处理事情的在后台。这就是为什么我试图学习“直接的 Windows 编程”,我的程序包含我编写的所有消息传递代码。我希望这有助于深入了解我的问题,以便有人可以指导我。

【问题讨论】:

标签: linux mfc x11


【解决方案1】:

X 的工作方式非常不同,以至于原始 Windows 程序和原始 X 程序可能根本无法共享太多 UI 代码。

如果您希望两者之间具有可移植性,那么您很有可能想要使用 Qt 或 wxWidgets 之类的东西。在这两者中,wxWidgets 与 MFC 更相似,因此它可能需要更少的重写,但会(或多或少)保持(或多或少)您在想要的内容和它提供的内容之间看到的相同“断开”。

如果不了解您的应用程序的更多信息,以及为什么它不适合 MFC,就无法猜测 Qt 是否更适合。直接的猜测是“可能不会”。

MFC 使用“文档/视图”架构,而 Qt 使用原始的模型-视图-控制器架构。在大多数情况下,MFC 的 Document 类基本上等同于一个模型和一个控制器——因此,如果您的 Document 不包含任何有用的内容,那么在 Qt 中您显然会同时拥有一个模型和一个控制器,这两者都没有做太多的事情有用。

也就是说,我必须提出一个问题,即为什么您的 Document 目前没有做太多事情。 MVC 模式已被证明适用于各种各样的问题,因此虽然它可能无法很好地解决您的问题,但也有可能它可以很好地工作,而您根本没有使用它。如果不知道更多关于你在做什么,你甚至无法猜测。


编辑:好的,澄清很有帮助。首先要意识到的是,文档确实不一定等同于文件。恰恰相反,一个文档可以完全合理地与任意数量的文件相关。

例如,考虑一个网络浏览器。构成其当前显示的页面所需的所有数据将合理地属于同一文档的一部分。根据您的观点,这要么是零个文件,要么是一大堆文件(它将作为来自服务器的任意数量的文件开始,但不一定会在本地存储为文件)。将其中的任何内容作为文件存储在本地将是(或多或少)缓存的意外副产品,并且大多与浏览本身无关。

在您的情况下,您可能正在将两个(或三个?)文件读入内存并将它们与某种数据结构一起存储以保存比较结果。比较完成后,您可能会也可能不会丢弃文件本身的内容。我认为可以肯定地说,“正常”的职责分离是针对该数据生成该数据的代码在文档中。

视图应包含从该数据结构中获取结果并将其显示在屏幕上的代码。您通常想要存储在视图中的几乎唯一数据是与数据呈现方式相关的内容(例如,缩放级别或当前滚动位置等内容)。同样,视图中的代码应该只与显示结果和对用户输入做出反应有关,而不是首先“创建”数据。

因此,我认为您的程序可以重写以更有效地使用文档/视图模式,或者可以重写以使用 MVC。反过来,这意味着 Qt 的移植可以/可能工作得很好——只要你愿意花一些时间和精力来理解它的工作原理,然后对你的代码进行可能相当大的改变按照设计的方式工作。

正如我之前评论的,wxWidgets 在这方面更像 MFC —— 它使用文档和视图,而不是模型、视图和控制器。如果您按照设计的方式进行一些重写以分离职责,它也将发挥最佳作用。好的一点是,一次完成这一步可能更容易一些:在 MFC 中重写您已经熟悉的代码,然后将其移植到 wxWidgets —— 但鉴于两者之间的相似性, “端口”可能只不过是少量编辑——通常只需将一些名称从 C* 更改为 wx* 就足够了。回想起来,我唯一做大量工作的地方是创建菜单——使用 MFC,它们通常是通过资源处理的,但是(至少在我使用它的几年前)wxWidgets 通常直接暴露代码创建了菜单项。

移植到 Qt 可能需要更多的工作——您几乎必须学习一个新框架,并且同时大幅重组您的代码。好的一点是,当你完成后,结果可能会更干净一些,尽管考虑到你正在做的事情,差异可能很小。在文档/视图中,视图显示数据并对用户输入做出反应。在模型/视图/控制器中,视图只显示数据,但用户输入(修改底层数据)通过控制器。由于您(大概)不希望修改基础数据,因此在任何情况下,唯一涉及的用户输入可能都属于视图(例如,滚动等)。您几乎不可能在 Document/Model 中放入一些可以更改的内容(例如,当前字体或用户选择的颜色等内容)。

【讨论】:

  • 谢谢你,杰瑞。我只是尝试添加评论以进行澄清,但它太长了,评论框右侧的“添加评论”按钮没有任何作用。当我弄清楚如何发布更长的内容时,我会添加我的说明。 (困惑)
  • 非常感谢你,杰瑞。我稍后会再读一遍,并尝试将这些想法结合起来。我仍然对如何转换为直接的 Windows 消息循环 WinProc 方式感兴趣(顺便说一句,这叫什么?)如果我从 MFC 过渡到“直接 Win 循环的东西”,菜单和工具栏的东西会成为问题吗“?
  • 菜单没问题(至少通常是这样)。工具栏可能需要更多的工作。
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2014-10-16
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多