Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
14-1077905625
Style
2004-02-27 21:13
2004.03.28
Людии помогите! Есть форма на ней две панельки?


1-1074855282
Unhandled Exception
2004-01-23 13:54
2004.03.28
Интеграция Дельфи и Флеш


14-1077777849
sea
2004-02-26 09:44
2004.03.28
Нужно откомпилять прогу под Unix


3-1077394738
Yermek
2004-02-21 23:18
2004.03.28
Чтение из BLOB поля Paradox a


3-1077182609
RavenD
2004-02-19 12:23
2004.03.28
утилиты?




   Наверх