Приложение Windows содержит обязательно две функции:
WinMain() и WndProc().
Функция WinMain() - главная функция приложения и аналогична функции main() для программы на языке С.
Простейшая программа на языке Си имеет следующий вид:
main()
{
}
Аналогичная программа для Windows сложнее:
#include <windows.h>
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevlnstance,
LPSTR lpszCmdLine, int nCmdShow)
{
return FALSE;
}
Файл windows.h необходим при написании любых программ для Windows. В нем содержатся прототипы всех функций Windows, определены типы всех функций Windows, определены типы и структуры данных, глобальные переменные и константы.
Функция WinMain()
Функция WinMain() обязана присутствовать в каждом приложении Windows. Функции WinMain() передается управление в начальный момент загрузки приложения.
Основные действия, которые выполняет функция WinMain(), следущие:
· Регистрация класса окна приложения и другие инициализации.
· Создание основного окна приложения и других подчиненных окон.
· Запуск цикла обработки сообщений, помещаемых в очередь приложения.
· Завершение работы приложения при извлечении из очереди сообщения WM_QUIT.
LPSTR lpszCmdLine / / указатель на командную строку
int nCmdShow) / / флаг "окно_ открыто/окно_ закрыто"
Функция WinMain() имеет четыре параметра.
hInstance - является дескриптором копии приложения. Это число однозначно определяет каждую копию приложения, исполняемую под Windows. Можно одновременновыполнять несколько копий одного приложения, при этом каждой копии будет соответствовать свой уникальный индекс.
hPrevInstance- является дескриптором определяющим копию данного приложения, которая была последней активной копией. Если параметр hPrevInstance равен нулю, других копий этого приложения, исполняемых в данный момент под Windows, не существует.
lpszCmdLine- это дальний указатель на командную строку, оканчивающуюся нулем. Он позволяет приложению получать данные через командную строку.
nCmdShow- определяет, как в приложении первоначально отображается на дисплее: пиктограммой (nCmdShow == SW_ SHOWMINNOACTIVE) или в виде открытого окна (nCmdShow == SW_ SHOWNORMAL). Константы SW_ SHOWMINNOACTIVE и SW_ SHOWNORMAL определены во включаемом файле windows.h.
В Windows можно запустить одновременно не только несколько программ, но и несколько раз запустить одну и ту же программу. Таким образом, одно и тоже приложение может иметь несколько копий.
Для приложений для Windows 3.1 первая копия приложения имеет важное значение.
Только первая копия приложения создает в памяти новые ресурсы (классы окон, диалоговые панели, меню, курсоры и т.д.) . Все остальные копии приложения получают к ним доступ и могут воспользоваться уже созданными ресурсами, не создавая своих собственных.
Для того чтобы отличить одну копию приложения от другой , каждой копии ставится в соответствие дескриптор копии приложения (hinstance handle). Соответствующую целочисленную переменную принято обозначать hInstance, она передается Windows функции WinMain() при вызове в качестве одного из обязательных параметров. Другим обязательным параметром является также целочисленный параметр hPrevInstance, который позволяет копии приложения определить, первая она или нет. При запуске первой копии Windows присваивает hPrevInstance значение NULL.
Поэтому каждая последующая копия должна проверить этот параметр на равенство его NULL для того, чтобы не выполнять действия, которые должны производится только один раз в первой копии приложения:
#include<windows.h>
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevlnstance,
LPSTR lpszCmdLine, int nCmdShow)
{ if ( !hPrevInstance ) { . . . } }
Если запуск двух копий приложения недопустим, то можно запретить запуск второй копии следующей проверкой
if ( !hPrevInstance ) return NULL;
Прежде чем отобразить что либо на экране, нужно создать окно, и только в окно можно осуществить вывод.
Любое окно принадлежит к одному из существующих классов. Класс окна должен быть создан до того, как окно будет отображено на экране. Класс окна определяет общее свойство всех окон данного класса ( форму курсора при попадании его в область окно, имя меню, определенного для окон этого класса и т.д.).
Характеристики окон задаются при регистрации класса окна в структуре класса окна и при создании окна. Наиболее общие характеристики окон задаются при регистрации класса окна. Окна, создаваемые при помощи функции CreatеWindow(), должны иметь зарегистрированный ранее класс окна.
Для того чтобы зарегистрировать класс окна, следует заполнить поля структуры типа
WNDCLASS и передать эту структуру в виде параметра функции RegisterClass().
Структура класса окна WNDCLASS определена в файле windows.h и имеет десять полей:
LPCSTR lpszMenuName; / / имя меню в файле ресурсов
LPCSTR lpszClassName; / / имя класса окна
} WNDCLASS;
Некоторые поля структуры класса окна , например, lpszClassName, hInstance и lpfnWndProc, являются обязательными при создании нового класса окна. Другим полям можно присваивать значение NULL, что предписывает Windows использовать для этих полей значения по умолчанию.
Назначение полей структуры WNDCLASS приведены следующей таблице:
Указатель на строку, содержащую имя класса. Поскольку определенный в приложении класс доступен всем приложениям, имя класса не должно повторяться в разных приложениях.
Манипулятор копии, создающей класс окна.
Указатель на функцию поддержки окна.
Определяет свойства окна (например, автоматическое обновление области окна при изменении размеров или перемещении).
Определяет фон окна.
Определяет курсор, используемый в данном окне по умолчанию.
Определяет пиктограмму (icon), которая будет отображаться при переводе окна в неактивное состояние.
Указатель на имя меню окна, определенное в файле ресурсов.
Определяет число байт, которое необходимо дополнительно запросить у Windows под эту структуру.
Определяет число байт, которое необходимо дополнительно запросить у Windows для размещения всех структур, создаваемых совместно с данным классом.
После того, как поля структуры заполнены необходимо зарегистрировать окно с помощью функции RegisterClass ( &W), которой передается указатель на структуру класса окна.
При регистрации класса окна Windows копирует структуру WNDCLASS в системную область, чтобы другим копиям приложения уже не надо было ее регистрировать. Поэтому перед регистрацией класса окна следует проверить параметр hPrevInstance, значение которого Windows передает при вызове WinMain(). Если параметр hPrevInstance равен нулю, то других копий данного приложения нет, и необходимо зарегистрировать класс окна. Пример показывает способ регистрации класса окна:
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevlnstance,
LPSTR lpszCmdLine, int nCmdShow) .
{
WNDCLASS W;
if ( !hPrevInstance )
{
W.style = CS_HREDRAW | CS_VREDRAW ;
W.lpfnWndProc = WndProc ;
W.cbClsExtra = NULL ;
W.cbWndExtra = NULL ;
W.hInstance = hInstance;
W.hIcon = LoadIcon( NULL, IDI_APPLICATION );
W.hCursor = LoadCursor (NULL, IDC_ARROW) ;
W.hbrBackground = GetStockObject(WHITE_BRUSH);
W.lpszMenuName = NULL;
W.lpszClassName = szName ;
if (RegisterClass (&W)) return NULL;
}
}
Каждый класс окна имеет свое имя. Оно задается в полеlpszClassName структуры класса окна. При регистрации класса окна он сразу становится доступен всем другим приложениям Windows.
Инициализируется указателем на функцию окна WndProc(). Тем самым указывается, что функция WndProc() является управляющей функцией данного окна.
Поле hInstance.
Должно содержать индекс копии приложения. Этот индекс передается приложению как параметр функции WinMain().