Windows API Урок 2. Разбор функции WinMain
На прошлом занятии мы с вами создали первую программу для Windows на голом API. На этом занятии мы разберем одну из частей этой программы, а именно функцию WinMain.
WinMain - это главная функция в Windows-приложениях. Именно с нее и начинается выполнение программы. Аналогичной функцией в консольных приложениях является функция main. Разумеется, функция WinMain должна быть ровно одна - не больше и не меньше.
В WinMain передается 4 параметра. Первые два из них имеют тип HINSTANCE. Этот тип - это Windows-тип который означает экземпляр приложения. Первый параметр при этом содержит указатель (в смысле handle) на текущий экземпляр приложения, второй - всегда равен NULL. Ранее (в Windows 3.1) второй параметр содержал handle предыдущего запущенного экземпляра этого же приложения (например, если вы запускали второй экземпляр блокнота). Третий параметр представляет из себя указатель на строку, заканчивающуюся нуль-символом (стандартное представление строк в C/C++). Эта строка - это параметры командной строки, передаваемой в приложение. Параметры командной строки включают и имя программы. И, наконец, четвертый параметр определяет способ показа главного окна нашего приложения - т. е. показывать ли его развернутым на целый экран, или в нормальном виде, или в сложенном и др.
Двигаемся дальше. В самой функции WinMain мы последовательно проходим несколько этапов. Сначала мы создаем класс окна, потом регистрируем его в Windows, после чего создаем на основе этого класса окно и показываем его. На последнем этапе мы запускаем цикл обработки сообщений (так называемый message pump).
Вот эти этапы более подробно.
Создание класса окна начинается с объявления переменной типа WNDCLASS:
...
WNDCLASS w;
...
Далее мы заполняем поля этой переменной. Она имеет структурный тип, так что мы должны заполнить все поля. Так как большинство из них можно поставить в ноль, то сначала мы обнуляем их всех:
...
memset(&w, 0, sizeof(WNDCLASS));
...
а потом задаем для остальных подходящие значения:
...
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
w.lpszClassName = "My Class";
...
Тут мы последовательно задавали стиль окна, установили, что переменная hInstance нашей структуры должна содержать handle на текущий экземпляр приложения (это первый параметр функции WinMain), установили цвет фона и задали имя класса окна.
Далее мы регистрируем наш класс в системе Windows:
...
RegisterClass(&w);
...
После этого мы, наконец-то, создаем окно с помощью функции CreateWindow:
...
hwnd = CreateWindow("My Class", "My title", WS_OVERLAPPEDWINDOW,
300, 200, 200, 180, NULL, NULL, hInstance, NULL);
...
Параметры этой функции задают внешний вид нашего окна. Эту функцию мы рассмотрим более подробно на одном из последующих уроков, пока же укажем только, что она возвращает в качестве значения handle на созданное окно. Это у нас переменная hwnd типа HWND. Далее все операции с окном мы делаем через этот handle. В частности, мы показываем окно и обновляем его:
...
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
...
И, наконец, после того, как окно создано и показано, мы запускаем цикл обработки сообщений:
...
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
...
С функцией WinMain пока все. На следующем занятии мы рассмотрим вторую функцию из нашей минимальной программы - оконную процедуру WndProc.
|