- •Предисловие
- •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.2 Структура каркасного Windows-приложения
//Простейшая программа с главным окном
//Операторы препроцессора
#define STRICT //Строгая проверка типов переменных
#include <windows.h> //Два файла с определениями, макросами и прототи-
#include <windowsx.h> //пами функций Windows
#include <string.h> //Заголовочный файл с прототипом функции memset
//Прототипы используемых в программе функций Windows
void Register(HINSTANCE); //Функция регистрации класса окна
void Create(HINSTANCE, int); //Функция создания главного (единств.) окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Оконная функция
//Глобальные переменные, доступные всем функциям
char szClassName[]=”MainWindow”; //Произвольное имя класса главного окна
char szTitle[]=”Программа”; //Произвольный заголовок окна
//Главная функция WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR, int nCmdShow)
{
MSG msg; //Структура для временного хранения сообщений Windows
if (hPrevInstance==NULL) //Только для первого экземпляра приложения
Register(hInstance); // 1) Регистрация в Windows класса окна
Create(hInstance, nCmdShow); // 2) Создание и вывод на экран окна
while (GetMessage(&msg, NULL, 0, 0)) // 3) Цикл обработки сообщений:
DispatchMessage(&msg); // ждать сообщение, записать его в msg и передать WndProc
Return msg.wParam; //После выхода из цикла вернуться в Windows
}
//Функция Register() регистрации класса окна
void Register(HINSTANCE hInst)
{
WNDCLASS wc; //Структура для задания характеристик класса окна
memset(&wc, 0, sizeof(wc)); //Обнуление всех членов структуры
wc.lpszClassName=szClassName; //Записываем в структуру имя класса окна
wc.hInstance=hInst; //Дескриптор приложения
wc.lpfnWndProc=WndProc; //Определяем оконную функцию для главного окна
wc.hCursor=LoadCursor(NULL, IDC_ARROW); //Будет стандартный курсор мыши
wc.hIcon=LoadIcon(NULL, IDC_APPLICATION); //Будет стандартная пиктограмма
wc.hbrBackground=GetStockBrush(WHITE_BRUSH); //Будет белая кисть для фона окна
RegisterClass(&wc); //Вызов функции Windows регистрации класса окна
}
//Функция Create() создания и показа окна
void Create(HINSTANCE hInst, int nCmdShow)
{
HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 300, 100, HWND.DESKTOP, NULL, hInst, NULL); //Класс и заголовок окна, стиль окна и его координаты и размеры, родитель, меню, дескриптор, дополнительные параметры
ShowWindow(hwnd, nCmdShow); //Вызов функции Windows показа окна
}
//Оконная функция WndProc() главного окна
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY: //При завершении приложения пользователем
PostQuitMessage(0); //Параметр – код завершения пойдет в msg.wParam
return 0;
default: //В случае всех остальных сообщений Windows
return(DefWindowProc(hwnd, msg, wParam, lParam)); //Обработка их по умолчанию
}
}
Данная структура программы типична для простых приложений Windows. В программе описаны четыре функции: WinMain(), Register(), Create() и WndProc(). При запуске приложения Windows управление всегда передается функции WinMain(), которая должна присутствовать в любой программе. Более того, эта функция, имея в принципе циклический характер, выполняется в течение всей жизни приложения. Основное ее назначение – выполнение инициализирующих действий и организация цикла обработки сообщений, т. е. сообщить системе о новом для нее приложении, его свойствах и особенностях.
Для достижения этой цели WinMain() выполняет следующие действия:
определяет и регистрирует класс окна приложения;
создает и отображает окно приложения зарегистрированного класса;
создает и запускает цикл обработки сообщений для приложения;
завершает программу при получении оконной функцией соответствующего сообщения.
Сообщения Windows являются, пожалуй, самой важной концепцией этой системы. Каждый раз, когда происходит какое-либо событие, затрагивающее интересы программы (например, пользователь выбирает пункт меню или нажимает на кнопку в окне диалога), Windows посылает приложению сообщение об этом событии. Задача функции WinMain() заключается в приеме этого сообщения и передаче его второму важнейшему компоненту любого приложения Windows – функции главного окна или оконной функции. В отличие от главной функции WinMain(), имя которой изменять нельзя, имя оконной функции может быть любым (в нашем случае – WndProc()). У внутренних окон, расположенных внутри главного окна, будут другие оконные функции.
Оконная функция состоит из стольких фрагментов, сколько конкретных сообщений предполагается обрабатывать в данном приложении. Если, например, приложение должно отслеживать координаты мыши, то в оконную функцию следует включить фрагмент обработки сообщений о перемещении мыши; если, кроме этого, приложение должно реагировать на нажатие клавиш клавиатуры, в оконную функцию включается фрагмент обработки сообщений о нажатии клавиш. В соответствии с соглашениями ОС Windows оконная функция приложения должна быть видимой за пределами приложения, в котором она описана. Это связано с тем, что оконная функция вызывается самой ОС Windows при поступлении сообщений для каждого приложения.
Две остальные функции, входящие в состав приложения – Register()и Create() введены в программу просто для повышения ее модульности. Они являются подпрограммами, явно вызываемыми из функции WinMain(). Другими словами, в эти функции внесены некоторые действия, которые, вообще говоря, должны быть выполнены в функции WinMain().
Программа начинается с группы операторов препроцессора.
Определения дескрипторов, как и многих других специфических для Windows типов переменных, содержатся в заголовочном файле windows.h, который необходимо присоединить к компилируемой программе с помощью директивы препроцессора
#include <windows.h>.
Функции Win32 API в качестве передаваемых им параметров используют множество констант и данных определенной структуры. В пакете компилятора С/С++ эти данные расположены в заголовочных файлах, совокупность которых можно рассматривать как дерево с корнем в виде файла windows.h.
Вслед за операторами препроцессора идет раздел прототипов, где определяются прототипы всех функций пользователя, включенных в программу. Прототип функции WinMain(), также как и прототипы всех остальных функций Windows (RegisterClass(), GetMessage() и другие) описан в файле windows.h и не нуждается в повторном определении.
Функции Register() и Create() придуманы для повышения структурированности программы. Типы их параметров и возвращаемых значений были определены в известной степени произвольно. Иное положение с оконной функцией WndProc(). Эта функция вызывается из Windows при поступлении в приложение того или иного сообщения. Поэтому список параметров, а также тип возвращаемого значения и прочие характеристики этой функции определены совершенно жестко и изменены быть не могут. Функция принимает четыре параметра типов: HWND, UINT, WPARAM и LPARAM и возвращает результат типа LRESULT. Кроме этого, функция должна быть объявлена описателем CALLBACK, что эквивалентно far pascal, т. е. с дальней передачей параметров.
Глобальные переменные, описываемые до главной функции WinMain(), характерны тем, что они известны, или видимы во всех функциях и других блоках программы; их объявление позволяет сократить список параметров функций. Так, переменная szClassName используется в функциях Register() и Create() без передачи ее через параметры этих функций. Однако переменная szTitle используется лишь однажды при вызове функции Windows CreateWindow() и объявлять ее глобальной нет ни какой необходимости; в список глобальных эта переменная попала лишь ради наглядности и упрощения последующей модификации программы.