gpt4 book ai didi

c++ - win32,滚动窗口(): How to display back the up area from "off window" that disappeared after scrolling down?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:18 25 4
gpt4 key购买 nike

我的应用程序的主窗口开始有很多东西,所以我需要一个垂直滚动条来适应客户区内的所有东西。我编写了一个滚动条控件,正在处理像 SB_LINEDOWN 这样的 WM_VSCROLL 消息,并且滚动条移动得很好。最后一部分是让主窗口的内容随着滚动条的拇指移动,这对我来说似乎有点困难。这是我最好的尝试:

                int dy = -( CurrPos - si.nPos );
RECT rctMainWindowArea = { 0, 0, 1000, main_window.bottom };
ScrollWindowEx( hwndMainWindow, 0, dy,( CONST RECT * ) &rctMainWindowArea,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
UpdateWindow( hwndMainWindow );

只要我向下滚动,它就可以工作。当我再次向上滚动时,一切都变得一团糟。我在谷歌上搜索了一段时间这个问题,看来我必须重新绘制主窗口丢失的客户区。但是我不知道该怎么做。我在网上只找到了文本在编辑控件中滚动的例子。我需要滚动整个主窗口,它有几个不同的基本控件、一些 bmp 图形、一些其他图形元素,如 TextOut()、RoundRect() 等等。

我需要一些代码示例来解决我的问题,或者至少需要一些简单的解释(我是业余程序员)。非常感谢!

最佳答案

Windows 不会跟踪窗口滚动了多少,因此当它要求您重新绘制部分窗口时,您需要根据滚动的量来更改绘制的内容。

最简单的方法是调整窗口原点以匹配您完成的滚动量。您的 WM_PAINT 处理程序可能看起来像这样。 offsetXoffsetY 分别是您在 X 和 Y 方向上滚动的距离。

// Adjust coordinates to automatically scroll
POINT origin;
GetWindowOrgEx(hdc, &origin);
SetWindowOrgEx(hdc, origin.x + offsetX, origin.y + offsetY, 0);

// Move the paint rectangle into the new coordinate system
OffsetRect(&ps.rcPaint, offsetX, offsetY);

// Do the painting
// Change this to call your painting function
CWindow::DoPaint(hdc, ps);

// Restore coordinates
SetWindowOrgEx(hdc, origin.x, origin.y, 0);

关于c++ - win32,滚动窗口(): How to display back the up area from "off window" that disappeared after scrolling down?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9405529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com