【问题标题】:How do I get the width and height from a tab control?如何从选项卡控件中获取宽度和高度?
【发布时间】:2021-04-03 19:37:56
【问题描述】:

我有一个选项卡控件,我想在其中获取它的宽度和高度,以创建一个填充该区域的窗口。 但我不太明白如何获得这个宽度和高度。根据我的发现,从TabCtrl_GetItemRect() 获得的值在对话框单元中,所以我需要转换为像素,例如int width = tr.right - tr.left,但如果我将该值传递给@987654325,那么该值是错误的@ 它创建了一个微小的控件,甚至不是目标宽度和高度的 1/4。我用来从对话单元转换为像素的例程是:

void DlgUnitsToPxs(RECT *rect)
{
  long units = GetDialogBaseUnits();
  int xBaseUnit = LOWORD(units);
  int yBaseUnit = HIWORD(units);

  rect->left   = MulDiv(rect->left,   xBaseUnit, 4);
  rect->right  = MulDiv(rect->right,  xBaseUnit, 4);
  rect->top    = MulDiv(rect->top,    yBaseUnit, 8);
  rect->bottom = MulDiv(rect->bottom, yBaseUnit, 8);
}

像这样获取值:

RECT tr = {0};
TabCtrl_GetItemRect(hTabControl, 0, &tr);
DlgUnitsToPxs(&tr);
int width = tr.right - tr.left;
int height = tr.bottom - tr.top;

我错过了什么?

【问题讨论】:

  • 改用MapDialogRect,你就不用担心对话框字体了。
  • 这不适用于hTabControl,因为它是一个窗口,MapDialogRect 需要使用其中一个对话框函数创建句柄。
  • 问题表明标签被用作对话框的子控件,在这种情况下MapDialogRect会起作用,实际上比手动计算GetDialogBaseUnits要好。
  • 我不再使用标签作为子标签,而是将它们作为兄弟姐妹,因为有人告诉我这不是这样做的,而且 TAB 键无法与这些控件一起使用。请参阅此处devblogs.microsoft.com/oldnewthing/20191015-00/?p=102996 我之前测试过MapDialogRect(),但它将GetLastError() 设置为无效句柄。我正在尝试 SoronelHaetir 的方法。它没有按应有的方式填满窗口,我试图在给他反馈之前找出原因
  • 选项卡控件本身仍然是对话框的子级,它是 MapDialogRect 期望的父对话框的句柄。在重新设置(大)子控件之后是否仍然需要它是另一个问题。

标签: c winapi window height width


【解决方案1】:

您将使用 GetClientRect 函数和 TCM_ADJUSTRECT 消息(wParam 设置为 TRUE,lParam 是指向要调整的 RECT 的指针)。我通常创建将显示为子选项卡的窗口,并将选项卡作为实际的父窗口,这样我就不需要在该 RECT 上使用 MapWindowPoints。

例如(虽然我通常会实际使用 C++ 风格的初始化):

...
case WM_SIZE:
 {
  RECT rc;
  TCITEM item;
  HWND hWndChild;
  HWND hWndTab = GetDlgItem(hWnd, ID_TAB);
  _ASSERT(hWndTab);

  item.mask = TCIF_PARAM;
  SendMessage(hWndTab, TCM_GETITEM, SendMessage(hWndTab, TCM_GETCURFOCUS, 0, 0), &item);

  _ASSERT(item.lParam);
  hWndChild = (HWND)item.lParam;

  GetClientRect(hWndTab, &rc);
  SendMessage(hWndTab, TCM_ADJUSTRECT, TRUE, (LPARAM)&rc);

  SetWindowPos(hWndChild, nullptr, rc.left, rc.top, rc.right, rc.bottom, SWP_NOACTIVATE|SWP_NOMOVE);
 }
 return 0;

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2019-12-26
    • 2016-04-17
    • 1970-01-01
    • 2023-02-09
    • 2023-04-09
    • 1970-01-01
    • 2022-01-16
    • 2018-04-03
    相关资源
    最近更新 更多