如何使控件看起来像启用了 Visual Styles 的 ComboBox?

Posted

技术标签:

【中文标题】如何使控件看起来像启用了 Visual Styles 的 ComboBox?【英文标题】:How to render a control to look like ComboBox with Visual Styles enabled? 【发布时间】:2010-09-05 09:31:05 【问题描述】:

我有一个以 ComboBox 为模型的控件。我想渲染控件,使控件border看起来像标准的Windows ComboBox。具体来说,我遵循了 MSDN 文档,除了禁用控件时的渲染外,所有控件的呈现都是正确的。

明确一点,这是针对启用了视觉样式的系统。此外,除了禁用控件周围的边框与禁用的 ComboBox 边框颜色不匹配之外,控件的所有部分都正确呈现。

我正在使用 VisualStyleRenderer 类。 MSDN 建议对 ComboBox 控件的 TextBox 部分使用 VisualStyleElement.TextBox 元素,但标准禁用 TextBox 和标准禁用 ComboBox 绘制略有不同(一个有浅灰色边框,另一个有浅蓝色边框)。

如何在禁用状态下正确呈现控件?

【问题讨论】:

【参考方案1】:

我不能 100% 确定这是否是您要查找的内容,但您应该查看 System.Windows.Forms.VisualStyles 命名空间中的 VisualStyleRenderer

    VisualStyleRenderer class (MSDN) How to: Render a Visual Style Element (MSDN) VisualStyleElement.ComboBox.DropDownButton.Disabled (MSDN)

由于如果用户没有启用视觉样式(他/她可能正在运行“经典模式”或 Windows XP 之前的操作系统),VisualStyleRenderer 将无法工作,因此您应该始终回退到 ControlPaint 类。

// Create the renderer.
if (VisualStyleInformation.IsSupportedByOS 
    && VisualStyleInformation.IsEnabledByUser) 

    renderer = new VisualStyleRenderer(
        VisualStyleElement.ComboBox.DropDownButton.Disabled);

然后在画图的时候这样做:

if(renderer != null)

    // Use visual style renderer.

else

    // Use ControlPaint renderer.

希望对你有帮助!

【讨论】:

【参考方案2】:

任何ControlPaint 方法对此有用吗?这就是我通常用于自定义呈现控件的内容。

【讨论】:

以上是关于如何使控件看起来像启用了 Visual Styles 的 ComboBox?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010事件按钮已消失

使 uipagecontrol 动画看起来像 uinavigationcontrol 动画

Visual C++编程技巧之五

用户控件总是使 Visual Studio 崩溃

如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)

如何使 QML 控件看起来更好?