使用滚动条时如何获得正确的窗口工作区大小?

时间:2019-04-28 06:48:40

标签: c++ mfc

我创建了一个对话框窗口,并尝试布置一些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);

enter image description here

如果我的客户区大于当前可见的客户区,即需要滚动条滚动剩余的“隐藏”区,则会出现问题。使用GetClientRect返回的尺寸不正确,导致标签的位置不在“整个”客户区的底部,而仅在“可见”的位置:

enter image description here enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

要获得可滚动的宽度,请将SB_VERT替换为SB_HORZ

答案 1 :(得分:-3)

为什么要尝试创建滚动条的窗口类并为此尝试每个位置? Window.h的创建者为此提供了一些样式。

只需使用窗口样式即可:

WS_VSCROLL

WS_HSCROLL