Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная 1.docx
Скачиваний:
1
Добавлен:
10.07.2019
Размер:
253.08 Кб
Скачать

Пример создания главного окна

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 будет выглядеть так:

  1. Выполните контрольные задания.