win32, scrollwindowex (): Как отобразить обратно область вверх из «выключенного окна», которая исчезла после прокрутки вниз? - PullRequest
4 голосов
/ 23 февраля 2012

В главном окне моего приложения много вещей, поэтому мне нужна вертикальная полоса прокрутки, чтобы вместить все в клиентской области. Я кодировал элемент управления полосы прокрутки, сообщения WM_VSCROLL, такие как SB_LINEDOWN, обрабатываются, и полоса прокрутки перемещается хорошо. Последняя часть состоит в том, чтобы заставить содержимое главного окна перемещаться вместе с большим пальцем полосы прокрутки, и это кажется мне сложной задачей. Это моя лучшая попытка:

                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 () и т. Д.

Мне нужны примеры кода, как решить мою проблему или хотя бы простое объяснение (я программист-любитель). Большое спасибо!

1 Ответ

4 голосов
/ 23 февраля 2012

Windows не отслеживает объем прокрутки окна, поэтому, когда просит вас перекрасить часть окна, вам нужно изменить то, что вы рисуете, исходя из того, сколько прокрутки вы сделали.

Самый простой способ сделать это - настроить источник окна в соответствии с количеством прокрутки, которую вы сделали. Ваш обработчик WM_PAINT может выглядеть примерно так. offsetX и offsetY - это расстояния, которые вы прокручивали в направлениях 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...