Пример создания главного окна
HWND hWnd;
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPENWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(!hWnd)return FALSE;
ShowWindow(hWnd,nCmdShow) ;
UpdateWindow(hWnd);
Функция ShowWindow() отображает окно на экране. Окно отображается как набор атрибутов, таких как заголовок, рамка, кнопки и т.д. Первый аргумент этой функции- handle создаваемого окна, второй – определяет, в каком виде окно будет отображаться на экране. В нашем примере мы просто взяли и подставили значение nCmdShow, указанное при вызове функции WinMain(). Как правило, функции WinMain() передается значении SW_SHOWDEFAULT.
Функция UpdateWindow() посылает функции окна сообщение WM_PAINT, которое заставляет окно перерисовываться, т.е. прорисовывать не набор атрибутов, за прорисовку которых отвечает Windows, а изображение в рабочей области окна, за что должна отвечать непосредственно программа.
Цикл обработки сообщений
Простейший цикл обработки сообщений выглядит следующим образом:
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg)
}
Из очереди приложения сообщение выбирается функцией GetMessage().
Первый ее параметр( &msg)-указатель на структуру типа MSG, т.е. на сообщение.
Второй параметр – handle окна, созданного программой. Сообщение, адресованное только этому окну будет выбираться функцией GetMessage и передаваться оконной функции. Если вы хотите, чтобы обрабатывались сообщения для всех созданных программой окон, установите этот параметр в NULL.
Третий и четвертый параметры позволяют передавать оконной функции не все сообщения , а только те, номера которых попадают в определенный интервал.
Функция TranslateMessage() преобразует некоторые сообщения в более удобный для обработки вид.
Функция DispatchMessage() передает сообщение оконной функции.
Завершение цикла обработки сообщений происходит при выборке из очереди сообщения WM_QUIT, в ответ на которое функция GetMessage() возвращает нулевое значение.
Пример функции WinMain()
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstanse);
if(!InitInstance(hInstance,nCmdShow)) return FALSE;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg)
}
return msg.wParam;
}
В этом примере для регистрации класса окна и инициализации приложения написаны отдельные функции, что упрощает программу.
Создание оконной функции
Общая структура оконной функции следующая:
/*заголовок*/
LRESULT CALLBACK WndProc(
HWND hwnd, UINT message,
WPARAM wParam,
LPARAM lParam)
{
/* переключатель switch для обработки различных сообщений */
/* необработанные ранее сообщения обрабатываются системой по умолчанию*/
return DefWindowProc(hwnd,message,wParam,lParam)
}
Оператор switch может иметь следующую структуру
switch (message){
case WM_DESTROY:
// действия при уничтожении объекта окна
break;
case WM_LBUTTONUP:
// действия при нажатии левой кнопки мыши
break;
case WM_RBUTTONUP:
// действия при нажатии правой кнопки мыши
break;
case WM_CLOSE:
// действия при закрытии окна
break;
default: // обработка событий по умолчанию
return DefWindowProc(hwnd, message, wparam, lparam);
}
Порядок выполнения работы
1.Создаем новый пустой проект Win32 :
2.Добавляем в него файл исходного кода(C++ Source File). В этом файле:
- записываем функцию WinMain, в котором создается окно с рамкой и заголовком (заголовок- Ваша фамилия и группа)
-записываем оконную функцию
3. В оконной функции будем обрабатывать событие WM_DESTROY, реакцией на которое будет вызов API функции PostQuitMessage(0).
Функция PostQuitMessage( ) помещает в очередь сообщение WM_QUIT. После получения этого сообщения приложение заканчивает работу.
4. Заставим программу обращать внимание на какие-нибудь наши действия. Например, на щелчок левой кнопки мыши.
Для этого мы в нашу оконную процедуру должны вставить обработчик для сообщения WM_LBUTTONUP. Например, такой:
SetWindowText(hwnd, "New title");
З десь мы вызываем API-функцию SetWindowText. Она меняет заголовок окна. У этой функции два параметра. Первый указывает на то, для какого окна мы будем это делать. Второй - что за новый заголовок мы установим. После запуска программы результат будет таким:
5.Развиваем наше приложение дальше. Сделаем так, чтобы при закрытии приложения появлялся MessageBox с двумя кнопками - OK и Cancel. И если пользователь выберет OK, то наше окно закрывается, а если Cancel, то не закрывается. Для этого добавим обработчик для сообщения WM_CLOSE. Функция MessageBox возвращает значение, соответствующее нажатой пользователем кнопки. Мы проверяем, не нажал ли пользователь кнопку OK (IDOK==MessageBox(...)), и если это так, то посылаем сами себе сообщение для уничтожения окна:
SendMessage(hwnd, WM_DESTROY, NULL, NULL);
Здесь IDOK- идентификатор кнопки ОК, возвращаемый функцией MessageBox, если пользователь нажал эту кнопку.
6 .Запускаем приложение. При его закрытии должен появиться следующий MessageBox:
API-функция MessageBox имеет несколько параметров. Первый - handle окна, которому принадлежит MessageBox. Второй параметр - это надпись в MessageBox, третий - заголовок. Последний параметр определяет внешний вид MessageBox. Так, константа MB_OKCANCEL говорит о том, что у него будет две кнопки - OK и Cancel.
7. Изменим MessageBox так, чтобы появился предупреждающий значок, и чтобы была активна вторая кнопка. Для этого изменим последний параметр функции:
Т еперь наш MessageBox будет выглядеть так:
Выполните контрольные задания.