Скачиваний:
41
Добавлен:
15.06.2014
Размер:
192 Кб
Скачать

ЛАБОРАТОРНАЯ № 1.

ТЕМА: «ЗНАКОМСТВО СО СРЕДОЙ РАЗРАБОТКИ VISUAL C++ 6.0».

ЦЕЛЬ:

  • Ознакомится со средой Microsoft Visual Studio, Visual C++ 6.0.

  • создать каркас «Hello world!» win32 API приложения.

  • изучить исходный код.

ТЕОРЕТИЧЕСКИЕ СВЕДЕНЬЯ:

Среда Visual C++ 6.0.

Рис 1. Среда VC++ 6.0

Для создания нового проекта необходимо:

  1. Выбрать пункт меню File/New

  2. В открытом диалоге выбрать тип проекта “Win32 Application”

  3. Затем в поле “Project name” указать имя проекта

  4. В поле “Location” указать путь, где будет находиться папка проекта (при создании проекта, VC++6.0 создает папку с названием проекта в той папке, которую вы укажите).

  5. Затем нажимаем на кнопку “OK”

  6. После того как появится следующий диалог с названием “Win32 Application Step 1 of 1”, указать тип создаваемого шаблона проекта “A typical “Hello World!” application”

  7. Затем нажать на кнопку “Finish”

  1. В результате вы должны увидеть окно приблизительно такое, как и на рис.1

Ознакомится для чего предназначены пункты меню, вы можете, выбрав пункт Help/Keyboard Map

Весь рабочая область VC++6.0 делится на 2 части. Самая большая из них - это окно, где отображается исходные коды приложения. Во второй части, она находится в левой части рабочей области, располагаются окна-закладки, которые показывают структурные единицы разрабатываемого приложения. Всего закладок 3: “Class”, “Resource” и “Files”.

В закладке “Class” отображаются такие структурные единицы, как классы их методы и свойства, а также функции и глобальные переменные, щелкая по названиям отображаемым в этом окошке можно перейти к объявлению или реализации, функции метода, свойства или глобальной переменной.

В закладке “Resource”отображаются такие структурные единицы, как ресурсы проекта (при отсутствии таковых, закладка может отсутствовать). Ресурсами проекта как правило являются шаблоны окон диалога, шаблоны меню и панелей инструментов, а также файлы с графическим содержимым – иконки или просто рисунки.

В закладке “Files”отображаются такие структурные единицы, как файлы, которые входят в проект. Файлы, входящие в проект делятся на 4 группы: файлы c исходным кодом “Source File”, файлы ресурсов “Resource files”, заголовочные файлы “Header files”и группа файлов, от которых проект зависит “External Dependencies”, а также кроме этого могут входить произвольные файлы, в которых хранится информация о разрабатываемом проекте, например “Readme.txt” в вашем проекте.

Каркас приложения.

Один из двух файлов, необходимых для создания программы под windows, Это файл исходного текста *.С или *.СPP. Далее, когда начнете разбираться с программой вы встретите другой тип файла, широко распространенный в программировании для Windows, который называется файлом описания ресурсов (resource script) и имеет расширение .RC.

Большая часть программы, которой вы познакомитесь с является надстройкой, которую можно обнаружить практически в каждой программе для Windows. В действительности никто полностью не запоминает текст этой надстройки; подавляющее большинство программистов, когда пишут программу для Windows, просто копируют существующую программу и делают в ней необходимые изменения. Вы можете поступать аналогичным образом.

Программа создает обычное окно приложения, как показано на рис.2 В окне, в вверху рабочей области, выводится текст " Hello World!".. Вы можете захватить указателем мыши заголовок окна и перемещать его по всему экрану. Вы можете захватить рамку окна и изменить размеры. При изменении размеров окна программа будет автоматически перемещать строку текста "Hello World!" в новый верх рабочей области окна. Вы можете щелкнуть на кнопке развертывания окна и увеличить его до размеров всего экрана. Вы можете щелкнуть на кнопке свертывания окна и стереть его с экрана. Вы можете вызвать все эти действия из системного меню. Вы также можете, чтобы завершить программу, закрыть тремя разными способами окно: выбрав соответствующую опцию из системного меню, щелкнув на кнопке закрытия окна справа в строке заголовка, или дважды щелкнув на иконке слева в строке заголовка.

Перед тем как заняться деталями, давайте рассмотрим прграмму в целом. В файле имеется только две функции: WinMain и WndProc. WinMain — это точка входа в программу. Это аналог стандартной функции main языка С. В любой программе для Windows имеется функция WinMain.

WndProc — это "оконная процедура" для вами созданного окна. Каждое окно, независимо от того, является ли оно большим, как главное окно приложения для Windows, или маленьким, как кнопка, имеет соответствующую оконную процедуру. Оконная процедура — это способ инкапсулирования кода, отвечающего за ввод информации (обычно с клавиатуры или мыши) и за вывод информации на экран. Оконная процедура делает это, посылая "сообщения" окну. Не беспокойтесь о том, как именно это происходит. Позже у вас будет масса времени для того, чтобы попытаться решить эту проблему.

В программе отсутствуют инструкции для непосредственного вызова WndProc: WndProc вызывается только из Windows. Однако, в WinMain имеется ссылка на WndProc, поэтому эта функция описывается в самом начале программы, еще до определения WinMain.

Ваша программа вызывает не менее 17 функций Windows. Здесь перечислены эти функции в порядке их появления в программе (с кратким описанием каждой функции):

  • LoadIcon — загружает значок для использования в программе.

  • LoadCursor — загружает курсор мыши для использования в программе.

  • GetStockObject — получает графический объект (в этом случае для закрашивания фона окна используется кисть).

  • RegisterClassEx — регистрирует класс окна для определенного окна программы.

  • CreateWindow — создает окно на основе класса окна.

  • ShowWindow — выводит окно на экран.

  • UpdateWindow — заставляет окно перерисовать свое содержимое.

  • GetMessage — получает сообщение из очереди сообщений.

  • TranslateMessage — преобразует некоторые сообщения, полученные с помощью клавиатуры.

  • DispatchMessage — отправляет сообщение оконной процедуре.

  • PlaySound — воспроизводит звуковой файл.

  • BeginPaint — инициирует начало процесса рисования окна.

  • GetClientRect — получает размер рабочей области окна.

  • DrawText — выводит на экран строку текста.

  • EndPaint — прекращает рисование окна.

  • PostQuitMessage — вставляет сообщение "завершить" в очередь сообщений.

  • DefWindowProc — выполняет обработку сообщений по умолчанию.

Эти функции описаны в документации или системе контекстной подсказки, поставляемой с вашим компилятором, а описаны они в различных заголовочных файлах из WINDOWS.H.

В дальнейшем вы обратите внимание на использование нескольких идентификаторов, полностью написанных прописными буквами. Эти идентификаторы задаются в заголовочных файлах Windows. Некоторые из этих идентификаторов содержат двухбуквенный или трехбуквенный префикс, за которым следует символ подчеркивания:

CS_HREDRAW

DT_VCENTER

WM_CREATE

CS_VREDRAW

IDC_ARROW

WM_DESTROY

CW_USEDEFAULT

IDI_APPLICATION

WM_PAINT

DT_CENTER

SND_ASYNC

WS_OVERLAPPEDWINDOW

DT_SINGLELINE

SND_FILENAME

Это просто числовые константы. Префикс показывает основную категорию, к которой принадлежат константы, как показано в данной таблице:

Префикс

Категория

CS

Опция стиля класса

IDI

Идентификационный номер иконки

IDC

Идентификационный номер курсора

WS

Стиль окна

CW

Опция создания окна

WM

Сообщение окна

SND

Опция звука

DT

Опция рисования текста

Программируя для Windows, почти никогда не нужно запоминать числовые константы. Фактически для любой числовой константы, которая используется в Windows, в заголовочных файлах имеется идентификатор. Несколько других идентификаторов в в вашей программе являются новыми типами данных; они также определяются в заголовочных файлах с помощью либо инструкций typedef, либо инструкций #define. Это изначально сделано для облегчения перевода программ для Windows с исходной 16-разрядной системы на будущие операционные системы, которые могли бы быть основаны на 32-разрядной (или иной) технологии. Эта работа не была столь гладкой и очевидной, как тогда многие думали, но идея оказалась основательной.

Иногда эти новые типы данных вполне условны. Например, тип данных UINT, использованный в качестве второго параметра WndProc — это просто беззнаковое целое, которое в теперь в Windows является 32-разрядным. Тип данных PSTR, использованный в качестве третьего параметра WinMain, является указателем на строку символов, т. е. char*.

Другие имена менее очевидны. Например, третий и четвертый параметры WndProc определяются как WPARAM и LPARAM соответственно. Происхождение этих имен требует небольшого экскурса в историю. Когда Windows была 16-разрядной системой, третий параметр WndProc определялся как WORD, что означало 16-разрядное беззнаковое короткое целое, а четвертый параметр определялся как LONG, что означало 32-разрядное знаковое длинное целое, и в этом смысл префиксов "W" и "L" у слова "PARAM". В Windows имя WPARAM определяется как UINT, а LPARAM как LONG (что представляет из себя просто тип данных длинное целое языка С), следовательно оба параметра оконной процедуры являются 32-разрядными. Это может оказаться несколько неудобным, поскольку тип данных WORD в Windows по-прежнему определяется как 16-разрядное беззнаковое короткое целое, следовательно префикс "W" у слова "PARAM" создает некоторую путаницу.

Функция WndProc возвращает значение типа LRESULT. Оно определено просто как LONG. Функция WinMain получает тип WINAPI (как и любая другая функция Windows, которая определяется в заголовочных файлах), а функция WndProc получает тип CALLBACK. Оба эти идентификатора определяются как stdcall, что является ссылкой на особую последовательность вызовов функций, которая имеет место между самой операционной системой Windows и ее приложением.

В вашей программе также использованы четыре структуры данных (о которых будет рассказано в конце этой главы), определяемых в заголовочных файлах Windows. Этими структурами данных являются:

Структура

Значение

MSG

Структура сообщения

WNDCLASSEX

Структура класса окна

PAINTSTRUCT

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

RECT

Структура прямоугольника

Первые две структуры данных используются в WinMain для определения двух структур, названных msg и wndclass. Две вторые используются в WndProc для определения структур ps и rect.

Наконец, имеется еще три идентификатора, которые пишутся прописными буквами и предназначены для разных типов описателей (handles):

Идентификатор

Значение

HINSTANCE

Описатель экземпляра (instance) самой программы

HWND

Описатель окна

HDC

Описатель контекста устройства

Описатели в Windows используются довольно часто. Перед тем как эта глава подойдет к концу, вы встретите описатель HICON (описатель иконки), описатель HCURSOR (описатель курсора мыши) и описатель HBRUSH (описатель графической кисти).

Описатель — это просто число (обычно длиной в 32 разряда), которое ссылается на объект. Описатели в Windows напоминают описатели файлов при программировании на традиционном С в MS-DOS. Программа почти всегда получает описатель путем вызова функции Windows. Программа использует описатель в других функциях Windows, чтобы сослаться на объект. Действительное значение описателя весьма важно для вашей программы, но модуль Windows, который обеспечивает программу описателем, "знает", как его использовать для ссылки на объект.

Текст программы начинается с инструкции #include, которая позволяет включить в программу заголовочный файл WINDOWS.H:

#include <windows.h>

WINDOWS.H включает в себя много других заголовочных файлов, содержащих объявления функций Windows, структур Windows, новые типы данных и числовые константы.

За инструкцией #include следует объявление WndProc:

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

Это объявление в начале программы необходимо потому, что в тексте функции WinMain имеются ссылки на функцию WndProc.

В программе на языке С, написанной для традиционной среды, точкой входа является функция main. С этого места программа начинает выполняться. (Фактически функция main является точкой входа в ту часть программы, которая пишется программистом. Обычно компилятор С должен вставить некоторый стартовый код в исполняемый файл. Этот код и вызывает функцию main.) Точкой входа программы для Windows является функция WinMain. WinMain всегда определяется следующим образом:

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

Эта функция использует последовательность вызовов WINAPI и, по своему завершению, возвращает операционной системе Windows целое. Функция называется WinMain. В ней есть четыре параметра.

Параметр hInstance называется описателем экземпляра (instance handle). Это уникальное число, идентифицирующее программу, когда она работает под Windows. Может так случиться, что пользователь запустит под Windows несколько копий одной и той же программы. Каждая копия называется "экземпляром" и у каждой свое значение hInstance. Описатель экземпляра можно сравнить с "идентификатором задачи" или "идентификатором процесса" — обычными терминами многозадачных операционных систем.

Параметр hPrevInstance — предыдущий экземпляр (previous instance) — в настоящее время устарел. В ранних версиях Windows он относился к самому последнему, предшествующему данному, описателю экземпляра той программы, которая все еще активна. Если в данный момент времени не было загружено никаких копий программы, то hPrevInstance = 0 или NULL. В 32-х разрядных операционных системах семейства Windows этот параметр всегда равен NULL.

Параметр szCmdLine — это указатель на оканчивающуюся нулем строку, в которой содержатся любые параметры, переданные в программу из командной строки. Вы можете запустить программу для Windows с параметром командной строки, вставив этот параметр после имени программы в командной строке MS-DOS или указать имя программы и параметр в окне диалога Run, которое вызывается из меню Start.

Параметр iCmdShow — число, показывающее, каким должно быть выведено на экран окно в начальный момент. Это число задается при запуске программы другой программой. Программисты достаточно редко обращаются к этому числу, но при необходимости такая возможность существует. В большинстве случаев число равно 1 или 7. Но лучше не думать об этом значении как о единице или как о семерке. Лучше думайте о них как об идентификаторе SW_SHOWNORMAL (заданном в заголовочных файлах Windows равным 1) или идентификаторе SW_SHOWMINNOACTIVE (заданном равным 7). Префикс SW в этих идентификаторах означает "показать окно" (show window). Параметр показывает, необходимо ли запущенную пользователем программу выводить на экран в виде окна нормального размера или окно должно быть изначально свернутым.

Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки сообщений, поступающих окну. Поскольку это важно, повторяем: окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки сообщений, поступающих окну.

На основе одного класса окна можно создать несколько окон. Например, все окна-кнопки в Windows создаются на основе одного и того же класса окна. Класс окна определяет оконную процедуру и некоторые другие характеристики окон, создаваемых на основе этого класса. Когда вы создаете окно, вы определяете дополнительные характеристики окна, уникальные для него.

Перед созданием окна для вашей программы необходимо зарегистрировать класс окна путем вызова функции RegisterClassEx. Это расширенная (на что указывает окончание названия Ex, т. е. extended — расширенный) версия функции RegisterClass из предыдущих версий Windows. Тем не менее функция RegisterClass продолжает работать и под Windows 95.

У функции RegisterClassEx имеется один параметр: указатель на структуру типа WNDCLASSEX. Структура WNDCLASSEX определяется в заголовочных файла Windows следующим образом:

typedef struct tagWNDCLASSEX

{

UINT cbSize;

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCSTR lpszMenuName;

LPCSTR lpszClassName;

HICON hIconSm;

}

WNDCLASSEX;

Несколько замечаний о некоторых из представленных здесь типах данных и о венгерской нотации: префиксы LP и lp означают "длинный указатель" (long pointer), являющийся пережитком 16-разрядной Windows, в которой программисты могли различать короткие (или близкие, near) 16-разрядные указатели и длинные (или дальние, far) 32-разрядные указатели. В Windows 95 все указатели имеют длину в 32 разряда. В представленных в этой книге программах все префиксы l для типов указателей убраны, но несомненно вы встретите их где-нибудь в другом месте.

Обратите также внимание на некоторые новые случаи использования венгерской нотации: приставка lpfn означает "длинный указатель на функцию" (long pointer to a function). Приставка cb означает "счетчик байтов" (counter of bytes). Префикс hbr — это "описатель кисти" (handle to a brush).

В WinMain вы должны определить структуру типа WNDCLASSEX, обычно это делается следующим образом:

WNDCLASSEX wndclass;

Затем задаются 12 полей структуры и вызывается RegisterClassEx:

RegisterClassEx (&wndclass);

Наиболее важными являются второе от конца и третье поля. Второе от конца поле является именем класса окна (который в программах, создающих одно окно, обычно совпадает с именем программы). Третье поле (lpfnWndProc) является адресом оконной процедуры, которая используется для всех окон, созданных на основе этого класса. Другие поля описывают характеристики всех окон, создаваемых на основе этого класса окна.

Поле cbSize равно длине структуры. Инструкция:

wndclass.style = CS_HREDRAW | CS_VREDRAW;

осуществляет объединение двух идентификаторов "стиля класса" (class style) с помощью поразрядной операции OR языка С. В заголовочных файлах Windows, идентификаторы, начинающиеся с префикса CS, задаются в виде 32-разрядной константы, только один из разрядов которой установлен в 1. Например, CS_VREDRAW задан как 0x0001, а CS_HREDRAW как 0x0002. Заданные таким образом идентификаторы иногда называют "поразрядными флагами" (bit flags). Объединяются поразрядные флаги с помощью операции OR языка С.

Эти два идентификатора стиля класса показывают, что все окна, созданные на основе данного класса должны целиком перерисовываться при изменении горизонтального (CS_HREDRAW) или вертикального (CS_VREDRAW) размеров окна. Если вы измените размер окна HELLOWIN, то увидите, что строка текста переместится в новый центр окна. Эти два идентификатора гарантируют, что это случится. Далее мы подробно рассмотрим, как оконная процедура уведомляется об изменении размера окна.

Третье поле структуры WNDCLASSEX инициализируется с помощью инструкции:

wndclass.lpfnWndProc = WndProc;

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

Следующие две инструкции:

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

резервируют некоторое дополнительное пространство в структуре класса и структуре окна, которое внутренне поддерживается операционной системой Windows. Программа может использовать это свободное пространство для своих нужд. В HELLOWIN эта возможность не используется, поэтому соответствующие значения равны 0. В противном случае, как следует из венгерской нотации, в этом поле было бы установлено "число байтов" резервируемой памяти.

В следующем поле находится просто описатель экземпляра программы (который является одним из параметров WinMain):

wndclass.hInstance = hInstance;

Инструкции:

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

и

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

устанавливают значок для всех окон, созданных на основе данного класса окна. Значок — это просто маленькая битовая картинка, которая появляется на панели задач Windows и слева в заголовке окна. Позже из этой книги вы узнаете, как создавать пользовательские значки для ваших программ под Windows. Сейчас для простоты воспользуемся стандартным значком.

Для получения описателя стандартного значка, вы вызываете LoadIcon, установив первый параметр в NULL. (При загрузке вашего собственного пользовательского значка, этот параметр должен быть установлен равным описателю экземпляра программы.) Второй идентификатор, начинающийся с префикса IDI ("идентификатор для значка" — ID for icon) определяется в заголовочных файлах Windows. Значок IDI_APPLICATION — это просто маленькое изображение окна. Функция LoadIcon возвращает описатель этого значка. Фактически нам не важно конкретное значение этого описателя. Оно просто используется для установки значений полей wndclass.hIcon и wndclass.hIconSm. Эти поля определяются в структуре WNDCLASSEX как поля типа HICON, что означает "описатель значка" (handle to an icon).

Инструкция:

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

очень похожа на две предыдущие инструкции. Функция LoadCursor загружает стандартный курсор IDC_ARROW и возвращает описатель курсора. Этот описатель присваивается полю hCursor структуры WNDCLASSEX. Когда курсор мыши оказывается в рабочей области окна, созданного на основе данного класса, он превращается в маленькую стрелку.

Следующее поле задает цвет фона рабочей области окон, созданных на основе данного класса. Префикс hbr имени поля hbrBackground означает "описатель кисти" (handle to a brush). Кисть — это графический объект, который представляет собой шаблон пикселей различных цветов, используемый для закрашивания области. В Windows имеется несколько стандартных, или предопределенных (stock) кистей. Вызов GetStockObject, показанный здесь, возвращает описатель белой кисти:

wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);

Это означает, что фон рабочей области окна будет плотного белого цвета, что является стандартным выбором.

Следующее поле задает меню класса окна. В приложении HELLOWIN меню отсутствует, поэтому поле установлено в NULL:

wndclass.lpszMenuName = NULL;

На последнем этапе классу должно быть присвоено имя. Для простой программы оно может быть просто именем программы, которым в нашем случае является строка "HelloWin", хранящаяся в переменной szAppName:

wndclass.lpszClassName = szAppName;

После того как инициализированы все 12 полей структуры, HELLOWIN регистрирует класс окна путем вызова функции RegisterClassEx. Единственным параметром функции является указатель на структуру WNDCLASSEX:

RegisterClassEx (&wndclass);

Класс окна определяет основные характеристики окна, что позволяет использовать один и тот же класс для создания множества различных окон. Когда вы, вызывая функцию CreateWindow, фактически создаете окно, вы, таким образом, детализируете информацию об окне.

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

Вместо использования структуры данных, как это делается в случае использования функции RegisterClassEx, вызов функции CreateWindow требует, чтобы вся информация передавалась функции в качестве параметров. Далее представлен вызов функции CreateWindow в HELLOWIN.C:

hwnd = CreateWindow (szAppName, //имя класса окна

"The Hello Program", //заголовок окна

WS_OVERLAPPEDWINDOW, //стиль окна

CW_USEDEFAULT, //начальное положение по x

CW_USEDEFAULT, //начальное положение по y

CW_USEDEFAULT, //начальный размер по x

CW_USEDEFAULT, //начальный размер по y

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

NULL, //описатель меню окна

hInstance, //описатель экземпляра программы

NULL); //параметры создания

Для удобства восприятия, использовались символ // и однострочные комментарии для описания параметров функции CreateWindow.

Параметр с комментарием "имя класса окна" — szAppName содержит строку, являющуюся именем только что зарегистрированного класса окна. Таким образом, этот параметр связывает окно с классом окна.

Окно, созданное нашей программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна справа на строке заголовка и рамкой окна. Это стандартный стиль окон, он называется WS_OVERLAPPEDWINDOW и помечен комментарием "стиль окна". Комментарием "заголовок окна" отмечен текст, который появится в строке заголовка.

Параметры с комментариями "начальное положение по x" и "начальное положение по y" задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана. Устанавливая для этих параметров идентификатор CW_USEDEFAULT, мы сообщаем Windows, что хотим использовать для перекрывающегося окна задаваемое по умолчанию начальное положение. (CW_USEDEFAULT задается равным 0x80000000.) По умолчанию Windows располагает следующие друг за другом перекрывающиеся окна, равномерно отступая по горизонтали и вертикали от верхнего левого угла экрана. Примерно также задают ширину и высоту окна параметры с комментариями "начальный размер по x" и "начальный размер по y". CW_USEDEFAULT снова означает, что мы хотим, чтобы Windows использовала задаваемый по умолчанию размер окна.

Параметр с комментарием "описатель родительского окна" устанавливается в NULL, поскольку у нашего окна отсутствует родительское окно. (Если между двумя окнами существует связь типа родительское-дочернее, дочернее окно всегда появляется только на поверхности родительского.) Параметр с комментарием "описатель меню окна" также установлен в NULL, поскольку у нашего окна нет меню. В параметр с комментарием "описатель экземпляра программы" помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain. И наконец, параметр с комментарием "параметры создания" установлен в NULL. При необходимости этот параметр используется в качестве указателя на какие-нибудь данные, на которые программа в дальнейшем могла бы ссылаться.