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.


 

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

64952. Поминки - «тыш» в контексте взаимоотношений Руси - России с Золотой Ордой и Крымским юртом 75 KB
  Многие историки тяготели и тяготеют к той точке зрения что изначально поминки являлись подарками позже со второй половины XVI в. слово поминки либо в сочетании с другими терминами либо без них обязательно присутствует в терминологии употреблявшейся русской стороной для обозначения выплат Крымскому ханству...
64953. Знаменный комплекс в военно-политической культуре средневековых кочевников Центральной Азии 126 KB
  Предметом исследования данной статьи является такой феномен военно-политической культуры средневековых кочевников Центральной Азии имеющий ярко выраженные корни в этнографическом субстрате как знамя или знаменный комплекс. От этого значения идет ряд производных например...
64954. Ненайденные монеты Каракорума 172.5 KB
  Распределение найденных монет собранных на любом городище по датам их выпуска и месту чекана позволяют определить с высокой степенью достоверности торговые связи с другими странами и периоды активного денежного обращения в раскапываемых городах.
64955. Письменные источники о Чингисхане 120.5 KB
  В первой части до описания времени Чингисхана почти дословно повторяется индийская история о проповеди Будды Шакьямуни в Магадхе3 двух учений тантры и сутры. У Джувейни дом Чингисхана находится в Куланбаши название которого нет в текстах...
64956. О времени основания Казани 48.5 KB
  Все гипотезы о времени основания Казани базируются на использовании: даты первого упоминания имени города в исторических источниках; этимологической интерпретации имени города; археологических эпиграфических и нумизматических материалов...
64957. Степные империи древней Евразии 204 KB
  История и культура енисейских кыргызов представлены в источниках неравномерно. В одних случаях доминируют письменные свидетельства, в других — данные археологии. Иногда они тесно коррелируют друг с другом, и эти периоды оказываются для изучения наиболее результативными.
64958. СУДЕБНАЯ СИСТЕМА МОНГОЛИИ В XIII В. ПО «ГОЛУБОЙ КНИГЕ» УКАЗОВ ЧИНГИСХАНА 56.5 KB
  Монгольского государства на рубеже XII-XIII веков означало прежде всего создание государственного аппарата формирование принципов управления и судопроизводства. издан указ о назначении Шихихутуга главным судьей во всей державе. Назначенный указом Чингисхана Бэлгудэй позже Шихихутуг имели статус главного судьи сам хан находился на вершине пирамиды.
64959. Белые пятна в этногенезе дэрбэт 91 KB
  Он покинул Тибет из-за начавшейся междоусобной войны и прибыл в страну Джад («чужой»). Это событие отнесено Лубсан Данзаном к VII в. Обосновавшись в урочище Бурхан-Халдун, Бортэ-Чино женился и основал свой род «монгол». С того времени минуло примерно 400 лет, когда после смерти Дува-Сохор...
64960. НЕКОТОРЫЕ ВОПРОСЫ НУМИЗМАТИКИ И ИСТОРИИ СТАРОГО ОРХЕЯ (ЗОЛОТООРДЫНСКИЙ ПЕРИОД) 143 KB
  Монеты являются одним из наиболее информативных и разнообразных источников по истории стран Средневековой Европы. Монеты выявленные на территории любого города являются своеобразным посланием к городу и миру. Бырни мне удалось ознакомиться с частью монет из Старого Орхея хранящихся в Музее Института археологии и этнографии...