
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 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.2. Компоненты библиотеки Win32 api
Библиотека Win32 API содержит более двух тысяч функций, которые позволяют организовать взаимодействие ОС Windows и приложения [16–18]. Кроме того, библиотека включает в себя большое количество типов данных, многие из которых представляют собой переопределение стандартных типов данных языков C и C++, например, тип DWORD означает беззнаковое целое 32-битное число, или синоним типа unsigned long. Кроме простых типов, в библиотеку включены несколько типов структур, например, структура сообщения MSG. Поскольку программы в Windows управляются сообщениями, в библиотеку включены идентификаторы сообщений. Библиотека подключается с помощью заголовочного файла windows.h.
Венгерская нотация
Нотация – это форма записи идентификаторов. Венгерская нотация предложена программистом фирмы Microsoft, одним из разработчиков ОС Windows Карлом Симони. Традиционно используется для Windows-программ, в том числе для обозначений идентификаторов в библиотеке Win32 API. Венгерская нотация позволяет сделать программу более понятной и уменьшить объем комментариев за счет применения «говорящих» идентификаторов. Чтобы применить венгерскую нотацию, надо при задании идентификаторов использовать несколько несложных правил.
Правило 1. Идентификаторы следует начинать с префикса, который обозначает тип переменной и/или ее назначение. Префикс записывается с помощью строчных символов:
-
Префикс
Тип переменной
c
char
by
BYTE
i
int
x, y
short, координаты
cx, cy
short, счетчик (c – count)
b
BOOL (int)
w
WORD (unsigned short)
l
LONG (long)
dw
DWORD (unsigned long)
fn
функция
p
указатель
s
строка
sz
строка, завершающаяся символом 0 (ASCIIZ-строка)
Правило 2. Идентификатор может быть составлен из нескольких слов, при этом каждое слово начинается с прописной буквы, остальные буквы – строчные:
lpszMenuName длинный указатель на ASCIIZ-строку, содержащую имя меню,
lpfnWndProc длинный указатель на функцию WndProc() – оконную процедуру (Window Procedure).
Правило 3. Типы переменных (структур, классов и др.) записываются прописными буквами, а имена переменных, объектов – строчными:
MSG msg; //объявление структурной переменной,
HWND hwnd; //объявление дескриптора.
Примеры типов данных, определенных в Win32 API
BOOL, BOOLEAN |
Логический тип (TRUE, FALSE) |
CHAR |
Символ (8 бит) в кодировке ANSI Windows |
SHORT |
Целое знаковое число (16 бит) |
INT, LONG |
Целое знаковое число (32 бита) |
FLOAT |
Вещественное число с плавающей точкой |
INT64, LONG64, LONGLONG |
Целое знаковое число (64 бита) |
WORD, ATOM |
Целое беззнаковое число (16 бит) |
UINT, DWORD |
Целое беззнаковое число (32 бита) |
VOID |
Пустой тип |
WCHAR |
Символ (16 бит) в кодировке Unicode |
TCHAR |
CHAR или WCHAR (если в программе установлен макрос UNICODE) |
LPCSTR |
Длинный указатель (32 бита) на константную строку 8-битных символов |
LPSTR |
Длинный указатель (32 бита) на строку 8-битных символов |
LPCTSTR |
Длинный указатель (32 бита) на константную строку символов TCHAR |
LPTSTR |
Длинный указатель (32 бита) на строку символов TCHAR |
CALLBACK |
Функция обратного вызова: это обычная функция, адрес которой будет передан операционной системе для того, чтобы операционная система, а не приложение, осуществляла вызов функции |
LRESULT |
Знаковое целое |
Windows запрещает приложениям прямой доступ к своим объектам – окнам, меню, устройствам. Получить доступ к таким объектам приложение может с помощью специальных указателей на объекты, называемых дескрипторами. Существует еще одно название дескриптора – хэндл, от английского слова handle, которое можно перевести как средство управления, манипулирования. Дескриптор – это переменная, которая хранит некоторое числовое значение, ассоциированное с конкретным объектом. Ее значение не может быть получено или изменено пользователем, но оно известно операционной системе и может быть передано функциям Win32 API для доступа к соответствующему объекту.
Тип дескриптора записывается в соответствии с правилами венгерской нотации прописными буквами, начинается с префикса H и включает в себя имя объекта (табл. 20.1).
Структуры в Win32 API используются для описания основных объектов в Windows: окон, сообщений, графических объектов (табл. 20.2).
Таблица 20.1
Типы данных |
Тип дескриптора |
HANDLE |
Дескриптор какого-либо объекта |
HBITMAP |
Дескриптор растрового рисунка (изображения) |
HBRUSH |
Дескриптор кисти |
HCURSOR |
Дескриптор курсора |
HDC |
Дескриптор контекста устройства |
HICON |
Дескриптор иконки |
HINSTANCE |
Дескриптор приложения |
HMENU |
Дескриптор меню |
HPEN |
Дескриптор пера |
HWND |
Дескриптор окна |
Таблица 20.2
Структура |
Описание |
WNDCLASS, WNDCLASSEX |
Определяют оконный класс (имя класса окна, приложение, использующее окно, адрес оконной процедуры, атрибуты окна, курсор, иконки, меню) |
MSG |
Содержит информацию сообщения из очереди сообщений |
PAINTSTRUCT |
Содержит информацию для перерисовки окна |
POINT |
Содержит координаты точки x и y |
RECT |
Определят координаты и размеры рямоугольника |
BITMAP |
Определяет тип, ширину, высоту, цветной формат и данные растрового рисунка (файл типа bmp) |
Эти структуры объявлены в Win32 API следующим образом:
Структура POINT
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT;
Структура RECT
typedef tagRECT
{
LONG left; //x – координата левого верхнего угла
LONG top; //y – координата левого верхнего угла
LONG right; //x – координата правого нижнего угла
LONG bottom; //y – координата правого нижнего угла
} RECT;
Структура BITMAP
typedef struct tagBITMAP
{
LONG bmType; //всегда 0
LONG bmWidth; //ширина рисунка в пикселях
LONG bmHeight; //высота рисунка в пикселях
LONG bmWidthBytes; //число байтов в строке
//развертки
WORD bmPlanes; //количество цветовых плоскостей
WORD bmBitsPixel; //число битов на пиксель
LPVOID bmBits; //байтовый массив изображения
} BITMAP;
Структура PAINTSTRUCT
typedef struct tagPAINTSTRUCT
{
HDC hdc; //дескриптор контекста устройства
BOOL fErase; //TRUE – фон должен быть стерт
RECT rcPaint; //координаты закрашиваемой области
BOOL fRestore; //для внутреннего использования
BOOL fIncUpdate; //для внутреннего использования
BYTE rgbReserved[32]; //зарезервировано
} PAINTSTRUCT;
Структура MSG
typedef struct tagMSG
{
HWND hwnd; //дескриптор окна адресата
UINT msg ; //идентификатор (номер) сообщения
WPARAM wParam; //первый параметр сообщения
LPARAM lParam; //второй параметр сообщения
DWORD time; //время регистрации сообщения
POINT pt; //координаты курсора при регистрации
//сообщения
} MSG;
Сообщения – это информация о каком-либо происшествии в системе. Сообщение направляется приложению или окну приложения, которое в ответ должно выполнить некоторые действия. В программе сообщение представлено структурой типа MSG. Информация, помещаемая в структуру, зависит от типа сообщения. Тип сообщения зависит от источника сообщения и задается с помощью идентификатора (номера) сообщения (табл. 20.3).
Таблица 20.3
Сообщение Windows |
Описание |
WM_PAINT |
Возникает при изменении размеров или положения окна на экране, при перекрытии окон, при изменении информации, отображаемой окном; вызывает перерисовку окна или его части |
WM_COMMAND |
Посылается от стандартного элемента управления (например, кнопки) или от элемента меню родительскому окну, возникает при нажатии на кнопку или при выборе пользователем пункта меню |
WM_SYSCOMMAND |
Посылается при выборе команды системного меню окна или одной из кнопок управления окном (кнопки свертывания, развертывания, восстановления или закрытия окна) |
WM_CHAR |
Возникает при нажатии клавиши на клавиатуре |
WM_DESTROY |
Возникает, когда пользователь завершает работу приложения; посылается окну приложения для его разрушения и одновременно направляется оконной процедуре, минуя очередь сообщений; обработка сообщения должна предусматривать добавление в очередь сообщений приложения сообщения MW_QUIT, завершающего цикл обработки сообщений приложения |
WM_QUIT |
Посылается приложению при его завершении; это единственное сообщение, завершающее цикл обработки сообщений приложения |
Таблица 20.4
Функции библиотеки Win32 API |
Прототип |
Описание |
RegisterClassEx() |
ATOM RegisterClassEx(//буфер оконного //класса CONST WNDCLASSEX *lpwcx); |
Регистрация расширенного класса главного окна в системе; возвращает числовое значение, однозначно идентифицирующее зарегистрированный класс |
RegisterClass() |
ATOM RegisterClass( //буфер оконного //класса CONST WNDCLASS *lpwndClass); |
Регистрация класса главного окна в системе; возвращает числовое значение, однозначно идентифицирующее зарегистрированный класс |
CreateWindowEx() |
HWND CreateWindowEx( //дополнит. //атрибуты окна DWORD dwExStyle, //имя оконного //класса LPCTSTR lpClassName, //имя окна LPCTSTR lpWindowName, //атрибуты окна DWORD dwStyle, //горизонтальная //позиция окна int x, //вертикальная //позиция окна int y, //ширина окна int nWidth, //высота окна int nHeight, //дескриптор //родительского //окна HWND hWndParent, //дескриптор меню HMENU hMenu, //дескриптор //приложения HINSTANCE hInstance, //доп. данные окна LPVOID lpParam); |
Создание расширенного окна любого типа (главное окно, кнопка, статическое поле, окно редактирования и т. д.); стандартные оконные классы: "BUTTON" – кнопка, "STATIC" – статический текст, "EDIT"– окно редактирования, "LISTBOX" – список; атрибуты окна: WS_BORDER – окно с тонкой рамкой, WS_CAPTION – окно с тонкой рамкой и заголовком, WS_OWERLAPPEDWINDOW – окно с рамкой, заголовком, системным меню |
CreateWindow() |
HWND CreateWindow( //имя оконного //класса LPCTSTR lpClassName, //имя окна LPCTSTR lpWindowName, //атрибуты окна DWORD dwStyle, //горизонтальная //позиция окна int x, //вертикальная //позиция окна int y, //ширина окна int nWidth, //высота окна int nHeight, //дескриптор //родительского //окна HWND hWndParent, // дескриптор меню HMENU hMenu, //дескриптор //приложения HINSTANCE hInstance, //доп. данные окна LPVOID lpParam); |
Создание окна любого типа (главное окно, кнопка, статическое поле, окно редактирования и т. д.); стандартные оконные классы: "BUTTON" – кнопка, "STATIC" – статический текст, "EDIT"– окно редактирования, "LISTBOX" – список; атрибуты окна: WS_BORDER – окно с тонкой рамкой, WS_CAPTION – окно с тонкой рамкой и заголовком, WS_OWERLAPPEDWINDOW – окно с рамкой, заголовком, системным меню |
ShowWindow() |
BOOL ShowWindow( //дескриптор окна- //владельца HWND hwnd, //параметры ото//бражения int nCmdShow); |
Устанавливает состояние отображаемого окна; hwnd – дескриптор окна, nCmdShow – состояние окна (SW_SHOWNORMAL – нормальное отображение, размеры окна по умолчанию; SW_MAXIMIZE – окно во весь экран) |
UpdateWindow() |
BOOL UpdateWindow( //дескриптор //обновляемого //окна; HWND hwnd); |
Обновляет рабочую область окна, посылая сообщение WM_PAINT; при нормальном завершении возвращает 0 |
GetMessage() |
GetMessage( //буфер для //сообщения LPMSG lpMsg, //дескриптор //окна-адресата HWND hwnd, //первое сообщение UINT wMsgFilterMin, //второе сообщение, UINT wMsgFilterMax); |
Чтение сообщения из очереди сообщений и размещение информации сообщения в структуре типа MSG; возвращает значение 0, если получено сообщение WM_QUIT, и ненулевое значение при получении любого другого сообщения; параметры типа UINT позволяют фильтровать сообщения, нулевые значения этих параметров означают отсутствие фильтрации сообщений |
TranslateMessage() |
BOOL TranslateMessage( //информация //сообщения CONST MSG *lpmsg); |
Переводит сообщения от виртуальных клавиш в символьные сообщения |
DispatchMessage() |
LRESULT DispatchMessage( //информация //сообщения CONST MSG *lpmsg); |
Посылает сообщение оконной процедуре; возвращает значение, полученное после завершения работы оконной процедуры |
MessageBox() |
int MessageBox( //дескриптор окна- //владельца HWND hwnd, //текст сообщения LPCTSTR lpText, //заголовок окна LPCTSTR lpCaption, //стиль окна UINT uType); |
Создает и отображает окно сообщений: текст сообщения, заголовок и набор кнопок, задаваемый последним параметром; возвращаемое значение – номер выбранной при закрытии окна кнопки (константы IDOK, IDCANCEL, IDNO и т. д.) |
DefWindowProc() |
LRESULT DefWindowProc( //дескриптор окна HWND hwnd, //номер сообщения UINT imsg, //параметр //сообщения WPARAM wParam, //параметр //сообщения LPARAM lParam); |
Выполняет обработку сообщений главного окна по умолчанию |
PostQuitMessage() |
VOID PostQuitMessage (int nExitCode); |
Вставляет в цикл обработки сообщений приложения сообщение WM_QUIT, nExitCode – значение, используемое в качестве параметра wParam сообщения WM_QUIT, обычно равно 0 |