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

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

Простейший вариант цикла обработки сообщений выглядит так:

MSG msg;

while (GetMessage (&msg, 0, 0, 0) )

{

DispatchMessage (&msg);

}

Функция GetMessage служит для приема сообщений msg (message) из очереди сообщений. Функция DispatchMessage распределяет сообщения между окнами приложения. Этих окон может быть много.

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

    1. Создание простейшего приложения FirsApp.

Окно приложения, которое нам необходимо создать, показано на рис. 2.1. Это приложение имеет простейшее меню, его окно можно свернуть или распахнуть, используя курсор мыши можно изменять размеры окна. Создание такого приложения, с использованием AppWizard, ничуть не сложнее создания простейшего консольного приложения.

      1. Создание каркаса приложения

    1. Запустите среду Microsoft Visual Studio 2008.

    2. Выполните команду File|New|Project

    3. В диалоговом окне New Project укажите тип проекта. Для этого откройте контейнер Visual C++ и выберите проект Win32. В окне шаблонов (Templates) уточните тип проекта, указав Win32 Project.

    4. В окне Name введите имя проекта: FirsApp.

    5. В окне Location, укажите путь, по которому вы хотите сохранить проект. Можно снять флажек Create Directory for Solution.

    6. Нажмите кнопку OK.

    7. В появившемся окне Win 32 Application Wizard - FirstApp нажмите кнопку Next

    8. На вкладке Application Settings выберите тип приложения: Windows Application.

    9. Нажмите кнопку Finish.

    10. Нажмите кнопку OK.

AppWizard сгенерирует все необходимые файлы для простейшего приложения API, главный из которых – это файл FirstApp.cpp. С этим файлом мы сейчас познакомимся.

Листинг 2.1. Файл FirstApp.cpp

#include "stdafx.h"

#include "FirstApp.h"

#define MAX_LOADSTRING 100 // Максимальная длинна строки символов

// Глобальные переменные:

HINSTANCE hInst; // текущий идентификатор приложения

TCHAR szTitle[MAX_LOADSTRING]; // заголовок окна

TCHAR szWindowClass[MAX_LOADSTRING];// имя класса окна

////////////////////////////////////////////////////////////////////////////////////////

// Прототипы функций.

// Регистрирует класс окна

ATOM MyRegisterClass(HINSTANCE hInstance);

// Cохраняет дескриптор окна и создает главное окно

BOOL InitInstance(HINSTANCE, int);

// Обрабатывает сообщения

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// Создает диалоговое окно About

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

////////////////////////////////////////////////////////////////////////////////////////

//

// Главная функция приложения FirsApp

//

int APIENTRY _tWinMain(HINSTANCE hInstance, // дескриптор приложения

HINSTANCE hPrevInstance, // дескриптор предыдущей копии

LPTSTR lpCmdLine, // строка параметров

int nCmdShow) // способ отображения окна

{

// Следующие два оператора служат для того, чтобы

// не появлялись предупреждения о неиспользовании

// переменых hPrevInstance и lpCmdLine

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: Place code here.

MSG msg; // структура для хранения сообщений

HACCEL hAccelTable; // дескриптор таблицы акселераторов

// Инициализация глобальных строк

// Загружаем из ресурсного файла строку с идентификатором IDS_APP_TITLE

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

// Загружаем из ресурсного файла строку с идентификатором IDC_FIRSTAPP

LoadString(hInstance, IDC_FIRSTAPP, szWindowClass, MAX_LOADSTRING);

// Регистрация класса окна

MyRegisterClass(hInstance);

// Инициализация приложения:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

// Получаем указатель на таблицу акселераторов с идентификатором IDC_FIRSTAPP

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_FIRSTAPP));

// Главный цикл обработки сообщений:

while (GetMessage(&msg, NULL, 0, 0))

{

// Учет таблицы акселераторов

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

/*

// Главный цикл обработки сообщений без учета

// таблицы акселераторов:

while(GetMessage(&msg, NULL, 0, 0))

{

DispatchMessage(&msg);

}

*/

return (int) msg.wParam;

}

////////////////////////////////////////////////////////////////////////////////////////

//

// FUNCTION: MyRegisterClass()

//

// НАЗНАЧЕНИЕ: Регистрирует класс окна.

//

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex; // структура для регистрации класса окна

// Размер структуры в байтах

wcex.cbSize = sizeof(WNDCLASSEX);

// Стиль окна. Внутреняя область окна должна быть перерисованна

// как при изменении ширины (CS_HREDRAW), так и при изменении

// высоты (CS_VREDRAW) окна.Здесь возможно добавление большого

// количества дополнительных стилей. См. Help.

wcex.style = CS_HREDRAW | CS_VREDRAW;

// Указатель на функцию окна, обрабатывающую сообщения,

// предназначенную для всех окон, созданных на основе

// данного класса.

wcex.lpfnWndProc = WndProc;

// Дополнительные параметры

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

// Идентификатор приложения, которое создало данный класс

wcex.hInstance = hInstance;

// Идентификатор больших пиктограмм

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_FIRSTAPP));

// Идентификатор курсора, используемого для окна данного класса

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

// Цвет фона окна

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

// Идентификатор меню

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_FIRSTAPP);

// Имя, которое присваивается создаваемому классу и

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

wcex.lpszClassName = szWindowClass;

// Идентификатор маленьких пиктограмм

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

// Регистрация класса

return RegisterClassEx(&wcex);

}

////////////////////////////////////////////////////////////////////////////////////////

//

// ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

// НАЗНАЧЕНИЕ: Cохраняем дескриптор окна и создаем главное окно

//

// КОММЕНТАРИЙ:

// В этой функции, мы сохраняем дескриптор окна в глобальной переменной,

// создаем и отображаем главное окно программы.

//

BOOL InitInstance(

HINSTANCE hInstance, // идентификатор приложения

int nCmdShow) // способ отображения окна

{

HWND hWnd; // дескриптор окна приложения

// Инициализация глобального идентификатора приложения

hInst = hInstance;

// Создаем главное окно приложения

hWnd = CreateWindow(

szWindowClass, // имя класса окна

szTitle, // заголовок окна

WS_OVERLAPPEDWINDOW, // стиль окна (перекрывающееся)

CW_USEDEFAULT, 0, // задаем размеры и расположение

CW_USEDEFAULT, 0, // окна, принятые по умолчанию

//300, 20, // верхний левый угол

//200, 400, // размер окна (cx, cy)

NULL, // идентификатор родительского окна

NULL, // идентификатор меню

hInstance, // идентификатора приложения

NULL); // указатель на дополнительные параметры

// Если создать окно не удалось, завершаем приложение

if (!hWnd)

return FALSE;

// Рисуем окно

ShowWindow(hWnd, nCmdShow);

// Посылаем сообщение WM_PAINT о необходимости перерисовки окна

// с идентификатором hWnd

UpdateWindow(hWnd);

return TRUE;

}

////////////////////////////////////////////////////////////////////////////////////////

//

// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// НАЗНАЧЕНИЕ: Обработка сообщений от главного окна приложения.

//

// WM_COMMAND - обработка команд меню

// WM_PAINT - рисование в главном окне

// WM_DESTROY - сообщение о завершении работы

//

// Функция WndProc НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения. Эту функцию

// вызывает Windows в процессе обработки сообщений. Для этого адрес функции WndProc

// указывается при регистрации класса окна.

//

LRESULT CALLBACK WndProc(

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

UINT message, // сообщение

WPARAM wParam, // дополнительные параметры сообщения

LPARAM lParam) // дополнительные параметры сообщения

{

// Для дополнительных параметров сообщения

int wmId, wmEvent;

// Структура для рисования

PAINTSTRUCT ps;

// Контекст отображения

HDC hdc;

// Выполняем обработку сообщений. Идентификатор сообщения

// передается через параметр message.

switch (message)

{

// Обработка команд меню

case WM_COMMAND:

// Выделяем дополнительные параметры сообщения

wmId = LOWORD(wParam); // младшее слово wParam

wmEvent = HIWORD(wParam); // старшее слово wParam

// выполнение команд меню:

switch (wmId)

{

// Обработка команды меню Help|About...

case IDM_ABOUT:

// Показываем окно о программе (About)

DialogBox(

hInst, // дескриптор приложения

MAKEINTRESOURCE(IDD_ABOUTBOX), // IDD_ABOUTBOX –

// идентификатор диалогового окна

// About

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

About); // указатель на функцию About

break;

// обработка команды меню File|Exit

case IDM_EXIT:

// Разрушаем главное окно приложения

DestroyWindow(hWnd);

break;

default:

// Все сообщения, которые не обрабатываются нашей функцией

// окна, ДОЛЖНЫ передаваться функции DefWindowProc

return DefWindowProc(hWnd, message, wParam, lParam);

}

break;

// Рисование в окне

case WM_PAINT:

// Получаем контекст отображения для рисования в окне

hdc = BeginPaint(hWnd, &ps);

// TODO: Add any drawing code here...

// Освобождаем контекст отображения

EndPaint(hWnd, &ps);

break;

// Это сообщение приходит, когда вы завершаете работу

// приложения при стандартным для Windows способом

case WM_DESTROY:

// Инициируем завершение работы приложения, помещая в

// очередь приложения сообщение WM_QUIT. Это приведет к

// завершению цикла обработки сообщений в функции WinMain

PostQuitMessage(0);

break;

default:

// Все сообщения, которые не обрабатываются нашей функцией

// окна, ДОЛЖНЫ передаваться функции DefWindowProc

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

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

В файле FirstApp.cpp (Листинг 2.1) описаны прототипы четырех используемых приложением функций и три глобальные переменные.