1

我在报告模式下有一个列表控件。

我用数据填充这个列表控件,然后我自动调整所有列的大小LVM_SETCOLUMNWIDTH。根据数据,列表控件可能会以水平滚动条结束,也可能不会。

到目前为止,一切都很好。但现在我想获得列表控件应该具有的最小宽度,因此不需要水平滚动条。知道该大小后,我可以调整列表控件的大小以摆脱水平滚动条。

有任何想法吗 ?

4

2 回答 2

2

由于您已经知道所需的宽度,您可以使用该信息并让系统为您计算相应的窗口宽度。可以使用以下任一 API:AdjustWindowRectAdjustWindowRectEx。高度可以忽略。

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;
于 2015-06-04T09:58:18.673 回答
-1

一个懒惰的解决方案是增加宽度直到滚动条消失。

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);
}
于 2015-06-04T08:20:20.480 回答