Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: 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 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
1-1078429446
КомофОнСамый
2004-03-04 22:44
2004.03.28
Как из TMemoryStream загрузить в TImage


1-1078351482
HydraMarat
2004-03-04 01:04
2004.03.28
Доступ к процедуре регистрации


14-1077866031
Daemys
2004-02-27 10:13
2004.03.28
Интернет-зависимость


14-1077462436
vajo
2004-02-22 18:07
2004.03.28
AVI файлы


9-1062410426
Cyber Chaynik
2003-09-01 14:00
2004.03.28
3D на основе фото