Главная страница
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.022 c
3-1077902904
SergeyM
2004-02-27 20:28
2004.03.28
Кнопка в DBGrid е


8-1069269825
IgorB
2003-11-19 22:23
2004.03.28
Coordinats


1-1078927091
slair
2004-03-10 16:58
2004.03.28
Не ставится delpi6/builder6 под WindowsXP Pro Corp


8-1068627723
claus
2003-11-12 12:02
2004.03.28
рисование линий на Canvas-e любой формы, задаваемые шаблоном


7-1073342616
Barlokf
2004-01-06 01:43
2004.03.28
Проверка реестра