Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
83
Добавлен:
10.12.2013
Размер:
1.15 Mб
Скачать

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

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

BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)

{

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);

return TRUE;

}

Функция 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_DESTROY, в ответ на которое функция 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)

}

Порядок выполнения работы

1.Создаем новый пустой проект Win32 Application

2.Добавляем в него файл исходного кода. В этом файле:

- записываем функцию 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 будет выглядеть так:

Соседние файлы в папке Лабы_длстудентов