![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
chipset |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Windows имеет два типа скролбаров. Это "встроенные" скролбары, которые мы получаем при использовании оконных стилей WS_HSCROLL и/или WS_VSCROLL, и скролбар контролы, которые фактически являются дочерними окнами и которые можно создавать в пределах окна. Сообщение WM_CTLCOLOR могут посылать только последние.
Естевственно, возникает вопрос, а почему существует два вида скролбаров ? Ответ кроется в истории. Давным давно, когда Windows была ещё очень маленькой, существовала необходимость экономить каждый бит памяти, а окна занимали значительное пространство. Так как почти в каждом окне присутствовали скролбары, то разработчики решили сделать их неотемлемой частью окон. С другой стороны, программистам не понравилось такое решение, так как им больше хотелось работать со скролбарами, как с отдельными окнами. С одной стороны, конечно же встроенные скролбары удобнее в использовании и требуют меньше кода, но с другой имеют меньше настроек, позволяющих менять их внешний вид. А как насчёт MFC? Поумолчанию, MFC-шный CScrollView использует встроенные скролбары, у которых нельзя менять цвет. Однако, ничего страшного не случится, если мы заставим CScrollView использовать Ваш собственный контрол скролбара. Но перед тем, как мы решим данную задачу, я хочу заметить, что WM_CTLCOLOR позволяет устанавливать только цвет фона, но не цвет стрелки и бегунок. Поэтому, если Вы хотите менять все цвета, то скорее всего WM_CTLCOLOR окажется бесполезным. Позже я постараюсь подкинуть несколько идей по этому поводу, ну а теперь давайте посмотрим, как заставить CScrollView использовать Ваш скролбар вместо встроенного. Итак, для начала, объявим экземпляры CScroll баров в основном фрейме: Исходный код:
Затем, при создании фрейма, создаём их окна: Исходный код:
Обратите внимание, что Вам прийдётся создать бокс скролбара, это небольшой квадратик, где вертикальный и горизонтальный скролбары соединяются, чтобы можно было ресайзить окно и избежать пустого пятна. Как только скролбары созданы, остаётся ещё несколько вещей, о которых необходимо позаботится. Это установить размер скролбаров, обработать уведомления, и получить для них вид (view). Последнее самое простое. CScrollView содержит виртуальную функцию GetScrollBarCtrl, которую можно переопределить. Исходный код:
Она получает управление от родителя используя удобные идентификаторы (ID) AFX_IDW_HSCROLL_FIRST и AFX_IDW_HSCROLL_FIRST+1. А как же уведомления? Когда пользователь перемещает полосу прокрутки, скролбар посылает WM_HSCROLL или WM_VSCROLL своему родителю, чтобы Вы могли что-нибудь сделать. Это есть очень хорошо, так как если Вы поместите свои скролбары во фрейм, то CFrameWnd уже имеет обработчики OnHScroll и OnVScroll, которые направляют WM_HSCROLL и WM_VSCROLL в вид (view): // Из winfrm.cpp Исходный код:
Если Ваш вид наследован от CScrollView, то для того, чтобы обработать сообщения прокрутки, ничего делать не надо, так как MFC делает это автоматически! Теперь о размерах. Это то место, где прийдётся проделать определённую работу. Для того, чтобы всё летало, необходимо управлять позицией скролбаров каждый раз, когда размер фрейма изменяется. Помните, что скролбары, это потомки фрейма а не вида. Обычно, обработка изменения размеров производится в OnSize, однако для фреймовых окон это делается в CFrameWnd::RecalcLayout. Применительно к программе (исходник которой можно скачать ниже) эта функция выглядит так: ////////////////// // изменение размеров фрейма: перемещение вида и скролбаров // Исходный код:
--------------------
|
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |