因此,想要將圖示放在按鈕文本的右側而不是左側的簡單壯舉導致不得不使用所有者繪制按鈕(但這里有人說如果使用視覺主題,自定義繪制實際上是可用的)。好的,很好,但現在我發現當 Windows 標準按鈕不在所有者繪制模式時,您無法真正復制它的功能。
對于正常啟用的按鈕,我可以通過檢查視覺樣式是否可用然后使用DrawThemeBackground()/DrawThemeText()或DrawFrameControl()/來獲得正確的外觀DrawText()。然而,即使沒有按下 alt 鍵,也會顯示熱鍵下劃線字符,默認按鈕在按下 alt 之前不會顯示它。
對于禁用按鈕,我無法復制放置在按鈕上的圖示的禁用外觀。我試過DrawState()了,DrawIconEx()但看起來像舊的 Windows 3.1 型別的灰色圖形,而不是視覺風格變暗的圖形。我看到有DrawThemeIcon()一個影像串列,我想我可以嘗試一下(我必須測驗非視覺樣式模式以查看DrawState()在不使用視覺樣式時是否匹配)。
此外,當您將滑鼠懸停在按鈕上時,狀態不會改變,我知道如果使用所有者繪制,則不會發生這種情況,也許它仍然適用于自定義繪制?
所以兩個主要問題是:
1 - 只有在按下 alt 時,按鈕/所有者繪制是否有內置的東西來處理帶下劃線的熱鍵?
更新問題1:我發現DT_HIDEPREFIX在DrawText()使用自定義繪制存在的CDIS_SHOWKEYBOARDCUES標志。但是,使用 Owner Draw 我不確定某個地方是否有標志?
2 - 如何為禁用的按鈕繪制圖示以匹配默認按鈕的功能?
蒂亞!!
uj5u.com熱心網友回復:
對于快捷下劃線,您可以使用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 );
uj5u.com熱心網友回復:
對 Q2 的回答:如果您創建一個HIMAGELISTusingILC_COLOR32 | ILC_MASK,并ILD_NORMAL|ILD_BLEND25在ImageList_Draw()其上使用,它的外觀與禁用按鈕的 Windows 默認按鈕相同。
uj5u.com熱心網友回復:
根據@Remy-Lebeau 和@Daniel-S?k 的回復以及對 CodeProject 上的各種專案的審查,我創建了一個易于使用的類來處理這個問題。它可以在CodeProject找到。謝謝你們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359973.html
