【发布时间】: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