获取复选框的大小

时间:2014-03-27 13:35:56

标签: c++ winapi checkbox

我使用自定义绘图来更改主题复选框的文本和背景颜色。

为了正确定位文本,我需要复选框的尺寸。下图说明了我的意思:

enter image description here

浏览StackOverflow存档我发现this post但它让我感到困惑。我只是不知道哪个答案是我问题的解决方案。互联网也没有帮助。

2 个答案:

答案 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中的任何一个都是合适的。