Минимальное Win32-приложение Итак, давайте попробуем проанализировать общую структуру программы для Windows. Минимальное приложение Windows состоит из трех частей: - главной функции;
- цикла обработки сообщений;
- оконной функции;
Выполнение любого Windows-приложения начинается с главной функции. Она содержит код, осуществляющий настройку (инициализацию) приложения в среде операционной системы Windows. Точно так же, как функция main() является "точкой входа" в консольное приложение, которое мы разрабатывали до сих пор, функция WinMain() является "точкой входа" в практически любую написанную под Windows программу. Видимым для пользователя результатом работы главной функции является появление на экране графического объекта в виде окна. Последним действием кода главной функции является создание цикла обработки сообщений. После его создания приложение становится пассивным и начинает взаимодействовать с внешним миром посредством специальным образом оформленных данных - сообщений. Обработка поступающих приложению сообщений осуществляется специальной функцией, которую называют оконной. Оконная функция уникальна тем, что может быть вызвана только из операционной системы, а не из приложения которое ее содержит. Тело оконной функции имеет определенную структуру, о которой мы поговорим далее. Таким образом, Windows-приложение, как минимум, должно состоять из трех перечисленных элементов. Рассмотрим пример минимального приложения Windows. Для этого выберите пункт меню File->New и укажите тип проекта Win32 Application. Естественно, не забудьте дать имя проекту, например, FirstAPI. Нажмите кнопку OK. Откроется диалоговое окно, где Вам будет предложено выбрать тип создаваемого проекта. Согласитесь с установками по умолчанию (An empty project) и нажмите кнопку OK. В появившемя окне, будет предоставлен результат о работе мастера. Подтвердите свое намерение создать пустой проект, нажав кнопку OK. Теперь, по аналогии с консольными приложениями, нам необходимо добавить к пустому проекту CPP-файл. Давайте проделаем и этот шаг: выберите пункт меню Projеct->Add To Project->New... В появившемся диалоговом окне выберите тип создаваемого файла C++ Source File и укажите в поле File name имя файла, к примеру, FirstAPI. Ну вот, вся подготовительная работа, для создания первого приложения проделана. Теперь, непосредственно, сам исходный код программы. Скопируйте его, и вставьте во внутрь только что созданного CPP файла. #include <windows.h> //Файл WINDOWS.H содержит определения, макросы, и структуры //которые используются при написании приложений под Windows.
//прототип функции, чья реализация приводится в конце программы LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
char szClassWindow[] = "Каркасное приложение"; /*Имя класса окна*/
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG lpMsg; WNDCLASSEX wcl;
//Определение класса окна...
wcl.cbSize = sizeof (wcl); //размер стркутуры WNDCLASSEXA //CS (Class Style) - стиль класса окна wcl.style = CS_HREDRAW|CS_VREDRAW; wcl.lpfnWndProc = WindowProc; //адрес функции окна wcl.cbClsExtra = 0; //используется Windows wcl.cbWndExtra = 0; //используется Windows wcl.hInstance = hInst; //дескриптор данного приложения //загрузка стандартной иконки wcl.hIcon = LoadIconA(NULL, IDI_APPLICATION); //загрузка стандартного курсора wcl.hCursor = LoadCursorA(NULL, IDC_ARROW); // заполняем окно белым цветом wcl.hbrBackground =(HBRUSH)GetStockObject (WHITE_BRUSH); //указываем что меню наше приложение не содержит //памятка: мы хотим написать минимальную программу под Windows wcl.lpszMenuName = NULL; wcl.lpszClassName = szClassWindow; //имя класса окна //указываем что у нас нет маленькой иконки для связи с классом окна wcl.hIconSm=NULL; //теперь нам необходимо зарегестрировать класс окна if (!RegisterClassEx (&wcl)) return 0;//если что-то не получается - выход //создаем окно и присваиваем переменной hWnd дескриптор окна hWnd=CreateWindowEx( 0, //расширенный стиль окна szClassWindow, //имя класса окна "Каркас программы для Win32 на C++", //заголовок окна WS_OVERLAPPEDWINDOW, //стиль окна CW_USEDEFAULT, //х-координата левого верхнего угла окна CW_USEDEFAULT, //y-координата левого верхнего угла окна CW_USEDEFAULT, //ширина окна CW_USEDEFAULT, //высота окна NULL, //дескриптор родительского окна NULL, //дескриптор меню окна hInst, //идентификатор приложения создавшего окна NULL); //указатель на область данных приложения //показываем окно и перерисовываем его содержимое ShowWindow (hWnd, nCmdShow); UpdateWindow (hWnd); //запускаем цикл обработки выборки сообщений while (GetMessage(&lpMsg,NULL,0,0)) { TranslateMessage(&lpMsg); //трансляция сообщения DispatchMessage(&lpMsg); //диспетчеризация сообщений } return lpMsg.wParam; }
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //Данная функция вызывается операционной системой //и получает в качестве параметров сообщения из очереди //сообщений данного приложения { switch(message) { case WM_DESTROY: //сообщение о завершении программы PostQuitMessage (0); break; default: //все сообщения которые не обрабатываются в данной //оконной функции попадают сюда //далее они направляются обратно Windows на обработку //по умолчанию return DefWindowProc (hWnd, message, wParam, lParam); } return 0; }//Все!..
Итак, попробуем откомпилировать и запустить наш проект. Для этого зайдите в пункт меню Build->Execute FirstAPI.exe В конечном итоге, у Вас должно появиться на экране окно которое должно совпасть с приведенным на рисунке: Теперь, когда видны плоды нашего труда, давайте разберем подробно приведенный код. Итак, минимальное Windows-приложение на языке С++ состоит из двух функций: главной - WinMain и оконной - WindowProc. Цель WinMain - сообщить системе о новом для нее приложении, его свойствах и особенностях. Для достижения этой цели WinMain выполняет следующие действия: - Определяет и регистрирует класс окна приложения;
- создает и отображает окно приложения зарегистрированного класса;
- создает и запускает цикл обработки сообщений для приложения;
- завершает программу при получении оконной функцией соответсвующего
сообщения. Оконная функция получает все сообщения, предназначенные данному окну, и обрабатывает их, возможно, вызывая для этого другие функции. Видимая чась работы каркасного приложения заключается в создании нового окна на экране. Обратите внимание, что окно отвечает всем требованиям стандартного окна приложения Windows, то есть его можно развернуть, свернуть, изменить размер, переместить в другое место экрана и т.д. Чтобы добиться этого мы не написали ни строчки кода, а просто удовлетворили определенные требования, предъявляемые к приложениям со стороны Windows. Тем не менее, разработка приложений исключительно средствами WinAPI (Windows Application Programming Interface) зянятие не из легких. Мы с Вами будем разрабатывать приложения с помощью библиотеки классов MFC. О чем Вы собственно и узнаете из следующих разделов... |