- •Лекции 2- 3
- •Библиотека Win32
- •Структура окна
- •В библиотеке Win32 API содержится описание довольно большого количества типов данных, большинство из
- •Библиотека Win32
- •Архитектура,
- •Сообщение - это структура данных, содержащая следующие элементы:
- •Сообщения от внешних источников, например от клавиатуры, адресуются в каждый конкретный момент времени
- •Каркас Win32
- •Параметры функции WinMain:
- •НАЧАЛО
- •Для описания класса окна необходимо заполнить структуру типа WNDCLASSEX или WNDCLASS (старый вариант).
- •После заполнения всех полей данной структуры класса окна необходимо зарегистрировать с помощью функции
- •После успешной регистрации класса окна необходимо создать само окно. Это осуществляется с помощью
- •В случае успешного выполнения функция CreateWindow возвращает дескриптор созданного окна. В случае ошибки
- •После того, как окно успешно создано, его необходимо отобразить используя функции ShowWindow и
- •После создания и отображения окна необходимо организовать цикл получения и обработки сообщений. Для
- •Функция получения сообщения BOOL GetMessage(
- •Функция преобразования сообщения виртуальных клавиш в символьные сообщения
- •Функция обработки сообщения
- •Типовая функция
- •Функция-обработчик
- •Типовой алгоритм
- •Дополнительные
- •Функция перемещения окна
- •Вывод окна на передний план и передача ему управления:
- •Функция получения параметров окна:
- •Окно сообщения
- •Флаг
- •MB_APPLMODAL
- •Пример
- •Начало программы: подключения библиотек, объявление глобальных переменных и
- •Функция регистрации класса родительского окна
- •Функция регистрации класса дочернего окна
- •Функция WinMain
- •Функция обработки сообщений
- •Функция обработки сообщений дочернего окна
- •Передача
- •Пример
- •Текст программы
- •Некоторые функции приема или передачи сообщения
- •Функция передачи данных параметра сообщения (wParam и
- •Функция обработки сообщений по умолчанию. LRESULT DefWindowProc(
- •Функция завершения сеанса работы пользователя: BOOL ExitWindows(DWORD dwReserved, UINT uReserved);
- •Функция получения позиций курсора последнего выбранного сообщения:
- •Функция проверки наличия сообщения в очереди сообщений: BOOL GetMessage(
- •Функция передачи сообщения завершения приложения:
- •Следующая
Текст программы
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwnd = FindWindow("ParentWindowClass", "Main window"); if(!hwnd){
MessageBox(0,“Приложение не запущено!", "Сообщение", MB_OK); return 0;
}
if (MessageBox(0,"Приложение найдено! Закрыть его?", "Сообщение", MB_YESNO) == IDYES)
{
PostMessage(hwnd,WM_DESTROY,0,0);
}
return 0;
}
Некоторые функции приема или передачи сообщения
Отправка сообщений нескольким получателям: LONG BroadcastSystemMessage(
DWORD dwFlags, |
//Флаги режима оправки сообщения |
LPDWORD lpdwRecipients, //Информация об адресатах |
|
UINT uMsg, |
//Код сообщения |
WPARAM wParam, |
//Первый параметр сообщения |
LPARAM lParam |
//Второй параметр сообщения |
); |
|
Некоторые значения dwFlag:
BSF_FLUSHDISK – выводить буфера на диск после обработки сообщения каждым получателем,
BSF_IGNORECURRENTTASK – не посылать сообщения окнам, принадлежащим текущей задаче
BSF_POSTMESSAGE – выставить сообщение и не дожидаться ответа,
BSF_QUERY – посылать сообщение одному получателю, отправляя его следующему получателю, только если текущий получатель возвратит TRUE.
Некоторые значения dwRecipients:
BSM_ALLCOMPONENTS – посылать сообщение всем компонентам,
BSM_ALLDESKTOPS – посылать сообщение адресованное всем рабочим столам,
BSM_APPLICATIONS – посылать сообщение всем приложениям.
Функция передачи данных параметра сообщения (wParam и |
||
т.д.) первоначальной процедуре обработки сообщения для |
||
нормальной обработки. |
||
LRESULT CallWindowProc( |
||
WNDPROC wndprcPrev, //Указатель на предыдущую процедуру |
||
HWND hWnd, |
//Дескриптор окна, получающего сообщение |
|
UINT uMsg, |
//Код сообщения |
|
WPARAM wParam, |
//Первый параметр сообщения |
|
LPARAM lParam |
|
//Второй параметр сообщения |
); |
|
|
Используется во время подклассов оконных элементов управления: BUTTON, SCROLLBAR и т.д. Данная функция используется в конце процедуры обработки сообщения, для передачи сообщения на обработку, предусмотренную по умолчанию.
Функция обработки сообщений по умолчанию. LRESULT DefWindowProc(
HWND hWnd, |
//Дескриптор окна, получающего |
//сообщение |
|
UINT uMsg, |
//Код сообщения |
WPARAM wParam, |
//Первый параметр сообщения |
LPARAM lParam |
//Второй параметр сообщения |
); |
|
Используется обработки всех сообщений, которые не обрабатываются основной функцией приложения (WndProc)
Функция завершения сеанса работы пользователя: BOOL ExitWindows(DWORD dwReserved, UINT uReserved);
Функция закрывает все приложения пользователя и завершает сеанс работы. Пользователю отображается окно входа в систему.
Параметры функции не используются и должны быть равны 0.
Функция завершения работы системы:
BOOL ExitWindowsEx(UINT uOptions, DWORD dwReserved);
Значения uOptions:
EWX_FORCE – завершить процессы, которые не отвечают на сообщения,
EWX_FORCEIFHUNG – завершить процессы, которые не отвечают на сообщения WM_QUERYENDSESSIN или WM_ENDSESSIN.
EWX_LOGOFF – остановить все приложения текущего пользователя и завершить сеанс работы,
EWX_POWEROFF – остановить систему и выключить питание,
EWX_REBOOT – остановить, а затем перезапустить систему.
EWX_SHUTDOWN – остановить систему, чтобы можно было безопасно выключить питание.
Для выполнения последних трех действий приложение должно иметь привилегию SE_SHUTDOWN_NAME
Функция получения позиций курсора последнего выбранного сообщения:
DWORD GetMessagePos();
В младшем слове содержится координата x, а в старшем слове – координата y.
Функция получения времени размещения сообщения в очереди сообщений (в миллисекундах с момента начала работы Windows):
LONG GetMessageTime();
Функция проверки наличия сообщения в очереди сообщений: BOOL GetMessage(
LPMSG lpMsg, //Указатель на структуру MSG HWND hWnd, //Дескриптор окна
UINT uMsgFilterMin, //Минимальный номер отслеживаемых сообщений UINT uMsgFilterMax, //Максимальный номер отслеживаемых сообщений
UINT uRemoveMsg //Признак необходимости удаления сообщения из //очереди
);
Значения uRemoveMsg:
PM_NOREMOVE – сообщение остается в очереди сообщений
PM_REMOVE – сообщение удаляется из очереди сообщений
PM_QS_INPUT – обрабатывать только сообщения мыши и клавиатуры
PM_QS_PAINT - обрабатывать только сообщения касающиеся вывода на экран
PM_QS_POSTMESSAGE - обрабатывать все выставляемые сообщения, в том числе от таймеров и вызывающих клавиш
PM_QS_SENDMESSAGE – обрабатывать все отправленные сообщения.
Функция передачи сообщения завершения приложения:
void PostQuitMessage(int iExitCode);
Выставляет сообщение WM_QUIT. В параметре передается код завершения приложения.
Следующая
тема:
Элементы
управления
окна