Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

Состояние скроллирования. Помогите пожалуйста.   Найти похожие ветки 

 
DevilDevil ©   (2007-03-13 19:32) [0]

Полосы прокрутки создаю c помощью Set/GetScrollInfo(). Мне необходимо знать, скроллирует ли в данный момент пользователь это окно или нет.

Отталкиваться можно от факта изменения положения бегунка. Т.е. если пришло событие о изменении положении бегунка, то окно находится "в режиме скроллирования".

Вопрос: как отследить момент отпускания бегунка?

заранее Спасибо!


 
capkoh ©   (2007-03-13 22:04) [1]

Если интересен именно момент отпускания бегунка, то, по идее, это уведомление как раз для этого и нужно:

SB_THUMBPOSITION
The user has dragged the scroll box (thumb) and released the mouse button. The high-order word indicates the position of the scroll box at the end of the drag operation.

Т.е. это уведомление приходит, когда пользователь отпускает бегунок.


 
DevilDevil ©   (2007-03-14 15:29) [2]

> capkoh ©   (13.03.07 22:04) [1]

Большое спасибо, то, что нужно!

SB_THUMBTRACK - пользователь начал скроллирование.
SB_THUMBPOSITION - пользователь отпустил бегунок.


 
DevilDevil ©   (2007-03-22 17:26) [3]

Ещё вопрос про скроллингу.

Если окно (в частности мой TCustomControl компонент) имеет обе полосы покрутки, то справа снизу появляется "неперерисуемый прямоугольник". Поэтому на этом прямоугольнике периодически остаётся ореол от перемещаемых окон.

Вопрос: сталкивался ли кто либо с такой проблемой и, соответсвенно, как решал?


 
capkoh ©   (2007-03-22 22:12) [4]

Да, встречался я. :)

Решал так: получал WindowDC окна с такой прокруткой и рисовал вручную этот злосчастный прямоугольник, когда рисуется рамка (NC area) окна. Конкретная реализация получилась такая (ниже приведена часть кода из WindowProc() окна с такими ScrollBars):

WM_NCPAINT :
 begin
   // Draws default window frame...
   Result := DefWindowProc(hWnd, Msg, wParam, lParam);
   // ... and then my rect will be drawn, if it"s visible
   if RectVisible(PreviewWnd_WDC, PreviewWnd_ScrollRect) then
     FillRect(PreviewWnd_WDC, PreviewWnd_ScrollRect, HBRUSH(COLOR_BTNFACE + 1));
 end;

Нужно отметить, что рисуется рамка на DC, получаемом функцией GetWindowDC(), а не GetDC(), т.е., в данном случае, имеем:

PreviewWnd_WDC := GetWindowDC(hWnd);

PreviewWnd_ScrollRect -- нужный прямоугольник между ScrollBars. Его высоту и ширину несложно получить, воспользовавшись функцией GetSystemMetrics() с соответствующими параметрами. То, что я ещё проверяю, виден прямоугольник или нет, считаю не нужным. В принципе, ситуаций, когда этот прямоугольник будет не видим, обычно бывает крайне мало, поэтому проверку на невидимость можно убрать.

P.S. Мало встречал людей, исключая меня, кто не считает это ерундой и мелочью. :)


 
capkoh ©   (2007-03-22 22:23) [5]

И, конечно, не забываем освобождать полученный PreviewWnd_WDC, используя ReleaseDC()!


 
DevilDevil ©   (2007-03-23 14:23) [6]

Спасибо большое, буду пользовать. Только...

Я пробовал сделать то же самое в процедуре Paint() моего компонента. Почему то результата не было.

- Как ты думаешь, почему?
- Чем WM_NCPAINT отличается от WM_PAINT ?


 
capkoh ©   (2007-03-23 15:28) [7]

Как тут уже миллион раз говорили, нужно видеть код, чтобы сказать что-то определенное. Оба сообщения подробно описаны в SDK и MSDN. Если кратко, то так:

WM_NCPAINT приходит, когда требуется перерисовать NC (NonClient) область окна, к которой относится и рамка окна.

WM_PAINT приходит, когда нужно перерисовать клиентскую область окна.


 
DevilDevil ©   (2007-03-26 15:34) [8]

> capkoh ©   (23.03.07 15:28) [7]

Попробовал, спасибо большое. Как я заметил, через Canvas.Handle Почему то не получается.

СПАСИБО!!!


 
DevilDevil ©   (2007-03-26 15:57) [9]

:))))

Следующий вопрос. Если nMax очень большой, то сам бегунок становиться ОЧЕНЬ тонкий. Вопрос: нет ли какого либо способа задать минимальную высоту такого бегунка?


 
capkoh ©   (2007-03-27 10:48) [10]

По идее, можно, но это довольно неудобно и, на мой взгляд, не стоит затрат. А сам размер устанавливается функцией SetScrollInfo() с флагом SIF_PAGE. Если нужно иметь строго определенный минимальный размер, то нужно вычислять какой-то процент от nMax и, если он меньше определенной величины, то устанавливать минимальную высоту бегунка. НО в этом случае, может нарушиться это соотношение (см. SDK):

MaxScrollPos = MaxRangeValue - (PageSize - 1)

При этом, может возникнуть ситуация, когда бегунок уже стоит у нижней кнопки Scroll Bar (для вертикального), но на стрелочку "Вниз" можно сделать положение ещё ниже... Т.е. пользователь не сумел перетащить бегунок в самое нижнее (максимальное) положение. В результате, нужно будет соответствующим образом увеличивать nMax, так, чтобы пользователь имел возможность перетащить бегунок от минимального значения до максимального...

Короче, если ты хочешь это сделать, по попробуй прежде на тестовой программке и разберись там во всех тонкостях. Возможно, тебе это удастся. Но, повторюсь, имхо, это может сильно осложнить жизнь. :)


 
capkoh ©   (2007-03-27 11:24) [11]

Подумал тут ещё... Пожалуй, это реализуемо. :)


 
DevilDevil ©   (2007-03-27 13:55) [12]

> capkoh ©   (27.03.07 10:48) [10]

Ну что через изменение PageSize можно, это я знаю. Сложновато конечно, но можно. Я надеялся, что есть иной (более простой, желательно стандартный) способ решения.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.054 c
1-1184321703
=BuckLr=
2007-07-13 14:15
2007.09.23
Определение граббинга и грабберов экрана


1-1184085640
newQA
2007-07-10 20:40
2007.09.23
WebBrowser


15-1187805274
random(255)
2007-08-22 21:54
2007.09.23
Дискретная математика (научите лентяя=)


15-1187760531
SerJaNT
2007-08-22 09:28
2007.09.23
Ubuntu 7.04 Live CD


15-1188044874
Бася
2007-08-25 16:27
2007.09.23
Эксперт для Делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский