Форум: "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.051 c