我继承了一个大型MFC应用程序,它包含一个覆盖CComboBox
的{{1}}子类。目前它手工完成所有绘图(使用直线和矩形),并呈现一个看起来非常Windows 98风格的组合框。但是,它运行良好并提供了许多我们依赖的有用的自定义功能,并且可能无法重写整个控件。
我想对其进行现代化改造,以便OnPaint
在可用的Aero风格中绘制(当现代主题不可用时,回退到旧代码)。我已经使用了其他一些自定义控件,比如按钮,这对我们的目的非常有用。我知道有一些微小的行为,它们无法正常运行,就像鼠标悬停时的温柔亮点一样,但对于这个应用来说这不是什么大不了的事。
我可以访问OnPaint
ckass,因此我已经有了基础设施来轻松拨打CVisualStylesXP
,OpenThemeData
或GetThemeColor
等电话(通过{{ 1}}所以我们不强迫Vista作为min-system)。不幸的是,我不知道正确的调用顺序,以获得一个漂亮的组合框与主题适当的边框和下拉按钮。
任何人都知道该怎么做?
答案 0 :(得分:0)
老实说,我不知道为什么他们最初试图覆盖OnPaint。有充分的理由吗?我想至少有99%的时间你想要覆盖ComboBox中项目的绘图。为此,您可以在派生的组合框中覆盖DrawItem,MeasureItem和CompareItem以获得所需的功能。在这种情况下,操作系统将正确绘制特定于每个操作系统的非用户内容。
答案 1 :(得分:0)
我认为你最好的拍摄没有潜入xp主题的深度和各种系统指标来看看这个项目:http://www.codeproject.com/Articles/2584/AdvComboBox-Version-2-1
检查CAdvComboBox类的OnPaint - 控件重绘的完整实现包括与xp主题相关的问题。
答案 2 :(得分:0)
不确定是否是相同的情况 - 但是当我遇到这个问题时(在我的情况下使用子类CButtons),解决它只需要将控制声明更改为指针并动态创建控件。
假设您的子类控件名为CComboBoxExt 你在哪里
CComboBoxExt m_cComboBoxExt;
你现在有了
CComboBoxExt* m_pcComboBoxExt;
在放置控件的窗口的OnInitDialog上,使用
创建它m_pcComboBoxExt = new CComboBoxExt();
m_pcComboBoxExt->Create(...)
由于这是一个指针,不要忘记调用DestroyWindow()
并在终止时删除指针。
这解决了我的特殊问题 - 如果您的控件以相同的方式声明,请考虑尝试一下。