3

我继承了一个大型 MFC 应用程序,其中包含一个CComboBox覆盖OnPaint. 目前,它的所有绘图都是手工完成的(使用线条和矩形),并呈现一个看起来明显是 Windows 98 风格的组合框。但是,它在其他方面工作得很好,并提供了许多我们所依赖的有用的自定义功能,并且重写整个控件可能不是一种选择。

我想对其进行现代化改造,以便OnPaint在可用的地方以 Aero 风格绘制(当现代主题不可用时回退到旧代码)。我已经使用我们拥有的其他一些自定义控件(例如按钮)完成了此操作,它非常适合我们的目的。我知道有一些微小的行为是不正确的,比如鼠标悬停时的柔和高光,但这对这个应用程序来说没什么大不了的。

我可以访问CVisualStylesXPckass,所以我已经有了基础设施来拨打电话OpenThemeDataGetThemeColor或者DrawThemeBackground很容易(通过LoadLibrary所以我们不强制 Vista 作为最小系统)。不幸的是,我不知道正确的调用顺序来获得带有主题适当边框和下拉按钮的漂亮组合框。

有人知道在这里做什么吗?

4

3 回答 3

0

老实说,我不知道他们为什么最初试图覆盖 OnPaint。有充分的理由吗?我认为至少 99% 的时间你只是想要覆盖 ComboBox 中项目的绘制。为此,您可以在派生的组合框中覆盖 DrawItem、MeasureItem 和 CompareItem 以获得所需的功能。在这种情况下,操作系统将正确绘制特定于每个操作系统的非用户内容。

于 2012-03-15T17:54:43.800 回答
0

我认为您最好在不深入 xp 主题和各种系统指标的情况下拍摄,看看这个项目: http: //www.codeproject.com/Articles/2584/AdvComboBox-Version-2-1

检查 CAdvComboBox 类的 OnPaint - 有控件重绘的完整实现,包括与 xp 主题相关的问题。

于 2012-03-24T09:50:31.063 回答
0

不确定是否是相同的情况 - 但是当我遇到这个问题时(在我的情况下使用子类 CButtons),解决它只需要将控件声明更改为指针并动态创建控件。

假设您的子类控件名为 CComboBoxExt。
你在哪里

CComboBoxExt m_cComboBoxExt;

你现在有

CComboBoxExt* m_pcComboBoxExt; 

在放置控件的窗口的 OnInitDialog 上,您可以使用

m_pcComboBoxExt = new CComboBoxExt();  
m_pcComboBoxExt->Create(...)

由于这现在是一个指针,所以不要忘记DestroyWindow()在终止时调用并删除指针。

这解决了我的特殊问题 - 如果您的控件以相同的方式声明,请考虑尝试一下。

于 2012-04-14T10:10:45.690 回答