首页 > 解决方案 > 使用滚动条时如何获得正确的窗口客户区大小?

问题描述

我创建了一个对话框窗口并尝试布置一些EditBoxArray, ComboBoxArray控件和CStatic标签。我使用以下方式设置窗口位置:

SetWindowPos(&wndTop, 10, 10, width, height, SWP_SHOWWINDOW);

我能够使用GetClientRect(&rect)不包括任何边框或标题栏的窗口来检索正确的客户端大小。这允许我在窗口底部设置标签,如下所示:

GetClientRect(&rect);
y_position = rect.bottom - MY_LABEL_HEIGHT;
....
my_label.SetWindowPos(NULL, x, y_position , width, MY_LABEL_HEIGHT, SWP_SHOWWINDOW);

在此处输入图像描述

如果我的客户区大于当前可见区,就会出现问题,即需要滚动条来滚动剩余的“隐藏”区域。UsingGetClientRect返回一个不正确的大小,导致标签不是位于“整个”客户区域的底部,而只是位于“可见”的区域:

在此处输入图像描述 在此处输入图像描述

使用GetWindowRect不起作用,因为它也只检索“可见”区域+边框和标题标题栏。

本质上,我要问的是如何获得整个可见+不可见的客户区域,没有边框和标题?

标签: c++mfc

解决方案


本质上,我要问的是如何获得整个可见+不可见的客户区域,没有边框和标题?

调用CWnd::GetScrollRange()以获取最小和最大滚动位置。它们的区别在于您要求的值:

int minPos = 0, maxPos = 0;
GetScrollRange( SB_VERT, &minPos, &maxPos );
int scrollableClientHeight = abs( maxPos - minPos );

要获得可滚动宽度,请替换SB_VERTSB_HORZ.


推荐阅读