【问题标题】:WIN32: Duplicate Standard Button Control (disabled Icon / hotkey underline) in Owner Draw Button?WIN32:所有者绘制按钮中的重复标准按钮控件(禁用图标/热键下划线)?
【发布时间】:2021-11-13 00:31:43
【问题描述】:

因此,想要将图标放在按钮文本的右侧而不是左侧的简单壮举导致不得不使用所有者绘制按钮(但有人 here 说如果使用视觉主题,自定义绘制实际上是可用的) .好的,很好,但现在我发现当 Windows 标准按钮不处于所有者绘制模式时,您无法真正复制 Windows 标准按钮的功能。

对于正常启用的按钮,我可以通过检查视觉样式是否可用,然后使用 DrawThemeBackground() / DrawThemeText()DrawFrameControl() / DrawText() 来获得正确的外观。然而,即使没有按下 alt 键也会显示热键下划线字符,默认按钮在按下 alt 之前不会显示它。

对于禁用按钮,我无法复制按钮上图标的禁用外观。我在DrawIconEx() 上尝试了DrawState(),但这看起来像是旧的Windows 3.1 类型的灰色图形,而不是视觉风格变暗的图形。我看到有一个图像列表的DrawThemeIcon(),我想我可以尝试一下(我必须测试非视觉样式模式以查看DrawState() 在不使用视觉样式时是否匹配)。

另外,当您将鼠标悬停在按钮上时,状态不会改变,我知道如果使用所有者绘制,这不会发生,也许它仍然可以使用自定义绘制?

所以两个主要问题是:

1 - 按钮/所有者绘制是否有内置功能,仅在按下 alt 时才处理带下划线的热键?

更新到问题 1: 我在 DrawText() 中找到了 DT_HIDEPREFIX,并且使用自定义绘图有 CDIS_SHOWKEYBOARDCUES 标志。但是,对于 Owner Draw,我不确定某处是否有标志?

2 - 如何为禁用的按钮绘制图标以匹配默认按钮的功能?

TIA!!

【问题讨论】:

    标签: winapi comctl32


    【解决方案1】:

    对于快捷方式下划线,您可以使用WM_QUERYUISTATE 询问它是隐藏还是可见

    DWORD   draw_text_flags = ...;
    if ( SendMessage( control_hwnd, WM_QUERYUISTATE, 0, 0 ) & UISF_HIDEACCEL ) != 0 )
    {
        // hide prefix
        draw_text_flags |= DT_HIDEPREFIX;
    }
    
    // some combination of PBS_DEFAULTED, PBS_DISABLED, PBS_HOT, PBS_NORMAL, PBS_PRESSED; 
    int state = ...; 
    DrawThemeText( theme, hdc, BP_PUSHBUTTON, state, text, text_len, draw_text_flags, 0, rect );
    

    【讨论】:

      【解决方案2】:

      对问题 2 的回答:如果您使用 ILC_COLOR32 | ILC_MASK, 创建一个 HIMAGELIST 并在 ImageList_Draw() 上使用 ILD_NORMAL|ILD_BLEND25,它与禁用按钮的 Windows 默认按钮外观相同。

      【讨论】:

        【解决方案3】:

        根据@Remy-Lebeau 和@Daniel-Sęk 的回复以及对 CodeProject 上的各种项目的审查,我创建了一个易于使用的类来处理这个问题。可以在CodeProject 找到它。谢谢各位。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-22
          • 2016-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-22
          相关资源
          最近更新 更多