Форум: "WinAPI";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизScroll-лирование клиентской области окна Найти похожие ветки
← →
idr (2004-01-19 14:44) [0]Всем хорошего расположения духа!
Вопрос следующий: Необходимо сделать попиксельный скролл клиентской области, за основу взят (добавил бы - практически скопирован :)) соответствующий пример из MSDN - Using Scroll Bars => Scrolling a Bitmap, где отсутствует отрисовка битмапа, просто происходит соответствующий сдвиг с помощью ScrollWindow.
В процедуре-обработчике окна(точнее диалога) в WM_INITDIALOG его размер уменьшается (с помощью SetWindowPos) до половин экрана по обоим измерениям (GetSystemMetrics(SM_CX(CY)SCREEN)/2).Все бы хорошо, но когда изначальные (до уменьшения) размеры диалога превосходят размеры desktop-а, скроллбары отказываются работать верно :(
Помогите кто сможет! Перерыл весь соотв. раздел MSDN - не помогло...
← →
Игорь Шевченко © (2004-01-20 10:27) [1]idr (19.01.04 14:44)
А в чем проявляется "неправильность" работы ? Я, кстати, портировал этот пример на Delphi, особой странности не замечал. Может, плохо смотрел.
← →
idr (2004-01-20 14:02) [2]Неправильность заключается в следующем:
(во-первых пример теоретически (правда я не проверял :)) вообще работать в случае большого bitmap-a не должен так как в той же MSDN написано:
в примере:xMaxScroll = max(bmp.bmWidth-xNewSize, 0);
...
si.nPage = xNewSize;
...
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
в документации по SetScrollInfo:
"The SetScrollInfo function performs range checking on the values specified by the nPage and nPos members of the SCROLLINFO structure.
The nPage member must specify a value from 0 to nMax - nMin +1. The nPos member must specify a value between nMin and nMax - max( nPage– 1, 0). If either value is beyond its range, the function sets it to a value that is just within the range."
то есть si.nPage=si.nMax+1 при размере (xNewSize>bmp.bmWidth/2),
а в этом случае вообще говоря скроллбар должен вообще пропасть с экрана (что у меня и было)
Извиняюсь за некоторую нудность....но привожу это все лишь для описания своей проблемы...:)
Ближе к делу:
я устанавливаю si.nMax в ширину клиентской области(~bmp.bmWidth) и вручную проверяю xCurrentScroll на вхождение в отрезок:
(si.nMin ... si.nMax-si.nPage) в обработчике WM_HSCROLL
тогда я ожидаю следующего:
xCurrentScroll пробежит значения от si.nMin (он всегда 0) до соответствующего значения si.nMax-si.nPage, при этом когда бегунок достигнет правой границы то на экране должна быть "самая правая часть" клиентской области.
Так вот если "изначальный" размер клиентской области больше размера экрана, то это не так :( в противополжном случает все работает...
← →
Игорь Шевченко © (2004-01-20 15:59) [3]
> Так вот если "изначальный" размер клиентской области больше
> размера экрана
Охотно верю, пример на это не рассчитан, скорее всего. Увы.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c