我有一个选项卡控件,我想获取其宽度和高度以创建一个填充该区域的窗口。
但我不太明白如何获得这个宽度和高度。根据我的发现,该值来自 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/