Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Структура графических интерфейсов




Структура приложения Windows

 

Программа состоит из нескольких отчетливо выделенных блоков (разделов):

  • группы операторов препроцессора;
  • раздела прототипов используемых в программе прикладных функций;
  • главной функции WinMain();
  • оконной функции главного окна.

Рассмотрим последовательно эти блоки.

Программа начинается с двух директив препроцессора #include, с помощью которых к программе подключаются заголовочные файлы. Как уже отмечалось, заголовочный файл WINDOWS.H (а также целая группа дополнительных заголовочных файлов, подключаемых 'изнутри" файла WINDOWS.H) обеспечивает понимание компилятором смысла типов данных Windows, констант и макросов и подключение этого файла к исходному тексту программы является обязательным. Часть определений, используемых в программах (например, макроса GetStockBrush() и других с ним сходных, или макроса HANDLE_MSG, о котором речь будет идти ниже), содержится в файле WINDOWSX.H, который также необходимо включать практически во все приложения Windows.

Вслед за операторами препроцессора в нашем примере идет раздел прототипов, где определяется прототип единственной в данной программе прикладной функции WndProc(). Вообще-то в программе обязательно должны быть указаны прототипы всех используемых функций, как прикладных, так и системных. Вызовов системных функций Windows у нас довольно много: RegisterClass(), CreateWindowQ, GetMessage() и др. Однако прототипы всех этих функций уже определены в заголовочных файлах системы программирования. Так, прототип функции WinMain() описан в файле WINBASE.H:


int WINAPI WinMain(
HINSTANCE hlnstance,//Дескриптор текущего экземпляра приложения
HINSTANCE hPrevInstance,//Дескриптор предыдущего экземпляра приложения
LPSTR lpszCmdLine,//Указатель на параметры командной строки
int nCmdShow//Константа, характеризующая начальный вид окна
);

 

Легко увидеть, что заголовок функции WinMain() в нашей программе в точности соответствует приведенному выше прототипу (за исключением того, что мы опустили неиспользуемые параметры). Иначе и быть не может. Достаточно изменить хотя бы немного характеристики нашей функции WinMain(), как программа либо не пройдет этапа компиляции, либо не будет загружаться для выполнения, либо загрузится, но не будет работать.

Прототипы остальных использованных в программе функций Windows определены в файле WINUSER.H. Таким образом, о прототипах функций Windows можно не заботиться. Иное положение с оконной функцией WndProc(). Это прикладная функция, ее имя может быть каким угодно, и системе программирования это имя неизвестно. Более того, 120 Win32. Основы программирования при наличии в приложении нескольких окон (а практически всегда так и бывает) в программе описывается несколько оконных функций, по одной для каждого класса окон. Для всех используемых в программе оконных функций необходимо указывать их прото типы.

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


LRESULT CALLBACK WindowProc(
HWND hwnd,//Дескриптор окна
UINT uMsg, 11Код сообщения
WPARAM wParam,//Первый параметр сообщения
LPARAM lParam //Второй параметр сообщения
);

 

Опять можно заметить, что наша оконная функция, имея другое имя, в точности соответствует приведенному выше шаблону: принимает 4 параметра указанных типов и возвращает (в Windows) результат типа LRESULT. Кроме того, она объявлена с описателем CALLBACK. Что обозначает этот описатель?

В файле WINDEF.H символическое обозначение CALLBACK объявляется равнозначным ключевому слову языка C++ stdcall, которое определяет правила взаимодействия функций с вызывающими процедурами. В Win32 практически для всех функций действует так называемое соглашение стандартного вызова. Это соглашение определяет, что при вызове функции ее параметры помещаются в стек в таком порядке, что в глубине стека оказывается последний параметр, а на вершине - первый. Сама функция, разумеется, знает о таком расположении ее параметров и выбирает их из стека в правильном порядке. Для 16-разрядных функций Windows действует соглашение языка Паскаль, при котором порядок помещения параметров в стек обратный.

 




Поделиться с друзьями:


Дата добавления: 2014-10-15; Просмотров: 574; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.