【发布时间】:2012-10-30 03:28:03
【问题描述】:
在 MFC 中,提供的某些机制允许程序员绕过模块化、封装和信息隐藏,这可以说是面向对象框架最理想的特性。
其中一个(众多)示例是 Owner Drawn 控件:
您可以选择在子控件子类中实现DrawItem,并在该子类中完成该控件的所有绘制,使其看起来更加模块化:
class CustomButton: CButton{
// --- Lots of stuff, DECLARE_DYNAMIC etc
virtual void DrawItem(LPDRAWITEMSTRUCT lpdis){
// Drawing code for this button in the button's subclass
}
};
...或者您可以选择通过 OnDrawItem 在父 Window 类中处理 WM_DRAWITEM 消息
class MainFrame: CFrameWnd{
// --- Lots of stuff, DECLARE_DYNAMIC etc
CustomButton button;
afx_msg void OnDrawItem(LPDRAWITEMSTRUCT lpdis, UINT id){
if(id == CUSTOM_BUTTON_ID){
// Drawing code for this button in the button's subclass
}
}
};
后面的情况,控件的绘制在控件子类之外,也就是说"OOP data structures tend to carry their own operators around with them"的概念被破坏了..对吧?
所以我的问题是:哪一个被认为是“最佳实践”?第二个存在一定是有原因的 - 任何人都可以提出破坏模块化是更好选择的情况吗?
【问题讨论】:
-
这个问题并不是针对stackoverflow的,因为它实际上只是在征求意见。您可以选择如何使用 MFC。而倾向于这个词并不意味着总是。
-
抱歉,我没有意识到我不被允许提出引发辩论的问题..
-
所有意见都是有效的,大部分都是不同程度的错误,因为它们都是简化的。这包括我刚刚写的这个观点。
-
我将此解释为关于模块化而不是 MFC 使用的问题。当然,我的解释可能是错误的......
-
这个问题涉及 Windows 消息传递体系结构以及 Windows 消息如何在各个父窗口和子窗口之间传播。 MFC 是底层平台上的皮肤,结果是有很多方法可以在皮肤非常薄且骨骼显露的情况下缩短 MFC。提问者已经知道 MFC 将 DrawItem 功能封装到正在绘图的窗口中的正确主流使用。另一方面,有时在父级中进行绘图是一种有效的方法,尽管我现在想不出。
标签: c++ oop winapi modularity