combobox - MFC:如何为所有者绘制呈现 Aero 风格的组合框?

标签 combobox mfc aero onpaint ownerdrawn

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

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

我可以访问 CVisualStylesXP ckass,所以我已经有了调用 OpenThemeDataGetThemeColorDrawThemeBackground 非常容易(通过 LoadLibrary 所以我们不强制 Vista 作为最小系统)。不幸的是,我不知道正确的调用顺序才能获得具有适合主题的边框和下拉按钮的漂亮组合框。

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

最佳答案

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

关于combobox - MFC:如何为所有者绘制呈现 Aero 风格的组合框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9713938/

相关文章:

c++ - FFmpeg 在我的应用程序中禁用 Window 桌面管理器

windows - 请帮助 - 来自 Aero Shake/3D 翻转的 WM_SYSCOMMAND 消息

c++ - 创建 MFC 控件的子类的正确方法是什么?

c++ - 将输入 CREdit 控件的文本限制为 ISO 8859-1 字符

c++ - 如何在VC++/MFC中替换字符串中两个子字符串之间的字符串?

c# - 我有两个组合框和xml文件,我想从xml中填充组合框1中的服务器名称,并根据服务器名称填充第二个组合框

c# - 尽管有 WS_EX_COMPOSITED 标志和 DoubleBuffered 属性,但在调整大小后闪烁

delphi - TComboBox - 如何在下拉列表下拉时调整其高度?

c# - 在 comboBox 中列出时将 DateTime String 转换为 Date-only

c# - 将 List<Object> 绑定(bind)到 c# wpf 中的组合框