- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的问题很难形成,但要开始:
我有一个令人尴尬的工作了很长时间的MFC SDI应用程序,它似乎从来都不适合Doc/View体系结构。即文档中没有任何有用的信息。它是多线程的,我需要在线程等方面做更多的工作。
我梦dream以求也将其移植到Linux X Windows,但是我对该编程环境还一无所知。也许Mac也是如此。
我的问题是从这里去哪里?
我想我想从MFC Doc/View转换为带有消息循环和窗口过程等的直接Win API东西。但是任务似乎很庞大。
Linux X Windows环境是否使用类似的消息循环,窗口过程架构?
我可以分开吗?想要一次转换一点而不会使我的程序长时间不能使用?
稍后添加:
我的程序是一个文件比较程序(听起来很简单。)因此,以一种简单的方式说明我的困惑,通常一个文档可以具有多个 View ,但是在此应用程序中,我的一个 View 包含多个(两个)文档(文件)。我有一个“比较引擎”,这是我在DOS时代第一次写的,它是程序的核心, View 只是在查看该例程的输出。有时我认为我的某些“ View ”代码在“文档”类中可能有意义,但我几乎不知道从哪里开始将其分为更多类。我最近开始阅读“Programming Windows”第5版。由Charles Petzold撰写,(我知道这已经过时了(C)1998年),希望能更好地理解直接Windows编程。
我对C#,NET,MFC,MVC,Qt,wxWidgets等选项的泛滥感到不知所措。
我发现我经常被困在试图理解MFC框架中发生的事情,因为我的代码中的某些内容似乎无法正常工作,但是问题是我不太了解MFC如何在后台处理事情。 。这就是为什么我试图学习“直接Windows编程”的原因,其中我的程序具有我编写的所有消息传递代码。我希望这有助于对我的问题有足够的了解,以便有人可以引导我前进。
最佳答案
X的工作方式完全不同,以至于原始Windows程序和原始X程序可能根本无法共享很多UI代码。
如果您希望两者之间具有可移植性,那么很可能要使用Qt或wxWidgets之类的东西。在这两者中,wxWidgets与MFC更相似,因此它可能需要较少的重写,但将(或多或少)维持您在所需内容和提供的内容之间看到的相同“断开连接”。
如果不了解您的应用程序以及为什么它与MFC不太匹配,就无法猜测Qt是否会更好。立即猜测可能是“可能不是”。
MFC使用“文档/ View ”体系结构,其中Qt使用原始的“模型- View - Controller ”体系结构。在大多数情况下,MFC的Document类基本上等效于一个Model和一个Controller合并成一个类-因此,如果您的Document不包含任何有用的内容,那么在Qt中,您显然会同时拥有Model和Controller,而这两者所做的工作都不多有用。
就是说,我不得不提出一个问题,为什么您的文档当前没有做很多事情。 MVC模式已被证明适用于各种各样的问题,因此尽管它可能无法很好地解决您的问题,但也可能它可以很好地工作,而您根本就没有使用它。如果不了解自己在做什么,尽管如此,甚至无法猜测。
编辑:好的,澄清有很大帮助。首先要意识到的是,文档不一定等于文件。恰恰相反,文档可以完全合理地与任意数量的文件相关。
例如,考虑使用Web浏览器。构成其当前显示的页面所需的所有数据都将合理地属于同一文档。根据您的观点,它要么是零个文件,要么是一整堆文件(它将以来自服务器的任意数量的文件开始,但不一定完全存储为本地文件)。将其中的任何一个存储为本地文件将(或多或少)是缓存的偶然副产品,并且几乎与浏览本身无关。
在您的情况下,您大概是将两个(或三个?)文件读取到内存中,并将它们与某种数据结构一起存储以保存比较结果。比较完成后,您可能会也可能不会放弃文件本身的内容。我认为可以肯定地说,“正常”的职责分离是针对该数据以及生成该数据的代码在文档中。
View 应仅包含从该数据结构获取结果的代码,并将其显示在屏幕上。通常,您通常要在 View 中存储的唯一数据几乎就是与数据显示方式相关的事物(例如,缩放级别或当前滚动位置之类的事物)。同样, View 中的代码应仅与显示结果和对用户输入作出 react 有关,而不与首先“创建”数据有关。
因此,我认为您的程序可以重写为更有效地使用Document/View模式,或者可以重写为使用MVC。相应地,这意味着移植到Qt可能会/可能会很好-前提是您愿意花一些时间和精力来了解它的工作原理,然后对您的代码进行相当大的更改以按照设计方式工作。
正如我之前评论的那样,wxWidgets在这方面更像MFC,它使用的是Document和View,而不是Model,View和Controller。如果您进行一些重写以按照其设计的方式来划分职责,那么它也将最好地工作。好处是,一次完成一个步骤可能会更容易一些:在MFC中重写您已经熟悉的代码,然后将其移植到wxWidgets中,但是鉴于两者之间的相似性, “端口”可能只不过是次要的编辑而已-通常只需将某些名称从C *更改为wx *就足够了。回想起来,我唯一要做的工作就是创建菜单-使用MFC,它们通常是通过资源来处理的,但是(至少在几年前,当我使用它时)wxWidgets通常直接公开了创建菜单项。
移植到Qt可能需要做更多工作-您几乎必须学习一个新框架,并在实质上同时重组代码。好处是,完成后,结果可能会更清晰一些,尽管根据您的操作,两者之间的差异可能很小。在文档/ View 中, View 显示数据,并对用户输入使用react。在模型/ View / Controller 中, View 仅显示数据,但用户输入(修改基础数据)通过 Controller 。由于您(可能)不希望修改基础数据,因此在任何情况下(例如,诸如滚动之类的东西),涉及的唯一用户输入都可能属于 View 。您几乎不可能在文档/模型中放一些可以更改的内容(例如,当前字体或用户选择的颜色之类的内容)。
关于linux - 转换MFC Doc/View到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482381/
我有一个 MFC 项目,它链接到第三方 dll。在程序退出时,IDE 会报告“检测到内存泄漏!”并倾倒泄漏物。 这些泄漏来自第三方 dll。我很确定这些是错误的报道。 (Google 的快速检查表明
首先我想要的是:能够显示具有多列的网格,每个单元格都有一个自定义渲染回调。因此,您可以使用这样的控件在游戏中显示您的库存,或者类似于 Google Chrome 中的行为,它会显示您访问的热门页面的网
在新的 MFC 功能(功能包)中,菜单出现在三个地方: 在菜单栏中 (CMFCMenuBar) 在弹出菜单中 (CMFCPopupMenu) 在 CMFCButton 的“下拉菜单”版本中 我想在所有
在我的 MFC 项目中,我想动态生成标签。例如:我必须为它们生成 4 个编辑控件和相应的标签——比如“Label1”“Label2”...... CStatic *label[MAX_THREAD];
我有第一个对话框,上面有一个简单的按钮,单击该按钮时,使用 CDialog::Create(IDD,this) 创建了第二个对话框。我希望在销毁第二个对话框但不向第二个对话框添加任何代码时通知父级,即
我们的代码库中的添加到剪贴板代码非常低级 - 分配全局内存等等。对于简单的情况,我只想将一些纯文本放在剪贴板上,是否有任何例程可以包装所有这些内容? 一个例子是 CRichEditCtrl 具有 Co
我对 mfc 中事件和消息之间的区别有点困惑。 他们是一样的吗? 最佳答案 由于您专门询问 MFC,我假设您指的是可以在 MFC 类的属性窗口中定义的事件处理程序和消息处理程序。 在“事件”下,您可以
如何以编程方式检测我的 MFC 应用程序当前是否正在显示模式对话框或属性表?目前我正在使用以下内容,但我觉得该代码也会触发无模式对话框。 bool HasModalDialog(const CWnd*
我有两个按钮: 单选按钮:“十六进制” 按钮:“A” 我想在用户选中“十六进制”按钮时启用“A”(“A”在创建时的状态为“禁用”),我该怎么做?谢谢大家。 最佳答案 您需要使用 CButton 's
通常情况下,窗口的厚度为 4 个像素,可以通过 GetSystemMetrics 方法获取。我可以更改它的值,例如 2 个像素吗? 非常感谢! 最佳答案 简单的回答:不。不适用于特定窗口。 复杂的答案
我需要打开一个从同一个类实例化的对话框两次。当我尝试这个时 CdelmeDlg dlg; dlg.DoModal(); dlg.DoModal(); 第二个调用只打开对话框一瞬间,然后关闭。我敢打赌消
如何通过代码在 mfc 中减少标题栏的窗口? 最佳答案 用: ModifyStyle (WS_CAPTION, 0); // to hide ModifyStyle (0, WS_CAPTION);
我使用 AfxMessageBox 关键字显示消息框。基本的东西。 但是,由于路径的长度,它显示如下: 有什么方法可以阻止它以这种方式自动换行吗? 抱歉,如果这是一个愚蠢的问题。但如果我只有一个句子,
所以,我有一个 MFC 程序的插件。我正在使用鼠标事件 Hook (来自 SetWindowsHookEx)来捕获点击。主机应用程序可以打开任意数量的(可能重叠的)子窗口,但我只想拦截特定子窗口中的点
我正在尝试将图像添加到现有按钮..我在一定程度上做到了这一点,问题是我可以添加一个所有者绘制的图像,但无法添加我想要的确切图像..示例见下文代码 CButton* pBtn= (CButton*)Ge
我想在对话框的标题栏上放置一些控件。一种可能的解决方案是,我只是从对话框中删除标题栏并绘制自己的标题栏。 但是如果我自己画标题栏,标题栏的外观不会根据窗口的主题而改变。而且我也不得不忍受接近、最小化和
我已经使用 MinGW 开发了 WinAPI 应用程序,没有问题。现在,我可以用 MFC 做同样的事情吗? 最佳答案 你不能。 MFC 代表 Microsoft Foundation Classes,
(我正在使用VS ++ 2005) 我在对话框上放置了编辑框控件(ID为ID_edit_box),并为其关联了两个变量(使用处理程序向导):控件(c_editbox)和值(v_editbox)变量。我
我有一个自定义 MFC 对话框 CMyDialog,使用资源编辑器添加了一个类型为 CMyControl 的自定义控件 - 该对话框有一个控件的成员变量并且有 DDX设置。 该控件正在接收绘制消息,并
直到现在,我从未真正需要我正在开发的大型 MFC(如果重要,则为单文档界面)应用程序的 Winapp ExitInstance()。但现在我这样做了,主要是为了清理内存分配、卸载一些 DLL 等。好吧
我是一名优秀的程序员,十分优秀!