我目前正在开发一个Win32应用程序,考虑采用MVC模式。根据该模式,处理用户交互的代码应该位于控制器中,以便可以相应地更新模型和/或视图。
但在Win32中,这是否意味着我的windowProc应该位于控制器中?这对我来说似乎有点奇怪,我会创建一个窗口和所有UI内容,然后在控制器中子类化wndProc。
另一方面,如果我不这样做,我最终需要在视图中使用控制器实例来处理模型。我很确定这不是正确的方式。
如果有人能指导我正确的方向,那就太好了!
谢谢。
处理用户交互的代码是视图。控制器“粘合”模型和视图(简单来说)。窗口过程肯定属于GUI,即视图部分。从这个GUI中,您将生成控制器将捕获、调用模型并对其做出响应的事件。
MFC的文档/视图模型是对MVC的不成熟尝试。如果你正在考虑使用MFC,那么可以使用派生自CView类的类来表示视图(duh!),并使用派生自CDocument类的类来表示模型。不幸的是,MFC并没有真正尝试将控制器功能与模型或视图分开。
在SDI Doc / View应用程序中,Windows GUI的事件驱动性质使得将一些控制器功能放入视图变得非常诱人 - MFC中的大量向导生成的代码都这样做。
在MDI应用程序中,每个模型有多个视图,让其中任意一个充当控制器显然是错误的,因此诱惑是将控制器逻辑放入文档类或框架窗口中...但是将一个新类添加为控制器并使用它来包装域逻辑并将该类连接到MFC有点困难,大多数人似乎不会麻烦去做。最简单的方法是将文档视为合并了模型和控制器。
这是针对MFC的(尽管它有许多缺点),但仍然是编写仅限于Windows GUI应用程序最高效的框架之一。如果您不喜欢MFC,或者需要一个可以支持多个平台的框架,您可能已经拥有更好的MVC支持 - 例如,请参见此文章中关于在Qt中支持MVC。
问题可能在于你的抽象层次。
假设你有相同的数据模型和修改控件,而你想要将整个界面从win32更改为HTML。那么整个界面部分就是视图。
现在你甚至可能有多个模型和控制器,比如用于域数据和当前应用程序视图的控制器。
这些控制器通常需要存在于视图的特定部分的生命周期之外。