我在报告模式下有一个列表控件。
我用数据填充这个列表控件,然后我自动调整所有列的大小LVM_SETCOLUMNWIDTH
。根据数据,列表控件可能会以水平滚动条结束,也可能不会。
到目前为止,一切都很好。但现在我想获得列表控件应该具有的最小宽度,因此不需要水平滚动条。知道该大小后,我可以调整列表控件的大小以摆脱水平滚动条。
有任何想法吗 ?
我在报告模式下有一个列表控件。
我用数据填充这个列表控件,然后我自动调整所有列的大小LVM_SETCOLUMNWIDTH
。根据数据,列表控件可能会以水平滚动条结束,也可能不会。
到目前为止,一切都很好。但现在我想获得列表控件应该具有的最小宽度,因此不需要水平滚动条。知道该大小后,我可以调整列表控件的大小以摆脱水平滚动条。
有任何想法吗 ?
由于您已经知道所需的宽度,您可以使用该信息并让系统为您计算相应的窗口宽度。可以使用以下任一 API:AdjustWindowRect或AdjustWindowRectEx。高度可以忽略。
int requiredWidth = 0;
for ( int index = 0; index < itemCount; ++index ) {
// calculate item width
requiredWidth += itemWidth;
}
RECT r = { 0, 0, requiredWidth, 1 };
DWORD style = (DWORD)::GetWindowLongPtr( hList, GWL_STYLE );
DWORD styleEx = (DWORD)::GetWindowLongPtr( hList, GWL_EXSTYLE );
::AdjustWindowRectEx( &r, style, FALSE, styleEx );
int windowWidth = r.right - r.left;
一个懒惰的解决方案是增加宽度直到滚动条消失。
RECT r;
::GetWindowRect(hlist, &r);
RECT rc;
::GetClientRect(hparent, &rc);
POINT p { rc.right, 0 };
::ClientToScreen(hparent, &p);
int limit = p.x - r.right;
for (int i = 0; i < limit; i++)
{
if (!(::GetWindowLong(hlist, GWL_STYLE) & WS_HSCROLL))
break;
r.right++;
::SetWindowPos(hlist, 0, 0, 0, r.right - r.left, r.bottom - r.top,
SWP_NOREDRAW | SWP_NOMOVE | SWP_NOZORDER);
}