- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
20.5. Структура программы для ос Windows
В предыдущих разделах рассмотрены отдельные компоненты программы, использующей библиотеку Win32 API. Приведем текст стандартной простейшей программы, использующей библиотеку Win32 API.
Программа отображает на экране главное окно с заголовком, кнопками управления окном и текстом «Привет!» (рис. 20.2):
Рис. 20.2. Главное окно
//Подключение библиотеки Win32 API
#include <windows.h>
//прототип оконной процедуры
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//главная функция
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
static char szAppName[]="Hello";
HWND hwnd;
MSG msg;
WNDCLASSEX ws; //заполнение структуры оконного
//класса
ws.cbSize = sizeof(ws); //размер структуры
ws.style = CS_HREDRAW | CS_VREDRAW; //стиль окна
//перерисовка окна при изменении горизонтальных
//(CS_HREDRAW)
//и вертикальных(CS_VREDRAW) размеров окна
ws.lpfnWndProc = WndProc; //Указатель на оконную
//процедуру
ws.cbClsExtra = 0; //доп. поле для данных класса
ws.cbWndExtra = 0; //доп. поле для данных окна
ws.hInstance = hInstance; //дескриптор приложения
ws.hIcon = LoadIcon(NULL,IDI_APPLICATION); //дескриптор //иконки
ws.hCursor = LoadCursor(NULL,IDC_ARROW); //дескриптор //курсора
ws.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); //кисть
//(цвет фона)
ws.lpszMenuName = NULL; //имя меню или NULL
ws.lpszClassName = szAppName; //имя класса окна
ws.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//маленькая иконка
//регистрация оконного класса в системе
RegisterClassEx(&ws);
//создание окна – получение дескриптора окна
hwnd = CreateWindow(szAppName,
"Привет, мир!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//отображение окна на экране и перерисовка
//элементов управления
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//Цикл обработки сообщений
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//оконная процедура
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,
WPARAM wParam, LPARAM lParam)
{
HDC hdc; //дескриптор контекста устройства
PAINTSTRUCT ps; //структура для хранения
//атрибутов рисования
int x=100;
int y=100;
char str[]="Привет!";
switch (iMsg)
{
//перерисовка окна
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); //начало
//рисования в контексте hdc
SetBkColor(hdc,RGB(0,0,255)); //установка
//цвета фона
SetTextColor(hdc,RGB(200,200,10));
//установка цвета текста
TextOut(hdc,x,y,(LPCTSTR)str,strlen(str)); //вывод текста на экран
EndPaint(hwnd,&ps); //завершение рисования
//в контексте hdc
return (0);
//завершение работы программы
case WM_DESTROY:
PostQuitMessage(0);
return (0);
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Как видно из текста программы, в оконную процедуру включена обработка двух сообщений – WM_PAINT и WM_DESTROY. Остальные сообщения обрабатываются по умолчанию.
Рассмотрим обработку сообщения WM_PAINT. Так как перерисовка окна связана с обращением к устройству вывода – дисплею, а в Windows приложениям запрещен прямой доступ к устройствам, формирование новой картинки сначала происходит в специальной области памяти, называемой контекстом устройства, а затем Windows сформированную программой в контексте устройства картинку выводит на экран. Для работы с контекстом устройства создается специальная переменная типа HDC – дескриптор контекста устройства hdc. Функция BeginPaint() для окна hwnd создает контекст устройства, возвращая значение дескриптора контекста устройства, и заполняет структуру типа PAINTSTRUCT информацией, требуемой для обновления рабочей области окна. Функции SetBkColor() и SetTextColor() устанавливают цвеа фона и текста для указанного контекста, используя функцию RGB(). Параметры функции RGB() задаются числами в диапазоне от 0 до 255 и представляют собой интенсивность базовых компонентов цвета – красного, зеленого и синего. Функция TextOut() выводит в заданную координатами x и y область контекста устройства строку текста фиксированной длины. Для определения длины выводимой строки используется функция strlen(). Завершает перерисовку функция EndPaint(), которая освобождает дескриптор контекста устройства. Для следующей перерисовки потребуется заново создавать контекст устройства.
