
1 Минимальное приложение
Язык Visual C++
Создание приложений Win32 (C++)
Обновлен: Ноябрь 2007
Win32 API (также известный как Windows API) представляет собой платформу для создания приложений Windows, основанную на языке C. Эта платформа используется начиная с Windows 1.0. Подробную документацию по этому API можно найти по адресу Windows API.
В рамках данной процедуры создается простейшее приложений Win32, отображающее приветствие "Hello, World!" в отдельном окне. При создании любых приложений Win32 порядок действий одинаков. По завершении выполнения процедуры получившийся код можно использовать в качестве основы для создания любых других приложений Win32.
Обязательные компоненты
Этот раздел предполагает знание основ языка C++. Если вы приступаете к изучению C++, рекомендуем вам "Руководство по С++ для начинающих", написанное Гербом Шилдтом (Herb Schildt), которое доступно по ссылке http://go.microsoft.com/fwlink/?LinkId=115303.
Для
просмотра видеодемонстрации см. Видео:
создание приложения Win32 (C++).
Создание проекта Win32
В меню Файл последовательно выберите команды Создать и Проект....
В узле Visual C++ области Типы проектов выберите CLR, а затем в области Шаблоны выберите Проект Win32.
Введите имя проекта, например win32app. Можно принять место размещения по умолчанию, ввести необходимое место размещения или перейти к каталогу, в который требуется сохранить проект.
В окне Мастер приложений Win32 нажмите кнопку Далее.
В окне Мастер приложений Win32 в поле Тип приложения выберите пункт Приложение Windows. В поле Дополнительные параметры выберите Пустой проект. Остальные параметры оставьте без изменений. Чтобы создать проект, нажмите кнопку Готово.
Добавьте в проект файл C++, в меню Проект выбрав команду Добавить новый элемент.... В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). Введите имя файла, например GT_HelloWorldWin32.cpp, и нажмите кнопку Добавить.
Запуск приложения Win32
Как известно, любое приложение на языках C и C++ должно иметь функцию main. Эта функция является начальной точкой для приложения. Подобным же образом любое приложение Win32 должно иметь функцию WinMain. Синтаксис функции WinMain выглядит следующим образом:
Копировать
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow);
Описание параметров и значений, возвращаемых этой функцией, см. в разделе Функция WinMain.
Наряду с функцией WinMain, в каждом приложении Win32 также должна быть определена еще одна функция, обычно называемая WndProc и представляющая собой оконную процедуру. Синтаксис функции WndProc выглядит следующим образом:
Копировать
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
Назначением этой функции является обработка сообщений, получаемых приложением от операционной системы. В каком случае приложение получает сообщения от операционной системы? Оно получает их постоянно! Например, представим, что было создано диалоговое окно с кнопкой ОК. Когда пользователь нажимает кнопку, операционная система посылает приложению сообщение, оповещающее о нажатии кнопки. Функция WndProc отвечает за реагирование на это событие. В этом примере соответствующей реакцией на это событие может быть закрытие диалогового окна.
Дополнительные сведения см. в разделе Процедуры окна.
Расширение функциональности 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));
Описание полей этой структуры см. в разделе WNDCLASSEX.
После того как класс окна будет создан, необходимо зарегистрировать его. Воспользуйтесь функцией 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");
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application dows not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
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, являющийся дескриптором окна. Дополнительные сведения см. в разделе Типы данных Windows.
После того как окно будет создано, его можно вывести на экран с помощью следующего кода:
Копировать
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
Это окно будет практически пустым, поскольку функция WndProc еще не реализована.
На последнем этапе в функции WinMain реализуется цикл обработки сообщений. Назначением этого цикла является прослушивание сообщений, посылаемых операционной системой. При получении приложением сообщения оно передается функции WndProc на обработку. Цикл обработки сообщений выглядит следующим образом:
Копировать
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
Дополнительные сведения о структурах и функциях, используемых в цикле обработки сообщений, см. в разделах, посвященных MSG, GetMessage, TranslateMessage и DispatchMessage.
Выполненные этапы типичны для создания большинства приложений Win32. На данном этапе функция WinMain должна выглядеть примерно следующим образом:
Копировать