Лабораторная работа № 6. Использование механизма обмена сообщениями для управления окнами

 

Цель: Реализация механизма обмена сообщениями в операционной системе Windows.

Задачи:

1. Изучение теоретического материала по обмену сообщениями для управления окнами.

2. Составление алгоритма программы.

3. Программная реализация.

Ход работы:

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

2. Получить индивидуальный вариант задания у преподавателя.

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

4. Написать отчет и представить его к защите вместе с исполняемым модулем программы и исходными текстами.

Ход защиты:

1. Продемонстрировать преподавателю программу, использующую механизмы обмена сообщениями для управления окнами.

2. Пояснить программный код разработанного приложения.

 

Программы в ОС Windows управляются сообщениями. Все действия пользователей перехватываются системой и преобразуются в сообщения, направляемые программе, которая владеет окнами, к которым обращены действия пользователя. У каждой программы, состоящей хотя бы из одного потока, есть несколько собственных очередей сообщений: очередь асинхронных сообщений, очередь синхронных сообщений, очередь ответных сообщений и очередь виртуального ввода, куда и направляются все сообщения, касающиеся действий с окнами. В каждой программе есть главный цикл, который состоит из получения следующего сообщения и его обработки с помощью внутренней процедуры, соответствующей данному типу сообщений. Иногда некоторые сообщения вызывает эти процедуры, минуя очереди сообщений.

Практически каждая программа в ОС Windows будет содержать код, похожий на следующий.

#include <windows.h>

 

long CALLBACK WndProcedure (HWND Window, UINT Mess, UINT Parametr, long Prm)

{

// обработка сообщений

switch (Mess) {

case WM_PAINT:; return 0; // перерисовка содержимого окна

case WM_CREATE:; return 0; // создание окна

case WM_CLOSE: DestroyWindow (Window); return 0;

                          // закрытие окна

case WM_DESTROY: PostQuitMessage (0); return 0;

                          // уничтожение окна

}

return (DefWindowProc (Window, Mess, Parametr, Prm));  

                          // действия по умолчанию

}

 

int WINAPI WinMain (HINSTANCE h, HINSTANCE hprev, char *CmdLine, int CmdShow)

{

WNDCLASS WinClass; // объект окна

MSG Mess; // входящие сообщения

HWND Window; // дескриптор окна

WinClass.lpfnWndProc = WndProcedure;

WinClass.lpszClassName = “Okoshko”;

WinClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

WinClass.hCursor = LoadCursor (NULL, IDC_ARROW);

// курсор мыши – стрелка

// перерисовка всего окна при изменении высоты и ширины окна

WinClass.Style = CS_HREDRAW | CS_VREDRAW;

// зарегистрировать в системе объект окна

// здесь нет проверки возвращаемого значения

RegisterClass (&WinClass);

// запрос ресурсов для окна

Window = CreateWindow (WinClass.lpszClassName, “Zagolovok okna”,

WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, HWND_DESKTOP, NULL, h,

NULL);

ShowWindow (Window, CmdShow); // отображение окна

UpdateWindow (Window); // перерисовка окна

while (GetMessage (&Mess, NULL, 0, 0)) {

// получение сообщения из очереди

TranslateMessage (&Mess); // трансляция сообщения

DispatchMessage (&Mess);

// сообщение соответствующей процедуре

}

 

return (Mess.wParam);

}

В ОС Windows прежде чем создавать окно, его нужно зарегистрировать. Регистрацию класса окна и производит функция

ATOM RegisterClass (CONST WNDCLASS *WndClass);

// указатель на структуру с данными класса

 

q WS_BORDER – Создание окна с рамкой.

q WS_CAPTION – Создание окна с заголовком (невозможно использовать одновременно со стилем WS_DLGFRAME).

q WS_CHILDWINDOW – Создание дочернего окна (невозможно использовать одновременно со стилем WS_POPUP).

q WS_CLIPCHILDREN – Исключает область, занятую дочерним окном, при выводе в родительское окно.

q WS_CLIPSIBLINGS – Используется совместно со стилем WS_CHILD для отрисовки в дочернем окне областей, перекрываемых другими окнами.

q WS_DISABLED – Создает окно, которое недоступно.

q WS_DLGFRAME – Создает окно с двойной рамкой, без заголовка.

q WS_GROUP – Позволяет объединять элементы управления в группы.

q WS_HSCROLL – Создает окно с горизонтальной полосой прокрутки.

q WS_MAXIMIZE – Создает окно максимального размера.

q WS_MAXIMIZEBOX – Создает окно с кнопкой развертывания окна.

q WS_ICONIC – Создает первоначально свернутое окно (используется только со стилем WS_OWERLAPPED).

q WS_MINIMIZEBOX – Создает окно с кнопкой свертывания.

q WS_OVERLAPPED – Создает перекрывающееся окно (которое, как правило, имеет заголовок и WS_TILED рамку).

q WS_OVERLAPPEDWINDOW – Создает перекрывающееся окно, имеющее стили WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX.

q WS_POPUP – Создает всплывающее окно (невозможно использовать совместно со стилем WS_CHILD).

q WS_POPUPWINDOW – Создает всплывающее окно, имеющее стили WS_BORDER, WS_POPUP, WS_SYSMENU.

q WS_SYSMENU – Создает окно с кнопкой системного меню (можно использовать только с окнами, имеющими строку заголовка).

q WS_TABSTOP – Определяет элементы управления, переход к которым может быть выполнен по клавише TAB.

q WS_THICKFRAME – Создает окно с рамкой, используемой для изменения

q WS_SIZEBOX – размера окна.

q WS_VISIBLE – Создает первоначально неотображаемое окно.

q WS_VSCROLL – Создает окно с вертикальной полосой прокрутки.

 

Функция CreateWindow используется программой для создания окна, а пример ее использования приводился выше.

HWND CreateWindow (

LPCTSTR ClassName,

// указатель на зарегистрированное имя класса

LPCTSTR WindowName, // указатель на имя окна

DWORD dwStyle, // стиль окна

int x,         // горизонтальная позиция окна

int y,         // вертикальная позиция окна

int Width,     // ширина окна

int Height,    // высота окна

HWND WndParent, // дескриптор родительского или окна владельца

HMENU Menu,

// дескриптор меню или идентификатор дочернего окна

HANDLE Instance, // дескриптор экземпляра программы

LPVOID Param); // указатель на данные создания окна

 

Следующие предопределенные классы элементов управления могут быть определены в параметре ClassName:

BUTTON (КНОПКА). Обозначает маленькое прямоугольное дочернее окно, которое представляет собой кнопку и пользователь может щелкать по ней мышью, чтобы включить или отключить ее. Кнопки управления могут использоваться самостоятельно или в группах, и они могут или быть подписаны или появляться без текста. Кнопки управления обычно изменяют свой вид, когда пользователь щелкает мышью по ним.

COMBOBOX (КОМБИНИРОВАННОЕ ОКНО). Обозначает элемент управления, состоящий из окна со списком и поля выбора, похожего на элемент редактирования текста. При использовании этого стиля, прикладная программа должна отображать все время или окно со списком или включать раскрывающийся список. В зависимости от стиля комбинированного окна, пользователь сможет или не сможет редактировать содержание поля выбора. Если окно со списком видимо, вводимые символы внутри поля выбора подсвечивают сначала ввод в окно со списком, который соответствует печатаемым символам. Наоборот, выбор элемента в окне со списком отображает выбранный текст в поле выбора.

EDIT (ОКНО РЕДАКТИРОВАНИЯ). Обозначает прямоугольное дочернее окно, внутри которого пользователь может напечатать с клавиатуры текст. Пользователь выбирает элемент управления и дает ему фокус клавиатуры, щелкая мышью по нему или перемещаясь в него, путем нажатия клавиши ТАБУЛЯЦИИ (TAB). Пользователь может напечатать текст, когда элемент управления редактируемого окна отображает мигающую каретку (caret); используйте мышь, чтобы перемещать курсор, выбирать символы, которые будут заменены, или установите курсор для вставки символов; или используйте (BACKSPACE), чтобы удалять символы. Элементы управления редактируемого окна используют шрифт системы с переменным шагом и показывают на экране символы из символьного набора ANSI. Сообщение WM_SETFONT может также быть послано элементу управления окна редактирования, чтобы изменить заданный по умолчанию шрифт. Элементы управления окна редактирования увеличиваются в соответствии с табуляцией символов стольким количеством пробелов, сколько их требуются, чтобы переместить каретку в следующую позицию табуляции. Позиции табуляции принимаются такими, чтобы быть в каждом восьмом знакоместе.

LISTBOX (ОКНО СО СПИСКОМ). Обозначает список строк символов. Этот элемент управления определяется всякий раз, когда прикладная программа должна представить список наименований, типа имен файлов, из которых пользователь может выбирать. Пользователь может выбрать строку, щелкая мышью по ней. Выбранная строка выделяется, а уведомительное сообщение передается в родительское окно. Чтобы листать списки, которые являются слишком длинными для элемента управления окна, используются вертикальная или горизонтальная линейки прокрутки окна со списком. Окно со списком автоматически скрывает или показывает линейку прокрутки, по мере необходимости.

MDICLIENT. Обозначает рабочее окно МНОГОДОКУМЕНТНОГО ИНТЕРФЕЙСА (MDI). Это окно принимает сообщения, которые управляют дочерними окнами прикладной программы МНОГОДОКУМЕНТАЛЬНОГО ИНТЕРФЕЙСА. Рекомендованный стиль содержит WS_CLIPCHILDREN и WS_CHILD. Чтобы создать рабочее окно MDI, которое позволяет пользователю при появлении листать дочерние окна MDI, определите стили WS_HSCROLL и WS_VSCROLL.

SCROLLBAR (ЛИНЕЙКА ПРОКРУТКИ). Обозначает прямоугольник, который содержит бегунок и имеет стрелки направленные в оба конца.
Линейка прокрутки посылает уведомительное сообщение своему родительскому окну всякий раз, когда пользователь щелкает мышью по элементу управления. В случае необходимости, родительское окно ответственно за модификацию позиции бегунка. Элементы управления линейкой прокрутки имеют тот же самый вид и пользуются функциями, что и линейки прокрутки, используемые в обычных окнах. Однако, в отличие от линеек прокрутки окна, линейки прокрутки элемента управления могут быть установлены для использования где-нибудь в окне, при прокрутке вводимой информации необходимой для окна. Класс линейки прокрутки включает также и элементы управления размером окна. Окно с изменяемыми размерами - это маленький прямоугольник, который пользователь может растягивать, чтобы изменить размер окна.

STATIC (СТАТИЧЕСКИЙ ЭЛЕМЕНТ). Обозначает простое текстовое поле, окно или прямоугольник, используемый для надписей, окно или другие отдельные элементы управления. Статические элементы управления не берут никакой вводимой информации и не обеспечивают никакой выводимой информации.

Win 32 API обеспечивает общие стили окна и определенные классом стили окна. Общие стили окон представляются константами, которые начинаются с префикса WS _; они могут быть объединены оператором | (ИЛИ), чтобы формировать различные типы окон, включая главные окна, диалоговые окна и дочерние окна. Определенные классом стили окна определяют вид и поведение окон, принадлежащих к предопределенным классам элемента управления, таких как окна редактирования и окна списков.

Ниже перечислены стили кнопок (в классе BUTTON), которые могут быть определены в параметре dwStyle:

q BS_ 3 STATE – Создает кнопку, которая является такой же, как окошко для флажка, за исключением того, что поле окна может стать недоступным так же, как это делается при установке флажка ("галочки") проверки (checked) или при отмене его. Используйте недоступное состояние, чтобы показать, что состояние окошка для флажка не определено.

q BS_AUTO 3 STATE – Создает кнопку, которая является таким же переключателем с тремя состояниями, за исключением того, что поле окна изменяет свое состояние, когда пользователь выбирает его. Состояние циклически проходит фазы установки флажка проверки, недоступности и отмены
установки.

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

q BS_AUTORADIOBUTTON – Создает кнопку, которая то же, что и "радио" кнопка, за исключением того, что, когда пользователь выбирает её, Windows автоматически устанавливает состояние кнопки в режим контроля флажка, отметив ее "галочкой" и автоматически устанавливает проверку состояния для всех других кнопок в той же самой группе без проверки флажка.

q BS_CHECKBOX – Создает маленькое, пустое окошко для флажка с текстом. По умолчанию, текст отображается справа от окошка. Чтобы отображать текст слева от окошка, объедините этот флажок со стилем BS_LEFTTEXT (или с эквивалентным стилем BS_RIGHTBUTTON).

q BS_DEFPUSHBUTTON – Создает командную кнопку, которая ведет себя подобно кнопке стиля BS_PUSHBUTTON и к тому же имеет жирную черную рамку. Если кнопка находится в диалоговом окне, пользователь может выбрать кнопку, нажав клавишу ENTER, даже тогда, когда кнопка не имеет фокуса ввода. Этот стиль полезен для предоставления пользователю возможности быстро выбрать наиболее подходящую (заданную по умолчанию) опцию.

q BS_GROUPBOX – Создает прямоугольник, в котором могут быть сгруппированы другие элементы управления. Любой текст, связанный с этим стилем отображается в верхнем левом угле прямоугольника.

q BS_LEFTTEXT – Помещает текст слева от "радио" кнопки или окошечка-переключателя, когда объединен со стилем переключателя или "радио" кнопкой. Тот же самое, что и стиль BS_RIGHTBUTTON.

q BS_OWNERDRAW – Создает кнопку представляемую владельцем. Окно владельца принимает сообщение WM_MEASUREITEM, когда кнопка создана и сообщение WM_DRAWITEM, когда внешний вид кнопки изменился.
Не объединяйте стиль BS_OWNERDRAW с любыми другими стилями кнопки.

q BS_PUSHBUTTON – Создает командную кнопку, которая отправляет сообщение WM_COMMAND окну владельца, когда пользователь выбирает эту кнопку.

q BS_RADIOBUTTON – Создает маленький кружок с текстом. По умолчанию, текст отображается справа от кружка. Чтобы отображать текст слева от кружка, объедините этот флажок со стилем BS_LEFTTEXT (или его эквивалентом - стилем BS_RIGHTBUTTON). Используйте "радио" кнопки для групп связанного, но взаимоисключающего выбора.

q BS_USERBUTTON – Устаревшая, но предусматривающая совместимость с 16-разрядными версиями Windows. Базирующиеся на Win32 прикладные программы должны использовать BS_OWNERDRAW взамен этого параметра.

q BS_BITMAP – Определяет, что кнопка отображает точечный рисунок.

q BS_BOTTOM – Помещает текст внизу прямоугольника кнопки.

q BS_CENTER – Выравнивает текст горизонтально по центру в прямоугольнике кнопки.

q BS_ICON – Определяет, что кнопка отображается как значок.

q BS_LEFT – Выравнивает слева текст в прямоугольнике кнопки. Однако, если кнопка - окошечко-переключатель или "радио" кнопка, которые не имеет стиля BS_RIGHTBUTTON, текст остается выровненным справа от переключателя или радиокнопки.

q BS_MULTILINE – Переносит по словам текст кнопки в дополнительные строки, если текстовая строка слишком длинна, чтобы поместиться в одной строке в прямоугольнике кнопки.

q BS_NOTIFY – Дает возможность кнопке послать уведомительные сообщения BN_DBLCLK, BN_KILLFOCUS и BN_SETFOCUS в её родительское окно. Обратите внимание, что кнопки посылают уведомительное сообщение BN_CLICKED независимо от того, имеет ли она этот стиль.

q BS_PUSHLIKE – Создает кнопку (типа переключателя, переключателя с тремя состояниями или "радио" кнопки) имеющую вид и действующую подобно командной кнопке. Выпуклый вид кнопки, когда она не нажата или не выбрана и притопленый, когда она нажата или выбрана.

q BS_RIGHT – Выровненный справа текст в прямоугольнике кнопки. Однако, если кнопка – окошко для флажка или "радио" кнопка, которая не имеет стиля BS_RIGHTBUTTON, текст выровнен по правому краю справа от окошка для флажка или "радио" кнопки.

q BS_RIGHTBUTTON – Устанавливает кружок "радио" кнопки или квадрат окошка для флажка справа от прямоугольника кнопки. Тот же самый стиль, что и BS_LEFTTEXT.

q BS_TEXT – Определяет, что кнопка отображает текст.

q BS_TOP – Размешает текст вверху прямоугольника кнопки.

q BS_VCENTER – Размещает текст в середине (вертикально) прямоугольника кнопки.

 

Ниже перечислены стили комбинированного окна (в классе COMBOBOX), которые могут быть определены в параметре dwStyle:

q CBS_AUTOHSCROLL – Автоматически прокручивает текст в поле редактирования текста вправо, когда пользователь вводит с клавиатуры символ в конце строки. Если этот стиль не установлен, принимается только текст, который помещается внутри прямоугольной границы поля.

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

q CBS_DROPDOWN – Подобен CBS_SIMPLE, за исключением того, что окно со списком не отображается, пока пользователь не выберет значок рядом с полем редактирования текста.

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

q CBS_HASSTRINGS – Определяет, что представляемое владельцем комбинированное окно содержит элементы, состоящие из строк. Комбинированное окно поддерживает память и адрес для строк, так что прикладная программа может использовать сообщение CB_GETLBTEXT, чтобы восстановить текст для отдельного элемента.

q CBS_LOWERCASE – Преобразовывает в нижний регистр любые символы верхнего регистра, введенные в поле редактирования текста комбинированного окна.

q CBS_NOINTEGRALHEIGHT – Определяет, что размер комбинированного окна - это точный размер, определенный прикладной программой, когда она создала комбинированное окно. Обычно, Windows устанавливает размеры комбинированного окна так, чтобы оно не отображало элементы частично.

q CBS_OEMCONVERT – Преобразует текст, введенный в поле редактирования текста комбинированного окна. Текст преобразуется из набора символов Windows в набор символов OEM, а затем обратно в набор Windows. Это гарантирует соответствующее символьное преобразование, когда прикладная программа вызывает функцию CharToOem, чтобы преобразовать строку Windows в комбинированном окне в символы OEM. Этот стиль наиболее полезен для комбинированных окон, которые содержат имена файлов и применяются только в комбинированных окнах, созданных со стилем CBS_SIMPLE или CBS_DROPDOWN.

q CBS_OWNERDRAWFIXED – Определяет, что владелец окна со списком ответственен за прорисовку его содержания и что элементы в окне со списком все равной высоты. Окно владельца принимает сообщение WM_MEASUREITEM, когда комбинированное окно создано, а сообщение WM_DRAWITEM, когда внешний вид комбинированного окна изменился.

q CBS_OWNERDRAWVARIABLE – Определяет, что владелец окна со списком ответственен за прорисовку его содержания и что элементы в окне со списком являются переменными по высоте. Окно владельца принимает сообщение WM_MEASUREITEM для каждого элемента комбинированного окна, когда Вы создаете комбинированное окно; окно владельца принимает сообщение WM_DRAWITEM тогда, когда изменился внешний вид комбинированного окна.

q CBS_SIMPLE – Всегда отображать окно со списком. Текущий выбор в окне со списком отображается в поле редактирования текста.

q CBS_SORT – Автоматически сортирует строки, введенные в окно со списком.

q CBS_UPPERCASE – Преобразовывает любые символы нижнего регистра в символы верхнего регистра, введенные в поле редактирования текста комбинированного окна.

 

Ниже перечисленные стили поля редактирования текста (в классе EDIT) могут быть определены в параметре dwStyle:

q ES_AUTOHSCROLL – Автоматически прокручивает текст вправо на 10 символов, когда пользователь напечатает символ в конце строчки. Когда пользователь нажимает клавишу ENTER, управление прокручивает весь текст обратно, чтобы установить нуль.

q ES_AUTOVSCROLL – Автоматически перемещает текст вверх на одну страницу, когда пользователь нажимает клавишу ENTER на последней строчке.

q ES_CENTER – Выравнивает по центру текст в многостроковом поле редактирования текста.

q ES_LEFT – Выравнивание текста слева.

q ES_LOWERCASE – Преобразовывает все символы в нижний регистр, поскольку они печатаются внутри поля редактирования текста.

q ES_MULTILINE – Обозначает многостроковое окно редактирования текста. Значение по умолчанию - одностроковое окно редактирования текста. Когда многостроковое поле редактирования находится в диалоговом окне, заданная по умолчанию ответная реакция на нажим клавиши ENTER должна активизировать кнопку по умолчанию. Чтобы использовать клавишу ENTER для перевода строки, стиль используйте ES_WANTRETURN. Когда многостроковое окно редактирования не в диалоговом окне и определен стиль ES_AUTOVSCROLL, поле редактирования показывает столько строчек, сколько это возможно и прокручивает вертикально, когда пользователь нажимает клавишу ENTER. Если Вы не определяете ES_AUTOVSCROLL, окно редактирования показывает столько строчек, сколько это возможно и подает звуковой сигнал, если пользователь нажимает клавишу ENTER, но больше ни строчки не может отобразиться в окне. Если Вы определяете стиль ES_AUTOHSCROLL, многостроковое окно редактирования автоматически горизонтально прокручивается, когда каретка проходит за правый край элемента управления. Чтобы запустить новую строку, пользователь должен нажать клавишу ENTER. Если Вы не определяете ES_AUTOHSCROLL, элемент управления, когда это необходимо, автоматически переносит без разрыва слова в начало следующей строки. Новая строка образуется и тогда, если пользователь нажимает клавишу ENTER. Размер окна определяет позицию перехода слова на новую строку. Если размер окна изменяется, изменяется позиция перехода на новую строку, а текст восстанавливается. Многостроковое окно редактирования текста может иметь линейки прокрутки. Окно редактирования с линейками прокрутки обрабатывают свои собственные сообщения от линейки прокрутки. Обратите внимание, что окно редактирования без линеек прокрутки, прокручивают текст, как описано в предыдущих параграфах и обрабатывают любые сообщений прокрутки, посланные родительским окном.

q ES_NOHIDESEL – Отрицает заданное по умолчанию поведение для поля редактирования текста. Заданное по умолчанию поведение скрывает выбор, когда элемент управления теряет фокус ввода и инвертирует выбор, когда панель управления принимает фокус ввода. Если Вы определяете ES_NOHIDESEL, выбранный текст инвертируется, даже если панель управления не имеет фокуса.

q ES_NUMBER – Позволяет ввести в поле редактирования только цифры.

q ES_OEMCONVERT – Преобразует текст, введенный в окно редактирования. Текст преобразуется из набора символов Windows - в набор символов OEM, а затем обратно - в набор Windows. Это гарантирует соответствующее символьное преобразование, когда из прикладной программы вызывается функция CharToOem, чтобы преобразовать строку Windows в окне редактирования в символы OEM. Этот стиль наиболее полезен для окон редактирования текста, которые содержат имена файлов.

q ES_PASSWORD – Отображает звездочку (*) вместо каждого символа, введенного с клавиатуры в окно редактирования. Вы можете использовать сообщение EM_SETPASSWORDCHAR, чтобы заменить ею символ, который отображается.

q ES_READONLY – Не допускает пользователя к вводу или редактированию текста в окне редактирования.

q ES_RIGHT – Выравнивает по правому краю текст в многострочном окне редактирования.

q ES_UPPERCASE – Преобразует все символы в символы верхнего регистра, когда они вводятся в окно редактирования.

q ES_WANTRETURN – Определяет, чтобы служебный код возврата каретки был вставлен тогда, когда пользователь нажимает клавишу ENTER при вводе текста в многострочное поле редактирования текста в диалоговом окне. Если Вы не определяете этот стиль, нажимая клавишу ENTER, вы получите тот же самый эффект, словно нажали заданную по умолчанию командную кнопку диалогового окна. Этот стиль не имеет никакого влияния в однострочном окне редактирования.

 

Следующие стили элемента управления окна со списком (в классе LISTBOX) могут быть определены в параметре dwStyle:

q LBS_DISABLENOSCROLL – Показывает заблокированную вертикальную линейку прокрутки в окне со списком, когда поле окна не содержит достаточно элементов для прокрутки. Если Вы не определяете этот стиль, линейка прокрутки скрыта, когда окно со списком не содержит достаточно элементов.

q LBS_EXTENDEDSEL – Позволяет многочисленным элементам быть выбранными, при помощи использования клавиши SHIFT и мыши или специальной комбинации клавиш.

q LBS_HASSTRINGS – Определяет, что окно со списком содержит элементы, состоящие из строк. Окно со списком сохраняет память и адреса строк, так что прикладная программа может использовать сообщение LB_GETTEXT, чтобы восстановить текст для отдельного элемента. По умолчанию, все окна со списком за исключением окон со списком предоставленных владельцем имеют этот стиль. Вы можете создать предоставляемое владельцем окно со списком с ним или без этого стиля.

q LBS_MULTICOLUMN – Определяет многостолбцовое окно со списком, которое прокручивается горизонтально. Сообщение LB_SETCOLUMNWIDTH устанавливает ширину столбцов.

q LBS_MULTIPLESEL – Включает или выключает выбор последовательности символов каждый раз, когда пользователь одним или двойным щелчком мыши активизирует строку символов в окне со списком. Пользователь может выбрать любое число строк.

q LBS_NODATA – Определяет "отсутствие данных" в окне со списком. Этот стиль определяется тогда, когда число элементов в окне со списком может превысить одну тысячу. Окно со списком с "отсутствующими данными" должно иметь также стиль LBS_OWNERDRAWFIXED, но не должно иметь стилей LBS_SORT или LBS_HASSTRINGS. Окно со списком с "отсутствующими данными" имеет сходство с окном со списком предоставляемым владельцем за исключением того, что оно не содержит ни строковых или растровых данных для элемента. Команды "добавить", "вставить" или "удалить" элемент всегда игнорируют любые передаваемые элементы данных; запрос на поиск строки внутри окна всегда терпит неудачу. Windows посылает сообщение WM_DRAWITEM окну владельцу, когда элемент должен быть прорисован. ЭлементID (itemID) член структуры DRAWITEMSTRUCT, переданный с сообщением WM_DRAWITEM, определяет номер строки элемента, который будет прорисован. Окно списка с "отсутствующими данными" не посылает сообщение WM_DELETEITEM.

q LBS_NOINTEGRALHEIGHT – Определяет, что размер окна со списком соответствует размеру, определенному прикладной программой, когда она создавала окно со списком. Обычно, Windows устанавливает величину окна со списком так, чтобы оно не отображало элементы частично.

q LBS_NOREDRAW – Определяет, что вид окна со списком не модифицируется, когда производятся изменения. Вы можете в любое время изменить этот стиль, посылая сообщение WM_SETREDRAW.

q LBS_NOSEL – Определяет, что окно со списком содержит элементы, которые могут просматриваться, но не выбираться.

q LBS_NOTIFY – Сообщает родительскому окну о входящем сообщении всякий раз, когда пользователь щелкает мышью или дважды щелкает по строке в окне списка.

q LBS_OWNERDRAWFIXED – Определяет, что владелец окна со списком ответственен за прорисовку его содержания и что элементы в окне со списком появляются одинаковой высоты. Окно владельца принимает сообщение WM_MEASUREITEM, когда окно со списком создано, а сообщение WM_DRAWITEM, когда внешний вид окна изменился.

q LBS_OWNERDRAWVARIABLE – Определяет, что владелец окна со списком ответственен за прорисовку его содержания и что элементы в окне со списком появляются переменными по высоте. Окно владельца принимает сообщение WM_MEASUREITEM для каждого элемента в окне со списком, когда оно создано, а сообщение WM_DRAWITEM, когда внешний вид окна изменился.

q LBS_SORT – Сортирует строки в окне со списком по алфавиту.

q LBS_STANDARD – Сортирует строки в окне со списком в алфавитном порядке. Родительское окно принимает входящее сообщение всякий раз, когда пользователь щелкает мышью или дважды щелкает по строке. Окно со списком имеет, рамку со всех сторон.

q LBS_USETABSTOPS – Дает возможность окну списка распознавать и развернуть символы в виде таблицы при прорисовке его строк. По умолчанию таблица занимает 32 единицы измерения диалогового окна. Единица измерения диалогового окна - горизонтальное или вертикальное расстояние. Одна горизонтальная единица диалогового окна равна четвертой части текущей единицы измерения габаритов диалогового окна. Windows вычисляет эти единицы измерения, основанные на высоте и ширине шрифта существующей системы. Функция GetDialogBaseUnits возвращает значение текущей базовой единицы измерения диалогового окна в пикселях.

q LBS_WANTKEYBOARDINPUT – Определяет, что владелец окна списка принимает сообщения WM_VKEYTOITEM всякий раз, когда пользователь нажимает клавишу, а окно со списком имеет фокус ввода. Это дает возможность прикладной программе выполнить специальную обработку при вводе с клавиатуры.

 

Следующие стили линейки прокрутки (в классе SCROLLBAR) могут быть определены в dwStyle параметре:

q SBS_BOTTOMALIGN – Выравнивает нижнюю кромку линейки прокрутки с нижней кромкой прямоугольника, определенного параметрами x, y, Width и Height. Линейка прокрутки имеет заданную по умолчанию высоту для системных линеек прокрутки. Используйте этот стиль со стилем SBS_HORZ.

q SBS_HORZ – Обозначает горизонтальную линейку прокрутки. Если стили ни SBS_BOTTOMALIGN, ни SBS_TOPALIGN не определены, линейка прокрутки имеет высоту, ширину и позицию, определенные x, y, Width и Height.

q SBS_LEFTALIGN – Выравнивает левый край линейки прокрутки с левым краем прямоугольника, определенного параметрами x, y, Width и Height. Линейка прокрутки имеет заданную по умолчанию ширину для системных линеек прокрутки. Используйте этот стиль с SBS_VERT стилем.

q SBS_RIGHTALIGN – Выравнивает правый край линейки прокрутки с правым краем прямоугольника, определенного параметрами x, y, Width и Height. Линейка прокрутки имеет заданную по умолчанию ширину для системных линеек прокрутки. Используйте этот стиль с SBS_VERT стилем.

q SBS_SIZEBOX – Обозначает размер окна. Если Вы не определяете ни SBS_SIZEBOXBOTTOMRIGHTALIGN, ни SBS_SIZEBOXTOPLEFTALIGN стиль, размер окна имеет высоту, ширину и позицию, определенную параметрами x, y, Width и Height.

q SBS_SIZEBOXBOTTOMRIGHTALIGN – Выравнивает размер нижнего правого угла окна с нижним правым углом прямоугольника, определенного параметрами x, y, Width и Height. Размер окна имеет заданный по умолчанию размер для системы размера окон. Используйте этот стиль с SBS_SIZEBOX стилем.

q SBS_SIZEBOXTOPLEFTALIGN – Выравнивает размер верхнего левого угла окна с левым верхним углом прямоугольника, определенного параметрами x, y, Width и Height. Размер окна имеет заданный по умолчанию размер для системы размера окон. Используйте этот стиль с SBS_SIZEBOX стилем.

q SBS_SIZEGRIP – Подобен стилю SBS_SIZEBOX, но с выпуклой рамкой.

q SBS_TOPALIGN – Выравнивает верхний край линейки прокрутки с верхним краем прямоугольника, определенного параметрами x, y, Width и Height. Линейка прокрутки имеет заданную по умолчанию высоту для системы линеек прокрутки. Используйте этот стиль с SBS_HORZ стилем.

q SBS_VERT – Обозначает вертикальную линейку прокрутки. Если Вы не определяете ни SBS_RIGHTALIGN, ни SBS_LEFTALIGN стиль, линейка прокрутки имеет высоту, ширину и позицию, определенную параметрами x, y, Width и Height.

 

Следующие стили статического элемента управления (в классе STATIC) могут быть определены в параметре dwStyle. Статический элемент управления может иметь только один из этих стилей:

q SS_BITMAP – Определяет, что в статическом элементе управления должен отобразиться точечный рисунок. Текст кода ошибки - имя точечного рисунка (не имя файла) определенного в другом месте файла ресурса. Стиль игнорирует параметры Width и Height; элемент управления автоматически устанавливает собственные размеры, чтобы поместить точечный рисунок.

q SS_BLACKFRAME – Определяет окно с рамкой, использующей тот же самый цвет, как и у рамки основного окна. Этот цвет черный по умолчанию в системе цветов Windows.

q SS_BLACKRECT – Определяет прямоугольник, заполненный текущим
цветом рамки окна. По умолчанию этот цвет черный в системе цветов Windows.

q SS_CENTER – Определяет простой прямоугольник и выравнивает по центру текст кода ошибки в прямоугольнике. Текст форматируется перед отображением его на экране. Слова, которые выходят за пределы конца строки автоматически переносятся в начало следующей центрированной строки.

q SS_CENTERIMAGE – Определяет, что средняя точка статического элемента управления со стилем SS_BITMAP или SS_ICON должна остаться фиксированной, когда элемент управления изменяется. Четыре стороны корректируются так, чтобы поместить новый точечный рисунок или пиктограмму.
Если статический элемент управления имеет стиль SS_BITMAP, а точечный рисунок меньше чем рабочая область элемента управления, рабочая область заполняется цветом пикселя левого верхнего угла точечного рисунка. Если статический элемент управления имеет стиль SS_ICON, пиктограмма появляется, но не окрашивает рабочую область.

q SS_GRAYFRAME – Определяет поле окна с рамкой, выведенной тем же самым цветом, что и экранный фон (рабочий стол). По умолчанию в системе цветов Windows этот цвет серый.

q SS_GRAYRECT – Определяет прямоугольник, заполненный текущим экранным цветом фона. По умолчанию в системе цветов Windows этот цвет серый.

q SS_ICON – Определяет пиктограмму, отображаемую в диалоговом окне. Данный текст – имя пиктограммы (не имя файла) определенный в другом месте файла ресурса. Стиль игнорирует параметры nWidth и nHeight; пиктограмма автоматически устанавливает свою величину.

q SS_LEFT – Определяет простой прямоугольник и выравнивание по левому краю текста, помещенного в прямоугольнике. Текст форматируется перед его отображением. Слова, которые выходят за пределы конца строки автоматически переносятся в начало следующей выровненной по левой границе
строки.

q SS_LEFTNOWORDWRAP – Определяет простой прямоугольник и выравнивание по левому краю текста, помещенного в прямоугольнике. Планшеты расширяются, но слова не переносятся. Текст, который выходит за пределы конца строки, отсекается.

q SS_METAPICT – Определяет, что изображение метафайла должно отобразиться в статическом элементе управления. Данный текст - имя изображения метафайла (не имя файла) определенный в другом месте в файле ресурса. Статический элемент управления метафайла имеет фиксированный размер; изображение метафайла масштабируется, чтобы приспособить рабочую область статического элемента управления.

q SS_NOPREFIX – Предотвращает интерпретацию любого символа амперсанта (&) в тексте элемента управления как символа префикса акселератора. Они отображаются с удаленным амперсантом и следующим за ним подчеркнутым символом в строке. Этот стиль статического элемента управления может быть включен с любым из определенных статических элементов управления. Прикладная программа может объединять SS_NOPREFIX с другими стилями, используя поразрядный оператор OR = ИЛИ (|). Это может быть полезно, когда имена файлов или другие строки, которые могут содержать амперсанд (&) должны отображаться в статическом элементе управления диалогового окна.

q SS_NOTIFY – Посылает родительскому окну уведомительные сообщения STN_CLICKED и STN_DBLCLK, когда пользователь щелкает или дважды щелкает мышью по элементу управления.

q SS_RIGHT – Определяет простой прямоугольник и выравнивает по правому краю текста помещенный в прямоугольнике. Текст форматируется перед его отображением на экране. Слова, которые выходят за пределы конца строки автоматически переносятся в начало следующей выровненной по правой границе строки.

q SS_RIGHTIMAGE - Определяет, что угол правой нижней части статического элемента управления со стилем SS_BITMAP или SS_ICON должен остаться фиксированным, когда элемент управления изменяется. Только верхняя и левая стороны корректируются, чтобы поместить новый точечный рисунок или пиктограмму.

q SS_SIMPLE – Определяет простой прямоугольник и отображает одиночную строку выровненного по левой границе текста в прямоугольнике.
Текстовая строка не может быть, сокращена или изменена в любом случае. Родительское окно панели управления или диалоговое окно не должны обрабатывать сообщение WM_CTLCOLORSTATIC.

q SS_WHITEFRAME – Определяет поле окна с рамкой, выведенной тем же самым цветом как фон окна. По умолчанию, в системе цветов Windows - этот цвет белый.

q SS_WHITERECT – Определяет прямоугольник, заполненный текущим цветом фона окна. По умолчанию, в системе цветов Windows – этот цвет белый.

 

Ниже перечислены стили диалогового окна, которые могут быть определены в параметре dwStyle:

q DS_3DLOOK - Обеспечивает диалоговое окно не полужирным шрифтом и выводит трехмерные рамки вокруг элементов управления окна в блоке диалога.

q DS_3DLOOK – Этот стиль требуется только базирующимся на Win 32 прикладным программам, компилируемым для версий Windows ранее, чем Windows 95 или Windows NT 4.0. Система автоматически применяет трехмерный вид к диалоговым окнам, созданным прикладными программами, компилируемыми для текущих версий Windows.

q DS_ABSALIGN – Указывает, что координаты диалогового окна – экранные координаты; иначе, Windows принимает их за координаты пользователя.

q DS_CENTER – Выравнивает по центру диалоговое окно в рабочей области; то есть в области, не загораживаемой панелью.

q DS_CENTERMOUSE – Выравнивает по центру курсор мыши в диалоговом окне.

q DS_CONTEXTHELP – Включает вопросительный знак в строке заголовка диалогового окна. Когда пользователь щелкает мышью по вопросительному знаку, курсор изменятся на вопросительный знак со стрелкой-указателем. Если пользователь затем щелкает мышью по элементу управления в диалоговом окне, элемент управления принимает сообщение WM_HELP. Элемент управления должен передать сообщение для диалоговой процедуры, которая должна вызвать функцию WinHelp, использующую команду HELP_WM_HELP. Прикладная программа Справка (Help) отображает выскакивающее окно, которое обычно содержит справку об элементе управления. Обратите внимание, что DS_CONTEXTHELP – только метка-заполнитель. Когда диалоговое окно создано, система проверяет наличие DS_CONTEXTHELP и, если она имеется, добавляет WS_EX_CONTEXTHELP к расширенному стилю диалогового окна. WS_EX_CONTEXTHELP не может использоваться со стилями WS_MAXIMIZEBOX или WS_MINIMIZEBOX.

q DS_CONTROL – Создает диалоговое окно, которое работает также как дочернее окно другого диалогового окна, очень похожее на страницу в окне свойств. Этот стиль позволяет пользователю перемещаться среди элементов управления дочернего диалогового окна, использовать его клавиши-ускорители, и так далее.

q DS_FIXEDSYS – Использует SYSTEM_FIXED_FONT вместо SYSTEM_FONT.

q DS_LOCALEDIT – Применяется только для 16-разрядных прикладных программ. Этот стиль управляет элементами редактирования в диалоговом окне, чтобы зарезервировать память в сегменте данных прикладной программы. Иначе, элементы редактирования резервируют память объекта глобальной памяти.

q DS_MODALFRAME – Создает диалоговое окно с модальной рамкой диалогового окна, которая может быть объединена со строкой заголовка и меню окна, путем определения стилей WS_CAPTION и WS_SYSMENU.

q DS_NOFAILCREATE – Создает диалоговое окно, даже если происходят ошибки - например, если дочернее окно не может быть создано или если система не может создать специальный сегмент данных для элементов редактирования.

q DS_NOIDLEMSG – Подавляет сообщения WM_ENTERIDLE, которое Windows иначе послал бы владельцу диалогового окна, в то время как диалоговое окно отображается на экране.

q DS_RECURSE – Стиль диалогового окна подобно элементу управления диалоговых окон.

q DS_SETFONT – Указывает, что шаблон диалогового окна (структура DLGTEMPLATE) содержит два дополнительных элемента, определяющих имя шрифта и размер в пунктах. Соответствующий шрифт используется, чтобы отображать текст внутри рабочей области диалогового окна и внутри элементов управления диалогового окна. Windows передает дескриптор шрифта диалоговому окну и каждому элементу управления, посылая им сообщение WM_SETFONT.

q DS_SETFOREGROUND – Не применяется в16-разрядных версиях Microsoft Windows. Этот стиль приводит диалоговое окно в активный режим. Внутри Windows вызывает для диалогового окна функцию SetForegroundWindow.

q DS_SYSMODAL – Создает системно-модальное диалоговое окно. Этот стиль заставляет диалоговое окно иметь стиль WS_EX_TOPMOST, но в остальном, он не имеет никакого влияния на диалоговое окно или поведение других окон в системе, когда отображается диалоговое окно.

 

Функция ShowWindow устанавливает режим отображения окна:

BOOL ShowWindow (

HWND hWnd, // указатель на окно

int CmdShow); // режим

Функция UpdateWindow обновляет указанное окно, посылая ему сообщение WM_PAINT. Это сообщение посылается непосредственно процедуре указанного окна, обходя очередь других сообщений.

BOOL UpdateWindow (HWND Wnd); // указатель на окно

 

Функция DestroyWindow уничтожает определенное окно. Функция посылает сообщения WM_DESTROY и WM_NCDESTROY окну, чтобы дезактивировать его и удалить фокус клавиатуры. Функция также уничтожает меню окна, очищает очередь потоков сообщений, уничтожает таймеры, удаляет монопольное использование буфера обмена и разрывает цепочку просмотра окон буфера обмена (если окно имеет наверху цепочку просмотров). Если определенное окно – родитель или владелец окон, DestroyWindow автоматически уничтожает связанные дочерние или находящиеся в собственности окна, когда она уничтожает окно владельца или родителя. Функция сначала уничтожает дочерние или находящиеся в собственности окна, и затем она уничтожает окно владельца или родителя.

BOOL DestroyWindow (HWND hWnd);  

// дескриптор для уничтожения окна

 

С набором сообщений работает несколько функций Win 32 API.
Сообщения ставятся в очередь асинхронных сообщений при помощи функции

BOOL PostMessage (

HWND Window,    // дескриптор окна

UINT Message, // передаваемое сообщение

WPARAM Parametr,

LPARAM Par);

При вызове этой функции определяется поток, создавший окно с дескриптором Window. Далее выделяется память для параметров сообщения и производится добавление в очередь асинхронных сообщений. Возврат из этой функции происходит немедленно, и вероятно, что окно даже не получит данное сообщение. Кстати, упомянутая выше функция PostQuitMessage тоже добавляет сообщение в очередь асинхронных сообщений потока.

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

BOOL SendMessage (

HWND Window, // дескриптор окна

UINT Message, // передаваемое сообщение

WPARAM Parametr,

LPARAM Par);

 

Оконная процедура обработает сообщение Message, и только после этого вернет управление. Пока сообщение не обработано, поток находится в состоянии ожидания. Поток, обрабатывающий синхронное сообщение, может содержать бесконечный цикл, тогда поток-отправитель со спокойной совестью может «зависнуть». Избежать таких ситуаций можно при помощи
нескольких функций WinAPI. Одна из них ожидает в течение некоторого времени ответа от другого потока.

 

BOOL SendMessageTimeout (

HWND Window, // дескриптор окна

UINT Message, // передаваемое сообщение

WPARAM Parametr,

LPARAM Par,

UINT Flags, // флаги

UINT Timeout, // время ожидания ответа, в миллисекундах

PDWORD_PTR Result); // возвращаемое значение оконной процедуры

 

В параметре Flags указываются флаги: SMTO_NORMAL, SMTO_ABORTIFHUNG (если поток завис, вернуть управление), SMTO_NOTIMEOUTIFNOTHUNG (если поток не завис, игнорировать ограничение по времени), SMTO_SMTO_BLOCK (не обрабатывать другие синхронные сообщения, пока функция не вернет управление). Последний флаг, однако, может «помочь» потокам перейти в состояние взаимной блокировки.

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

BOOL SendMessageCallback (

HWND Window,          // дескриптор окна

UINT Message,         // передаваемое сообщение

WPARAM Parametr,

LPARAM Par,

SENDASYNCPROC PrcResCallBack, // асинхронная процедура

ULONG_PTR Data); // данные для передачи оконной процедуре

 

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

VOID CALLBACK ResCallBack (

HWND Window,   // дескриптор окна

UINT Message,  // передаваемое сообщение

ULONG_PTR Data, // данные для передачи оконной процедуре

LRESULT Res);          

// результат обработки сообщения от оконной процедуры

 

Адрес этой функции передается в параметре PrcResCallBack функции SendMessageCallback. При вызове ResCallBack ей передается одноименный параметр Data из SendMessageCallback. Параметр Res содержит результат обработки сообщения от оконной процедуры.

Еще одна функция Win 32 API, предназначенная для обмена сообщениями между потоками:

 

BOOL SendNotifyMessage (

HWND Window,          // дескриптор окна

UINT Message,         // передаваемое сообщение

WPARAM Parametr,

LPARAM Par);

 

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

Если же посылается сообщение тому окну, которое создано потоком-отправителем, то управление не возвращается до окончания обработки сообщения, что очень похоже на поведение функции SendMessage.

Вообще, большинство синхронных сообщений посылается окну просто для уведомления об изменении состояния, чтобы оно отреагировало перед продолжением работы. Например, таковым является сообщение WM_DESTROY. Система не прерывает работу, чтобы процедура окна могла его обработать, тогда как сообщение WM_CREATE вызывает перерыв до окончания его обработки.

Четвертая функция Win API, связанная с обработкой сообщений,
достойная упоминания

BOOL ReplyMessage (LRESULT Res);

 

Эта функция вызывается потоком, принимающим оконное сообщение. Ответ (результат обработки) асинхронно помещается в очередь ответных сообщений потока-отправителя, а тот может теперь получить результат с помощью параметра Res и продолжить свою работу. Функция возвращает TRUE, если обрабатывается межпоточное сообщение, а FALSE используется для внутрипоточных сообщений. Для того чтобы узнать является ли сообщение меж- или внутрипоточным, можно вызвать функцию

BOOL InSendMessage (LRESULT Res);

 

Возвращаемое значение: TRUE, если обрабатывается межпоточное синхронное сообщение, и FALSE при обработке синхронного и асинхронного внутрипоточного сообщения.

Некоторые из функций, предназначенных для посылки и приема сообщений, были описаны в одной из более ранних частей нашего курса, поэтому повторяться мы не будем. Здесь мы перечислим некоторые сообщения, которые могут посылаться окну, в дополнение тем, что давались выше:

· WM_MOUSEMOVE – посылается окну, когда курсор меняет свою позицию. При этом в процедуре обработки сообщений надо обязательно учитывать, что ее "первый" (если быть более точным, то третий) параметр Parametr будет содержать флаги виртуальных клавиш, а "второй" (четвертый, Prm) – координаты курсора. Для их получения надо воспользоваться макросом MAKEPOINTS.

· WM_NCMOUSEMOVE – посылается окну, когда курсор перемещается над неклиентской областью окна. Параметры обозначают координаты курсора и так называемые hit-test значения, они будут описаны ниже.

· WM_NCHITTEST – посылается окну, когда перемещается курсор мыши или нажимается/освобождается кнопка мыши. Параметры: координаты курсора. Возвращает hit-test значения.

· WM_NCLBUTTONUP – посылается окну, когда пользователь отжимает левую кнопку мыши, ее курсор находится над неклиентской областью окна. Параметры: hit-test значение и позиция курсора.

· WM_NCLBUTTONDOWN – посылается окну, когда пользователь нажимает левую кнопку мыши, ее курсор находится над неклиентской областью окна. Параметры: hit-test значение и позиция курсора.

· WM_NCRBUTTONUP и WM_NCRBUTTONDOWN аналогичны двум предыдущим, только "работают" с правой кнопкой мыши.

· WM_NCHITTEST посылется окну, когда перемещается курсор мыши или нажимается/отжимается одна из ее кнопок. Параметры - координаты курсора.

 

Hit-test значения демонстрируют, в каком месте окна находится курсор:

· HTBORDER            На границе окна

· HTBOTTOM           На нижней горизонтальной границе окна

· HTBOTTOMLEFT В левом нижнем углу границы окна

· HTBOTTOMRIGHT В правом нижнем углу границы окна

· HTCAPTION           На заголоке окна

· HTCLIENT              На клиентской области окна

· HTERROR    Фон экрана или разделительная линия между двумя окнами

· HTGROWBOX        В области изменения размеров окна

· HTHSCROLL          На горизонтальной полосе прокрутки

· HTLEFT                  На левой границе окна

· HTMENU                В меню

· HTNOWHERE   Фон экрана или разделительная линия между двумя окнами

· HTREDUCE            На кнопке "Свернуть"

· HTRIGHT                На правой границе окна

· HTSIZE                   В области изменения размеров окна

· HTSYSMENU В системном меню или на кнопке закрытия дочернего окна

· HTTOP                    На верхней горизонтальной границе окна

· HTTOPLEFT          В левом верхнем углу границы окна

· HTTOPRIGHT        В правом верхнем углу границы окна

· HTTRANSPARENT На окне в данный момент перекрытым другим окном

· HTVSCROLL          На вертикальной полосе прокрутки

· HTZOOM                На кнопке "Развернуть"

 

При своем запуске система создает особый поток необработанного ввода и системную очередь аппаратного ввода. Поток ввода бездействует, пока в очереди нет ни одного элемента. Когда пользователь нажимает кнопку мыши или перемещает курсор, либо давит на клавишу, драйвер устройства добавляет аппаратное событие в системную очередь. Поток необработанного ввода активизируется, извлекает из очереди элемент и преобразует его в сообщение, в затем ставит в хвост очереди виртуального ввода конкретного потока. После этого поток ввода ждет появления следующего элемента в системной очереди. Именно системный поток необработанного ввода отвечает за обработку в ОС Windows особых комбинаций клавиш: Ctrl + Alt + Del, Alt + Esc, Alt + Tab. Ни один из других потоков не в состоянии перехватить эти клавиши.

Помимо виртуального ввода потока в ОС Windows поддерживается также концепция локального состояния ввода потока, под которой понимается: для мыши – окно, захватившее мышь, форма курсора мыши, видимость курсора; для клавиатуры – нажатые клавиши, активное окно, окно в фокусе клавиатуры, состояние курсора.

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

BOOL SetForegroundWindow (HWND Window);

 

Для получения дескриптора окна, находящегося на переднем плане используется следующая функция.

HWND GetForegroundWindow ();

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

BOOL AttachThreadInput (

DWORD AttachId,

// идентификатор потока, чья очередь не нужна

DWORD AttachToId,

// идентификатор потока, чья очередь будет использоваться

BOOL Attach);

// начать совместное использование или прекратить

 

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

 

HWND win1;

 

DWORD CurrThread, WinThread;

CurrThread = GetCurrentThreadId ();

WinThread = GetWindowThreadProcesId (GetForegroundWindow (),

                                NULL);

AttachThreadInput (CurrThread, TRUE);

...

SetForegroundWindow (win1);

 

       Следующая функция позволяет получить экранные координаты
указанного окна.

BOOL GetWindowRect (

HWND Wnd, // идентификатор окна

LPRECT Rect); // адрес структуры с координатами окна

 

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

BOOL GetClientRect (

HWND Wnd, // идентификатор окна

LPRECT Rect); // адрес структуры с координатами окна

 

       Структура RECT определяет коодинаты левой верхней и правой нижней точек прямоугольника.

typedef struct _RECT {

LONG left;

LONG top;

LONG right;

LONG bottom;

} RECT;

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

BOOL PtInRect(

CONST RECT *Rect, // адрес структуры-прямоугольника

POINT aPoint); // структура с точкой

 

           

Структура с точкой определена как

typedef struct tagPOINT {

LONG x;

LONG y;

} POINT;

 

       Экранные координаты преобразуются в клиентские функцией

BOOL ScreenToClient

HWND Wnd, // окно с исходными координатами

LPPOINT Point); // адрес структуры содержащей, координаты

 

       Для того чтобы получить экранные координаты курсора мыши необходимо вызывать функцию

BOOL GetCursorPos (LPPOINT aPoint);  

   // адрес структуры с координатами курсора

 

       Существует и парная ей функция, которая устанавливает курсор в заданную позицию.

BOOL SetCursorPos(

int XPos, // горизонтальная позиция

int YPos); // вертикальная позиция

 

       Изменение некоторых параметров окна производится функцией.

BOOL MoveWindow(

HWND Wnd, // Описатель окна

int Hor, // горизонтальная координата новой позиции окна

int Vert, // вертикальная координата новой позиции окна

int Width, // новая ширина

int Height, // новая высота

BOOL Repaint);

       // Определяет, будет ли окно перерисовываться (TRUE)

           

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

BOOL GetScrollInfo(

HWND Wnd, // описатель окна с полосой прокрутки

int Bar, // тип полосы прокрутки (SB_HORZ -горизонтальная,

          // SB_VERT -вертикальная)

LPSCROLLINFO ScrollInfo); 

         // указатель на структуру с параметрами скроллинга

 

int SetScrollInfo(

HWND Wnd, // описатель окна

int fnBar, //тип полосы прокрутки (SB_HORZ -горизонтальная,

          // SB_VERT -вертикальная)

LPSCROLLINFO ScrollInfo,  

         // указатель на структуру с параметрами скроллинга

BOOL fRedraw); // флаг перерисовки (TRUE - перерисисовывать)

  

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

int ScrollWindowEx(

HWND Wnd, // описатель окна

int dx, // горизонтальная величина скроллинга.

           //Отрицательная – «крутить» влево

int dy, // вертикальная величина скроллинга.

           // Отрицательная – «крутить» вверх

CONST RECT *Scroll,//структуры с прямоугольником прокрутки,

           // TRUE - прокручивать все

CONST RECT *Clip,  

           // адрес структуры с прямоугольником-клипом

HRGN RegionUpdate, // обычно NULL

LPRECT Update, // обычно NULL

UINT flags); // параметры прокрутки, обычно SW_ERASE

 

       Еще одна группа функций позволяет направлять и сбрасывать "мышиные" сообщения, связанные с конкретными окнами.

// Установка захвата сообщений

HWND SetCapture(HWND hWnd); // описатель окна

HWND GetCapture(VOID)

// получение идентификатора окна, перехватывающего сообщения

BOOL ReleaseCapture(VOID)

// сброс перехвата сообщений

 
















Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: