18106

Функция WinMain

Доклад

Информатика, кибернетика и программирование

Функция WinMain Если вы создаете приложение Windows с использованием языка программирования C прежде всего вы должны создать функцию с именем WinMain которая является аналогом функции main в программах для MSDOS. Функция WinMain должна быть определена следующим образом: int PASCAL WinMainH...

Русский

2013-07-06

41 KB

5 чел.

Функция WinMain

Если вы создаете приложение Windows с использованием языка программирования C++, прежде всего вы должны создать функцию с именем WinMain, которая является аналогом функции main в программах для MS-DOS. Функция WinMain должна быть определена следующим образом:

int PASCAL

WinMain(HINSTANCE hInstance,

       HINSTANCE hPrevInstance,

       LPSTR     lpszCmdLine,

       int       nCmdShow)

{

// Тело функции

}

В определении функции WinMain использованы типы - PASCAL, HINSTANCE, LPSTR. Эти типы описаны в include-файле с именем windows.h.

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

Первые два параметра имеют тип HINSTANCE, который в Windows является 16-разрядным идентификатором. Параметр с именем hInstance является идентификатором приложения. Любое приложение перед запуском получает свой уникальный идентификатор, который передается ему через параметр hInstance.

Так как Windows - мультизадачная среда, вы можете запустить одновременно несколько приложений, и каждое приложение будет иметь свой, уникальный идентификатор.

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

Анализируя параметр hPrevInstance, приложение может выполнять различные действия в зависимости от того, была ли уже загружена на момент запуска другая копия приложения.

Третий параметр функции WinMain имеет имя lpszCmdLine. Он имеет тип LPSTR, который определяется в include-файле windows.h следующим образом:

#define FAR _far

typedef char FAR* LPSTR;

Параметр lpszCmdLine является дальним указателем на символьную строку. Программе MS-DOS при запуске из командной строки вы можете передать параметры. Эти параметры программа получает через параметры argc и argv функции main. Аналогично, при запуске приложения Windows вы также можете указать параметры. Эти параметры должны быть записаны в текстовом виде после имени exe-файла приложения. Параметры можно задать для любой пиктограммы любой группы Program Manager. Для этого выберите из меню "File" строку "Properties" и в поле "Command Line" после пути к exe-файлу приложения допишите необходимые параметры. После запуска приложение может проанализировать строку параметров, пользуясь переменной lpszCmdLine как дальним указателем на строку параметров. Учтите, что перед передачей параметров приложению никакой обработки строки параметров не производится, приложение получает строку параметров точно в таком виде, в котором она была указана при запуске. Последний параметр функции WinMain имеет имя nCmdShow и тип int. Этот параметр содержит рекомендации приложению относительно того, как оно должно нарисовать свое главное окно. Любое приложение может увеличивать свое окно до размеров экрана видеомонитора (или до некоторого предельного размера, зависящего от самого приложения) или уменьшать его, сворачивая в пиктограмму. При запуске приложения с помощью строки "Run..." меню "File" приложения Program Manager кроме командной строки вы можете указать режим запуска "Run Minimized". В этом режиме правильно спроектированное приложение (способное анализировать параметр nCmdShow) при запуске сразу сворачивает свое главное окно в пиктограмму.

Окно и функция окна

С точки зрения пользователя Windows окном является прямоугольная область экрана, в которой приложение может что-либо рисовать или писать, а также выполнять все операции взаимодействия с пользователем.

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

Обычно приложение создает одно, главное окно большого размера, которое ограничено сверху полосой меню (если есть меню) или заголовком и рамкой изменения размера с других сторон.

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

Окна Windows как объекты

В терминах языка C++ объект называется классом, который представляет из себя совокупность данных и методов, с помощью которых эти данные должны обрабатываться. Например, вы можете определить класс как совокупность простых переменных и структур, а также функций-членов (нам больше нравится название "функция-метод" или просто "метод"), выполняющих обработку данных, записанных в этих переменных или структурах.

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

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

Этот механизм основан на использовании так называемой функции окна (window function) и сообщений.

Функция окна

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

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

Для каждого класса окна определяется функция окна. При создании окна необходимо указать, к какому классу оно будет принадлежать и, соответственно, какую функцию окна будет использовать для обработки сообщений. Приложения могут создавать собственные классы окна, определяя свои функции окна (и следовательно, свои методы), либо использовать стандартные, определенные в Windows классы окна.

Обработка сообщений

Большинство сообщений создают драйверы устройств ввода/вывода, таких, как клавиатура, мышь или таймер. Драйверы создают сообщения при поступлении аппаратных прерываний. Например, когда вы нажимаете и затем отпускаете клавишу, драйвер обрабатывает прерывания от клавиатуры и создает несколько сообщений. Аналогично сообщения создаются при перемещении мыши или в том случае, когда вы нажимаете кнопки на корпусе мыши. Можно сказать, что драйверы устройств ввода/вывода транслируют аппаратные прерывания в сообщения. Прежде всего сообщения попадают в системную очередь сообщений Windows. Системная очередь сообщений одна. Далее из нее сообщения распределяются в очереди сообщений приложений. Для каждого приложения создается своя очередь сообщений.

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

Простейший цикл обработки сообщений состоит из вызовов двух функций - GetMessage и DispatchMessage.

Функция GetMessage предназначена для выборки сообщения из очереди приложения. Сообщение выбирается из очереди и записывается в область данных, принадлежащую приложению.

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

MSG msg;

while(GetMessage(&msg, 0, 0, 0))

{

 DispatchMessage(&msg);

}

Завершение цикла обработки сообщений происходит при выборке из очереди специального сообщения, в ответ на которое функция GetMessage возвращает нулевое значение. Тип MSG описан в файле windows.h.

Функция окна получает сообщения при создании окна, в процессе работы приложения, а также при разрушении окна.

Сообщение с кодом WM_CREATE передается функции окна в момент создания окна. Функция окна при обработке этого сообщения выполняет инициализирующие действия. Коды сообщений определены в файле windows.h, включаемом в исходные тексты любых приложений Windows.

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


 

А также другие работы, которые могут Вас заинтересовать

68150. Драма-діалог Лесі Українки та діалогічна традиція в європейських літературах 204.5 KB
  Драматичні твори Лесі Українки завдяки своєрідності поєднання в жанрі філософського контексту й драматичної форми дозволяють виділити в них діалогізм філософськоестетичний спосіб мислення та діалогічність здатність до комунікації і окреслити їх поняттям драмадіалог. Творчі пошуки Лесі Українки...
68151. ТРУБНО-ПЕРИТОНЕАЛЬНА БЕЗПЛІДНІСТЬ ТА ДИСГОРМОНАЛЬНІ ЗАХВОРЮВАННЯ МОЛОЧНИХ ЗАЛОЗ 456.5 KB
  Відновлення репродуктивної функції жінок які страждають на безплідність частота якої коливається у межах від 10 до 20 є актуальною медичною та соціальною проблемою В. Тому дисгормональні захворювання молочних залоз ДЗМЗ являють значний інтерес з одного боку як можливий фон для виникнення злоякісного процесу...
68152. ОСНОВОПОЛОЖНІ ПРИНЦИПИ ПРАВА ЯК ІНТЕГРУЮЧИЙ ЕЛЕМЕНТ ПРАВОВОЇ СИСТЕМИ УКРАЇНИ 152 KB
  Протягом багатьох років принципи права є однією з центральних тем у теорії держави і права. В юридичній літературі слушно зазначається, що на підставі та з урахуванням принципів формується вся система права, приймаються юридичні акти, здійснюється правозастосування і тлумачення права.
68153. ЗАХОДИ АДМІНІСТРАТИВНОГО ВПЛИВУ, ЩО ЗАСТОСОВУЮТЬСЯ ДО НЕПОВНОЛІТНІХ 150 KB
  Така загрозлива тенденція зумовила у свою чергу необхідність пошуку оптимальних шляхів до покращання ситуації зокрема вжиття ефективних заходів адміністративного впливу спрямованих як на виховання так і на попередження адміністративних проступків серед молоді. Так до заходів адміністративної...
68154. ПРАГМАТИКО-ФУНКЦІОНАЛЬНІ ОСОБЛИВОСТІ ПОЛІТИЧНОГО ДИСКУРСУ США ТА УКРАЇНИ ХХІ СТОЛІТТЯ 948 KB
  Метою дисертаційної роботи є виявлення лексико-семантичних та синтактико-стилістичних типологічних особливостей сучасного українського й американського політичного дискурсу що зумовлює вирішення таких завдань: структурувати дефініції термінів політичний...
68155. КОНЦЕПТУАЛЬНА МЕТАФОРА У КЛІШЕ АНГЛОМОВНОГО НАУКОВОГО ТЕКСТУ 204.5 KB
  Для досягнення цієї мети в роботі вирішуються такі конкретні завдання: зясування ролі метафори у формуванні змісту наукового тексту а також ролі клішеметафор як стилістичного засобу мови науки; визначення основних положень теорії концептуальної метафори у їх взаємозвязку з положеннями попередніх...
68156. ПСИХОЛОГІЧНІ ОСОБЛИВОСТІ ВІКОВОЇ ДИНАМІКИ СТРАХІВ У НАВЧАЛЬНІЙ ДІЯЛЬНОСТІ ШКОЛЯРІВ 240 KB
  Динамічний розвиток сучасного суспільства висуває до людини все більш високі вимоги. Для того, щоб бути активним учасником подій, людина має мобілізувати усі сили, як розумові, так і фізичні, що передбачає високий рівень психологічного напруження. Не секрет, що шкільне навчання часто супроводжується виникненням страхів.
68157. ОСНОВИ ТЕХНОЛОГІЧНОЇ ПІДГОТОВКИ АВІАЦІЙНОГО ВИРОБНИЦТВА СКЛАДНОПРОФІЛЬНИХ ВИРОБІВ НА БАЗІ АНАЛІТИЧНИХ МОДЕЛЕЙ ПРОЦЕСУ ФОРМОУТВОРЕННЯ 13.91 MB
  Виникає необхідність у зміненні підходів до теорії формоутворення. Процеси формоутворення при цьому багато в чому визначаються керівними програмами аналітичними залежностями інтерполяційних функцій законами розгону й гальмування робочих органів обладнання. Крім того шляхом застосування аналітичних моделей...
68158. ПРАВОВЕ РЕГУЛЮВАННЯ МІЖНАРОДНОЇ ТЕХНІЧНОЇ ДОПОМОГИ: СТАН, ТЕНДЕНЦІЇ ТА ПЕРСПЕКТИВИ РОЗВИТКУ 168.5 KB
  Розвиток міжнародних економічних відносин між країнами з різним рівнем економічного розвитку відбувається під впливом глобалізації економіки та світових інтеграційних процесів. Частиною цих відносин є відносини між донорами (міжнародними організаціями та індустріально розвиненими країнами) та країнами-реципієнтами...