Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой (ОС).docx
Скачиваний:
9
Добавлен:
11.06.2015
Размер:
169.11 Кб
Скачать

Расширение функциональности WinMain.

Для начала создайте внутри функции WinMain структуру класса окна типа WNDCLASSEX. Эта структура содержит информацию об окне, такую как используемые в приложении значки, цвет фона окна, отображаемое в заголовке окна название, имя функции процедуры окна и т.д. Типичная структураWNDCLASSEX выглядит следующим образом:

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

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

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

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

wcex.lpszMenuName = NULL;

wcex.lpszClassName = szWindowClass;

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

После того как класс окна будет создан, необходимо зарегистрировать его. Воспользуйтесь функцией RegisterClassEx, которой следует передать структуру класса окна в качестве аргумента:

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

После того как класс будет зарегистрирован, можно приступать к созданию окна. Используйте функцию CreateWindow, как показано ниже:

static TCHAR szWindowClass[] = _T("win32app");

static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

// Параметры CreateWindow обозначают:

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

// szTitle: текст, который будет отображаться в титуле

// WS_OVERLAPPEDWINDOW: тип создаваемого окна

// CW_USEDEFAULT, CW_USEDEFAULT: начальные позиции (x, y)

// 500, 100: размеры окна (width, length)

// NULL: предки окна

// NULL: это окно не будет иметь меню

// hInstance: первый параметр для WinMain

// NULL: не используется в этом приложении

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

500, 100,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

Эта функция возвращает объект HWND, являющийся дескриптором окна.

Класс окна

При создании нового окна ему присваивается «Класс окна» (window class). Класс окна задает оконную функцию, используемую по умолчанию. Кроме этого, класс окна задает другие параметры окна, такие, как стиль, меню окна, цвет рабочей области и т.д. Разные классы окон могут указывать на одну и ту же функцию обработки сообщений. Для создания класса его необходимо зарегистрировать.

Итак, регистрация! За нее отвечает функция RegisterClass. В ее параметре необходимо передать указатель на структуру WNDCLASS. Обычно для заполнения структуры и вызова RegisterClass создают отдельную функцию. Но это - дело вкуса.

Вот простейший пример такой функции:

ATOM RegMyWindowClass(HINSTANCE hInst, LPSTR lpzClassName)

{

WNDCLASS wcWindowClass = {0};

//адрес функции обработки сообщений

wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;

//стиль окна

wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;

//дискриптор экземпляра приложения

//название класса

wcWindowClass.hInstance = hInst;

wcWindowClass.lpszClassName = lpzClassName;

//загрузка курсора

wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);

//загрузка цвета окон

wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;

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

return RegisterClass(&wcWindowClass);

}

  • WNDPROC lpfnWndProc – адрес функции обработки сообщений.

  • HINSTANCE hInstance – уже знакомая переменная, описывающая экземпляр.

  • LPCTSTR lpszClassName – имя нового класса.

  • HICON hCursor – описатель курсора мыши.

  • HBRUSH hbrBackground – цвет рабочей области окна.

Функция RegisterClass возвращает уникальный «описатель класса окна» типа ATOM. Если при регистрации класса произошла ошибка, это значение будет равно нулю. Чтобы узнать, что произошло, можно вызвать функцию GetLastError().

Существует также функция RegisterClassEx, приведенная выше. Это аналог функции RegisterClass с возможностью присвоения окнам маленькой иконки. При работе с этой функцией необходимо пользоваться структурой WNDCLASSEX.