我使用自定义绘图来更改主题复选框的文本和背景颜色。
为了正确定位文本,我需要复选框的尺寸。下图说明了我的意思:
浏览StackOverflow存档我发现this post但它让我感到困惑。我只是不知道哪个答案是我问题的解决方案。互联网也没有帮助。
答案 0 :(得分:4)
function GetCheckBoxSize(AWnd: HWND): TSize;
var
Theme: HTHEME;
Bitmap: HBITMAP;
BitmapSize: Winapi.Windows.TBitmap;
State: DWORD;
StateID: DWORD;
begin
Result.cx := 0;
Result.cy := 0;
if IsWindowsXPOrLater and IsThemeActive and IsAppThemed then
begin
Theme := GetWindowTheme(AWnd);
if Theme <> 0 then
begin
State := SendMessage(AWnd, BM_GETSTATE, 0, 0);
if State and BST_CHECKED <> 0 then StateID := CBS_CHECKEDNORMAL
else StateID := CBS_UNCHECKEDNORMAL;
if GetThemePartSize(Theme, 0, BP_CHECKBOX, StateID, nil, TS_TRUE, Result) = S_OK then
Exit;
end;
end;
Bitmap := LoadBitmap(0, PChar(OBM_CHECKBOXES));
if Bitmap <> 0 then
try
if GetObject(Bitmap, SizeOf(BitmapSize), @BitmapSize) = SizeOf(BitmapSize) then
begin
Result.cx := BitmapSize.bmWidth div 4;
Result.cy := BitmapSize.bmHeight div 3;
end;
finally
DeleteObject(Bitmap);
end;
end;
答案 1 :(得分:3)
您需要的功能,据我所知是GetThemePartSize
。您需要为该部分提供BP_CHECKBOX
,并且states中的任何一个都是合适的。