-1

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

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

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

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

所以两个主要问题是:

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

更新问题 1:我发现DT_HIDEPREFIXDrawText()使用自定义绘图有CDIS_SHOWKEYBOARDCUES标志。但是,对于所有者抽奖,我不确定某处是否有标志?

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

蒂亚!!

4

3 回答 3

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 );
于 2021-11-11T07:11:36.223 回答
1

对 Q2 的回答:如果您在其上创建HIMAGELISTusingILC_COLOR32 | ILC_MASK,和 use ILD_NORMAL|ILD_BLEND25ImageList_Draw()则其外观与禁用按钮的 Windows 默认按钮相同。

于 2021-11-11T07:57:48.747 回答
-1

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

于 2021-11-12T16:31:43.707 回答