c - 如何从选项卡控件获取宽度和高度?

标签 c winapi window height width

我有一个选项卡控件,我想获取其宽度和高度以创建一个填充该区域的窗口。 但我不太明白如何获得这个宽度和高度。根据我的发现,该值来自 TabCtrl_GetItemRect()在对话框单元中,所以我需要转换为像素,例如我会这样做 int width = tr.right - tr.left但如果我将该值传递给 CreateWindowExW() ,则该值是错误的它创建了一个微小的控件,甚至不是目标宽度和高度的 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;

我错过了什么?

最佳答案

您将使用 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;

关于c - 如何从选项卡控件获取宽度和高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65453778/

相关文章:

C 从字符串中删除字符

c - 指针算术,指针指向 double

c - 调整权限 SE_DEBUG_NAME

c++ - 控制 Internet Explorer 以输入用户名/密码

Selenium 网络驱动程序 : Open new tab instead of a new window

c - 错误: expected specifier-qualifier-list before

c - 是否通过强制转换为已签名的未定义行为来检测未签名的环绕?

c++如何在非管理员帐户下获取%AppData%路径并以管理员身份运行VS2013

python - pywinauto:占用多个应用程序窗口

JavaScript window.open 适用于所有浏览器的正确大小