- •Предисловие
- •1.1. Общие сведения о программах, лексемах и алфавите языка
- •1.3. Идентификаторы и служебные слова
- •2. Константы: целые, вещественные (с плавающей точкой), перечислимые, символьные (литерные), строковые (строки или литерные строки)
- •3. Операции. Знаки операций. Унарные, бинарные и тернарные операции. Приоритеты операций.
- •3.1 Знаки операций
- •3.2 Унарные операции
- •3.3 Бинарные операции.
- •3.4 Приоритеты операций
- •4. Переменные. Определения и описания. Спецификатор typedef.
- •4.1 Переменные. Определения и описания.
- •4.2 Класс памяти
- •5. Базовые и производные типы данных. Массивы. Указатели, ссылки и адреса. Структуры. Поля битов. Объединения
- •5.1 Массивы
- •5.2 Указатели, ссылки и адреса объектов
- •5.3 Структуры
- •5.3 Поля битов
- •5.4 Объединения
- •6. Операторы
- •6.1 Оператор выражение
- •6.2 Пустой оператор
- •6.3 Составной оператор
- •6.4 Оператор if
- •If (выражение) оператор-1; [else оператор-2;]
- •6.5 Оператор switch
- •6.6 Оператор break
- •6.7 Оператор for
- •6.8 Оператор while
- •6.8 Оператор do while
- •6.9 Оператор continue
- •6.10 Оператор return
- •6.11 Оператор goto
- •7. Функции
- •7.1 Определения, описания и вызовы функций
- •7.2 Начальные (умалчиваемые) значения параметров.
- •7.3 Функции с переменным количеством параметров
- •7.4 Перегрузка функций.
- •7.5 Ссылки и параметры-ссылки.
- •7.6 Шаблоны функций.
- •8. Технологии программирования.
- •8.1 Введение.
- •8.2 Модульное программирование.
- •8.3 Нисходящее программирование.
- •8.4 Структурное программирование.
- •8.5 Понятия объекта, класса объектов.
- •8.6 Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм.
- •9.1 Тип данных - класс.
- •9.2 Доступность компонентов класса
- •9.3 Конструктор и деструктор
- •9.4 Компоненты-данные и компоненты-функции. Статические и константные компоненты класса
- •10. Указатели на компоненты класса
- •10.1 Указатели на компоненты- данные.
- •10.2 Указатели на компоненты- функции.
- •10.3 Указатель this
- •11. Друзья классов
- •11.1 Дружественная функция
- •11.2 Дружественный класс
- •12. Наследование
- •12.1 Определение производного класса.
- •12.2 Конструкторы и деструкторы производных классов
- •13. Полиморфизм
- •13.1 Виртуальные функции.
- •13.2 Абстрактные классы
- •14. Шаблоны классов
- •15. Перегрузка операций
- •15.1 Общие сведения о перегрузке стандартных операций
- •15.2 Перегрузка унарных операций
- •15.3 Перегрузка бинарных операций
- •15.5 Перегрузка операции вызова функции
- •15.6 Перегрузка операции присваивания
- •15.7 Основные правила перегрузки операций.
- •16. Обработка исключительных ситуаций
- •16.1 Операторы try, throw, catch
- •16.2 Универсальный обработчик исключений
- •17. Структура Windows-приложения
- •17.2 Структура каркасного Windows-приложения
- •17.3 Главная функция WinMain()
- •17.4 Сообщения Windows
- •17.5 Класс окна. Регистрация и его характеристики
- •17.6 Создание и показ окна
- •17.7 Цикл обработки сообщений
- •17.8 Оконная функция
- •17.9 Завершение выполнения приложения
- •18. Препроцессор
- •18.1 Общие пpеобpазования
- •18.2 Директивы Препроцессора
- •18.3 Подключаемые файлы
- •18.4. Директива '#include'.
- •18.5 Однократно подключаемые файлы
- •18.6 Макросы
- •18.7 Стрингификация
- •18.8 Объединение
- •18.9 Удаление макросов
- •18.10 Условия
- •19. Разработка Windows приложений с использованием библиотеки классов mfc (microsoft foundation class library)
- •19.1 Некоторые сведения о программировании Windows-приложений
- •19.2 Преимущества использования mfc
- •19.4 Библиотека mfc
- •20. Простейшие mfc-приложения
- •20.1 Приложение без главного окна
- •20.2 Приложение с главным окном
- •20.3 Обработка окном сообщений
17.3 Главная функция WinMain()
Запуская приложение, мы фактически передаем управление программам Windows, которые загружают в память нашу программу и вызывают из нее главную функцию приложения, которая должна иметь имя WinMain() и описатель WINAPI (эквивалентный far pascal). Вызывая функцию WinMain(), Windows передает ей четыре обусловленные параметра.
Первый параметр типа HINSTANCE, поступающий в локальную переменную hInstance, представляет собой дескриптор данного экземпляра приложения. Он назначается приложению при его запуске системой Windows и служит для его идентификации. Многие функции Windows используют этот дескриптор в качестве входного параметра, поэтому в дальнейшем мы будем сохранять его в соответствующей глобальной переменной. В данной программе сохранение hInstance не предусмотрено. Второй параметр того же типа (локальная переменная hPrevInstance) является дескриптором предыдущего экземпляра этого же приложения и имеет смысл, если приложение запускается в нескольких экземплярах. Если предыдущие экземпляры отсутствуют, т. е. приложение запущено в единственном экземпляре, этот параметр равен 0. Анализ аргумента hPrevInstance позволяет определить, является ли данный экземпляр приложения единственным. Эта методика будет описана ниже.
Следующий параметр представляет собой дальний указатель на строку, содержащую параметры командной строки запуска приложения, если при его запуске были указаны какие-либо параметры. Поскольку мы не предполагаем запускать наше приложение с параметрами, и этот аргумент функции WinMain() нам не нужен, в заголовке функции указан его тип LPSTR, а сам аргумент пропущен.
Наконец, последний параметр nCmdShow характеризует режим запуска. Режим запуска можно установить, если, создав ярлык для нашего приложения, открыть для него окно Свойства, перейти на вкладку Ярлык и раскрыть список Окно. Если далее выбрать в этом списке пункт Свернутое в значок, Windows, запуская приложение, будет свертывать его в пиктограмму. В этом случае из Windows в WinMain() поступает значение nCmdShow, равное символической константе SW_SHOWMINNOACTIVE=7. Если же включен режим Стандартный размер, окно приложения на экране развертывается до заданного в самом приложении размера, а в WinMain() поступает константа SW_SHOWNORMAL=1. Полученное значение nCmdShow используется затем в качестве параметра при вызове функции Windows ShowWindow(), хотя в ShowWindow() можно передать и любое другое допустимое значение параметра, например, SW_SHOWMAXIMIZE, если желательно развернуть окно приложения на весь экран.
Разумеется, имена локальных аргументов для функции WinMain(), как и для любой другой функции, пользователь может выбирать по своему усмотрению.
В типичном приложении Windows главная функция WinMain() должна выполнить, по меньшей мере, три важнейших процедуры:
Зарегистрировать в Windows класс главного окна. Если помимо главного окна планируется выводить на экран внутренние, порожденные окна, то их классы тоже регистрируются. Windows выводит на экран и обслуживает только зарегистрированные окна.
Создать главное окно и показать его на экране. Порожденные окна также необходимо создать, хотя это можно сделать и позже и не обязательно в функции WinMain().
Организовать цикл обработки сообщений, поступающих в приложение. Вся дальнейшая жизнь приложения будет, фактически, состоять в бесконечном выполнении этого цикла и обработке поступающих в приложение сообщений. Запущенное приложение Windows обычно функционирует до тех пор, пока пользователь не подаст команду его завершения, что приведет к завершению главной функции и удалению приложения из списка действующих задач.
Функция WinMain() после своего завершения возвращает в Windows целочисленный результат, который системой не анализируется, но может быть использован при отладке программы, поскольку интерактивный отладчик tdw.exe после завершения отлаживаемой программы выводит на экран возвращаемое функцией WinMain() значение.