因此,想要将图标放在按钮文本的右侧而不是左侧这一简单壮举导致必须使用所有者绘制按钮(但这里有人说,如果使用视觉主题,自定义绘制实际上是可用的(。好吧,好吧,但现在我发现,当Windows标准按钮不处于所有者绘制模式时,你无法真正复制它的功能。
对于正常启用的按钮,我可以通过检查视觉样式是否可用,然后使用DrawThemeBackground()
/DrawThemeText()
或DrawFrameControl()
/DrawText()
来获得正确的外观。然而,即使没有按下alt键,热键下划线字符也会显示,默认按钮直到按下alt键才会显示。
对于禁用的按钮,我无法复制按钮上图标的禁用外观。我尝试了DrawState()
而不是DrawIconEx()
,但这看起来像旧的Windows 3.1类型的灰色图形,而不是视觉风格的灰色图形。我看到图像列表有一个DrawThemeIcon()
,我想我可以试试(我必须测试非视觉样式模式,看看DrawState()
在不使用视觉样式时是否匹配(。
此外,当你将鼠标悬停在按钮上时,状态不会改变,我知道如果使用所有者绘制,这种情况不会发生,也许它仍然可以使用自定义绘制?
因此,两个主要问题是:
1-按钮/所有者绘图是否有内置功能,仅在按下alt时才能处理带下划线的热键?
更新到问题1:
我在DrawText()
中找到了DT_HIDEPREFIX
,使用自定义绘制有CDIS_SHOWKEYBOARDCUES
标志。然而,对于所有者抽奖,我不确定某个地方是否有国旗?
2-如何为禁用的按钮绘制图标,以匹配默认按钮的功能?
TIA!!
对于快捷下划线,您可以使用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 );
Q2的答案:如果使用ILC_COLOR32 | ILC_MASK,
创建HIMAGELIST
,并在ImageList_Draw()
上使用ILD_NORMAL|ILD_BLEND25
,则会为禁用按钮提供与窗口默认按钮相同的外观。
根据@Remy Lebeau和@Daniel-SÉk的回复,并回顾了CodeProject上的各种项目,我创建了一个易于使用的类来处理这一问题。它可以在CodeProject中找到。谢谢,伙计们。