48471 (Работа с окнами приложений), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Работа с окнами приложений", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48471"

Текст 3 страницы из документа "48471"

WM_VSCROLL ScrollCode wndScroll & nPos
WM_HSCROLL ScrollCode wndScroll & nPos

в параметре wPar размещается код, указывающий что происходит с полосой прокрутки, старшее слово lPar содержит хендл полосы прокрутки, а младшее слово может указывать на положение “движка” полосы.

Коды полосы прокрутки могут быть следующие:

Для всех кодов, кроме SB_THUMBTRACK и SB_THUMBPOSITION, младшее слово lPar не используется. Коды SB_THUMBTRACK посылаются когда Вы, “зацепив” мышкой движок полосы прокрутки, начинаете перемещать его. При этом они посылаются так часто, как успевают обрабатываться - информируя Вас о текущем положении движка. Код SB_THUMBPOSITION посылается только в тот момент, когда Вы отпускаете кнопку мыши для позиционирования движка в новом месте.

Помимо этих кодов зарезервировано еще два - SB_TOP и SB_BOTTOM, которые никогда не посылаются полосой прокрутки. Собственно полосы прокрутки поддерживают интерфейс только с мышью, фокуса ввода они не получают, поэтому при использовании полос прокрутки возникает необходимость добавления интерфейса с клавиатурой.

Часто делают так, что родительское окно, обрабатывая сообщения от клавиатуры просто посылает само себе сообщения “от имени” полосы прокрутки. Вся обработка прокрутки окна сосредоточена на сообщениях WM_VSCROLL и WM_HSCROLL. В этом случае клавишам Home и End должны соответствовать какие-то коды полосы прокрутки, для чего и добавлены коды SB_TOP и SB_BOTTOM.

Конечно, Вы можете идти иным путем, тогда эти два кода Вам не понадобятся.

Приведем небольшой пример обработки сообщения WM_KEYDOWN родительским окном:

UINT n;

switch ( wMsg ) {

...

case WM_KEYDOWN:

switch ( wPar ) {

case VK_HOME: n= SB_TOP; goto post_vscroll;

case VK_END: n= SB_BOTTOM; goto post_vscroll;

case VK_PRIOR: n= SB_PAGEUP; goto post_vscroll;

case VK_NEXT: n= SB_PAGEDOWN; goto post_vscroll;

case VK_DOWN: n= SB_LINEDOWN; goto post_vscroll;

case VK_UP: n= SB_LINEUP;

post_vscroll:

PostMessage( hWnd, WM_VSCROLL, n, 0L );

break;

default: break;

}

return 0;

...

}

Далее нас будут интересовать средства для управления полосами прокрутки. Каждая полоса прокрутки характеризуется диапазоном прокрутки, то есть минимальным и максимальным значениями позиции движка. При создании полосы прокрутки ее диапазон устанавливается в 0..100;

Для того, что бы можно было узнать или изменить диапазон полосы прокрутки предназначены функции:

void GetScrollRange( hWnd, nBar, lpnMin, lpnMax );

int SetScrollRange( hWnd, nBar, nMin, nMax, bRepaint );

Удобно устанавливать диапазон прокрутки равным, например, числу строк в редактируемом файле.

Некоторых пояснений требуют параметры hWnd и nBar. Параметр hWnd может задавать хендл окна-родителя, тогда с помощью параметра nBar Вы указываете, какая конкретно полоса прокрутки имеется в виду: SB_VERT или SB_HORZ. А если hWnd является хенлом полосы прокрутки, то Вы должны указать nBar равным SB_CTL.

С помощью двух следующих функций Вы можете узнать текущее положение движка полосы или установить его в требуемую позицию.

Int GetScrollPos( hWnd, nBar );

int SetScrollPos( hWnd, nBar, nPos, bRepaint );

Последняя функция позволяет показать или спрятать полосы прокрутки. Она может использовать еще одно значение параметра nBarSB_BOTH, указывая, что обе полосы показываются или скрываются.

Void ShowScrollBar( hWnd, nBar, bShow );


Окна, рисуемые пользователем

Для некоторых стандартных классов дочерних окон возможно создание окон нестандартного вида. Это так называемые рисуемые пользователем (Owner Draw) окна. Вы можете создавать такие кнопки, и элементы списков (то есть Вы можете наполнять список произвольными объектами, например, рисунками). Тот же способ может быть применен для рисования пунктов меню.

Для того, что бы воспользоваться этой возможностью, Вы должны указать соответсвующий стиль - BS_OWNERDRAW для кнопки, LBS_OWNERDRAWFIXED, LBS_OWNERDRAWVARIABLE, CBS_OWNERDRAWFIXED, CBS_OWNERDRAWVARIABLE для списков. В случае списков различаются два вида рисуемых пользователем элементов - элементы одинаковой высоты (...FIXED) и элементы произвольной высоты (...VARIABLE).

Дочерние окна таких стилей будут посылать своему родительскому окну сообщения WM_MEASUREITEM и WM_DRAWITEM. Обрабатывая эти сообщения родительское окно определяет размеры требуемых элементов и осуществляет их рисование. (Эти же сообщения могут применяться для рисования меню).

WM_MEASUREITEM nID lpMI

это сообщение посылается для определения размеров рисуемого элемента. Параметр wPar содержит идентификатор дочернего окна, а параметр lPar - дальний указатель на структуру MEASUREITEMSTRUCT, которую надо заполнить.

typedef struct tagMEASUREITEMSTRUCT { /* mi */

UINT CtlType; // тип рисуемого элемента

UINT CtlID; // идентификатор

UINT itemID; // идентификатор элемента (номер пункта)

UINT itemWidth; // ширина элемента

UINT itemHeight; // высота элемента

DWORD itemData; // данные элемента

} MEASUREITEMSTRUCT;

Поля CtlType, CtlID, itemID и itemData заполняются Windows, вы будете их использоватьь для определения нужного элемента.

Поле CtlType может быть одним из следующих:

ODT_BUTTON - кнопка

ODT_COMBOBOX - элемент комбинированного список

ODT_LISTBOX - элемент простого список

ODT_MENU - элемент меню

Поля CtlID и ItemID определяют идентификаторы дочернего окна и элемента этого дочернего окна (если дочернее окно является списком или рисуется элемент меню).

Поле ItemData является значением, которое Вы передали либо при создании дочернего окна (имя кнопки) либо при добавлении элемента в список или меню (см. сообщения CB_ADDSTRING, CB_INSERTSTRING, LB_ADDSTRING, LB_INSERTSTRING и функции InsertMenu, AddMenu). Обычно это поле является указателем на название окна/элемента.

Два поля itemHeight и itemWidth вы должны определить сами. При этом надо иметь в виду, что некорректное задание этих полей или некорректная обработка сообщения WM_DRAWITEM может привести к непредсказуемым результатам, так как Windows не проверяет корректности значений и выполненых действий).

WM_DRAWITEM nID lpDI

а это сообщение посылается, когда необходимо нарисовать требуемый элемент. Параметр lPar является дальним указателем на структуру DRAWITEMSTRUCT, которая содержит необходимые для рисования данные.

typedef struct tagDRAWITEMSTRUCT { /* ditm */

UINT CtlType; // тип рисуемого элемента

UINT CtlID; // идентификатор

UINT itemID; // идентификатор элемента (номер пункта)

UINT itemAction; // из-за чего надо рисовать

UINT itemState; // как надо рисовать

HWND hwndItem; // хендл окна рисуемого элемента

HDC hDC; // хендл контекста устройства для рисования

RECT rcItem; // прямоугольник, в котором надо рисовать

DWORD itemData; // данные элемента

} DRAWITEMSTRUCT;

Обратим внимание на поля itemAction и itemState. Они в некоторой степени дублируют друг друга, так как itemState указывает текущее состояние элемента, а itemAction - причину рисования, например получение фокуса или выбор элемента. Для упрощения логики рисования, можно перерисовывать все окошко, ориентируясь только на поле itemState, указывающее как надо рисовать.

Если надо нарисовать элемент, имеющий фокус, то можно оспользоваться функцией

void DrawFocusRect( hDC, lpRect );

которая рисует пунктирный прямоугольник, обычно изображающий элемент, имеющий фокус ввода.


Управление цветом дочерних окон

Окна, принадлежащие к стандартным классам дочерних окон, предусматривают специальный механизм для управления их цветом. Он основан на использовании сообщения WM_CTLCOLOR, которое дочернее окно посылает родительскому для определения нужных цветов.

WM_CTLCOLOR DC CtlType&hwndChild

Параметры этого сообщения следующие:

wPar содержит хендл контекста устройства рисуемого окна младшее слово lPar содержит хендл этого окна, а старшее - тип рисуемого окна:

CTLCOLOR_BTN, CTLCOLOR_DLG, CTLCOLOR_EDIT, CTLCOLOR_LISTBOX, CTLCOLOR_MSGBOX, CTLCOLOR_SCROLLBAR, CTLCOLOR_STATIC

Обрабатывая это сообщение, Вы должны установить требуемые атрибуты, например, цвета текста, фона, режим заполнения фона в указанном контексте устройства и вернуть хендл кисти, которая будет использоваться для закраски фона.

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

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
428
Средний доход
с одного платного файла
Обучение Подробнее