- •Содержание
- •ВВЕДЕНИЕ
- •1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД
- •2. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
- •2.1. Абстрактные типы данных
- •2.2. Базовые принципы объектно-ориентированного программирования
- •2.3. Основные достоинства языка С++
- •2.4. Особенности языка С++
- •2.4.1. Ключевые слова
- •2.4.2. Константы и переменные
- •2.4.3. Операции
- •2.4.4. Типы данных
- •2.4.5. Передача аргументов функции по умолчанию
- •2.5.1. Объект cin
- •2.5.2. Объект cout
- •2.5.3. Манипуляторы
- •3.1. Объекты
- •3.2. Понятие класса
- •3.3. Конструктор копирования
- •3.4. Конструктор explicit
- •3.5. Указатель this
- •3.6. Встроенные функции (спецификатор inline)
- •3.7. Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •3.8. Вложенные классы
- •3.9. Static-члены (данные) класса
- •3.10. Компоненты-функции static и const
- •3.11. Proxi-классы
- •3.12. Ссылки
- •3.12.1. Параметры ссылки
- •3.12.2. Независимые ссылки
- •3.13. Пространства имен
- •3.13.3. Ключевое слово using как объявление
- •3.13.4. Псевдоним пространства имен
- •3.14. Практические приемы ограничения числа объектов класса
- •4. НАСЛЕДОВАНИЕ
- •4.1.1. Конструкторы и деструкторы при наследовании
- •4.2. Виртуальные функции
- •4.3. Абстрактные классы
- •4.4. Виртуальные деструкторы
- •4.6. Виртуальное наследование
- •5.2. Перегрузка операторов
- •5.2.2. Перегрузка унарного оператора
- •5.2.3. Дружественная функция operator
- •5.2.4. Особенности перегрузки операции =
- •5.2.5. Перегрузка оператора []
- •5.2.6. Перегрузка оператора ()
- •5.2.7. Перегрузка оператора ->
- •5.2.8. Перегрузка операторов new и delete
- •5.3. Преобразование типа
- •5.3.1. Явные преобразования типов
- •6. ШАБЛОНЫ
- •6.1. Параметризированные классы
- •6.2. Передача в шаблон класса дополнительных параметров
- •6.3. Шаблоны функций
- •6.4. Совместное использование шаблонов и наследования
- •6.5. Шаблоны класса и friend-функции
- •6.6. Некоторые примеры использования шаблона класса
- •6.6.1. Реализация smart-указателя
- •6.6.2. Задание значений параметров класса по умолчанию
- •7.2. Состояние потока
- •7.3. Строковые потоки
- •7.4. Организация работы с файлами
- •7.5. Организация файла последовательного доступа
- •7.6. Создание файла произвольного доступа
- •7.7. Основные функции классов ios, istream, ostream
- •8. ИСКЛЮЧЕНИЯ В С++
- •8.2. Перенаправление исключительных ситуаций
- •8.3. Исключительная ситуация, генерируемая оператором new
- •8.6. Спецификации исключительных ситуаций
- •8.7. Задание собственного неожиданного обработчика
- •9. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ (STL)
- •9.3. Категории итераторов
- •9.4. Операции с итераторами
- •9.5. Контейнеры последовательностей
- •9.5.2. Контейнер последовательностей list
- •9.5.3. Контейнер последовательностей deque
- •9.6. Ассоциативные контейнеры
- •9.6.1. Ассоциативный контейнер multiset
- •9.6.2. Ассоциативный контейнер set
- •9.6.3. Ассоциативный контейнер multimap
- •9.7.1. Адаптер stack
- •9.7.2. Адаптер queue
- •9.7.3. Адаптер priority_queue
- •9.8. Алгоритмы
- •9.8.1. Алгоритмы сортировки sort, partial_sort, sort_heap
- •9.8.2. Алгоритмы поиска find, find_if, find_end, binary_search
- •9.8.3. Алгоритмы fill, fill_n, generate и generate_n
- •9.8.4. Алгоритмы equal, mismatch и lexicographical_compare
- •9.8.6. Алгоритмы работы с множествами
- •9.8.7. Алгоритмы swap, iter_swap и swap_ranges
- •9.8.8. Алгоритмы copy, copy_backward, merge, unique и reverse
- •10. ПРИМЕРЫ РЕАЛИЗАЦИИ КОНТЕЙНЕРНЫХ КЛАССОВ
- •10.1. Связанные списки
- •10.1.1. Реализация односвязного списка
- •10.2. Реализация бинарного дерева
- •11. ПРОГРАММИРОВАНИЕ ДЛЯ WINDOWS
- •11.1. Система, управляемая сообщениями
- •11.2. Управление графическим выводом
- •11.3. Контекст устройства
- •11.3.1. Экран
- •11.3.2. Принтер
- •11.3.3. Объект в памяти
- •11.3.4. Информационный контекст
- •11.4. Архитектура, управляемая событиями
- •11.5. Исходный текст программы
- •11.7. Некоторые новые типы данных
- •11.8. Венгерская нотация
- •11.9. Точка входа программы
- •11.11. Создание окна
- •11.12. Цикл обработки сообщений
- •11.13. Оконная процедура
- •11.14. Обработка сообщений
- •11.15. Обработка сообщений функцией DefWindowProc
- •11.16. Синхронные и асинхронные сообщения
- •11.17. Еще один метод получения описателя контекста устройства
- •11.19. Полосы прокрутки
- •Литература
чениями по умолчанию. Частный контекст устройства удаляется только после того, как разрушается последнее окно класса.
Приложение создает частный контекст устройства, определяя стиль CS_OWNDS для класса окна в момент инициализации структуры WNDCLASS.
11.3.2. Принтер
Win32 API обеспечивает один и тот же тип контекста для принтера и гра- фопостроителя, используя функцию CreateDC, сообщая ей параметры (имя драйвера принтера, имя принтера, файла или устройства вывода). После окон- чания вывода контекст должен быть удален, используя функцию DeleteDC.
11.3.3. Объект в памяти |
|
И |
При работе с битовыми образами изображение необходимо сначалаРпод- |
||
готовить в памяти, а только после этого его вывести на экран. Приложение соз- |
||
|
Г |
|
дает контекст устройства, вызывая функцию CreateCompatibleDC. Первоначаль- |
ное изображение в контексте устройства имеет размер один на один пиксел. |
||||
|
|
|
|
Б |
Для работы с изображением приложение должно установитьУбитовый массив, |
||||
вызывая функцию SelectObject. |
|
|
а |
|
11.3.4. Информационный контекст |
||||
|
|
к |
|
|
Win32 API поддерживает информационный контекст устройства, исполь- |
||||
|
е |
|
||
зуемый, чтобы восстановить или получить з д нные по умолчанию параметры |
||||
устройства. Для создания информационного онтекста необходимо вызвать |
||||
|
т |
|
|
|
функцию CreateIC. Для получения информации об объектах, заданных по умол- |
чанию для требуемого устройс ва, используются функции GetCurrentObject и |
|||||
|
|
|
|
|
о |
GetObject. После завершения раб ы с информационным контекстом необхо- |
|||||
димо вызвать функцию DeleteDC для удаления созданного контекста. |
|||||
|
|
|
|
и |
|
|
|
|
л |
|
|
11.4. Архитектура, управляемая событиями |
|||||
В Windows при действ ях с окном программе отправляется сообщение. |
|||||
|
|
б |
|
|
|
Это означает, что Windows вызывает функцию внутри программы. Параметры |
|||||
этой функ |
ции |
|
|
|
|
|
описывают параметры сообщения. Эта функция, находящаяся в |
||||
программе для Windows, называется оконной процедурой. |
|||||
Б |
|
|
|
|
Окно создается на основе класса окна, в котором определяется оконная процедура, обрабатывающая поступающие окну сообщения. Эта процедура мо- жет находиться либо в самой программе, либо в динамически подключаемой библиотеке. Windows посылает сообщение окну путем вызова оконной проце- дуры, на основе этого сообщения окно совершает какие-то действия и затем возвращает управление Windows. Использование класса окна позволяет созда- вать множество окон на основе одного и того же класса окна и, следовательно, использовать одну и ту же оконную процедуру. Например, все кнопки во всех программах для Windows созданы на основе одного и того же класса окна. Этот класс связан с оконной процедурой (расположенной в динамически подклю-
246
чаемой библиотеке Windows), которая управляет процессом передачи сообще- ний всем кнопкам всех окон.
В объектно-ориентированном программировании объект инкапсулирует код и данные. Окно − это объект. Код − это оконная процедура. Данные − это информация, хранимая оконной процедурой, и информация, хранимая системой Windows для каждого окна и каждого класса окна, которые имеются в системе.
При выполнении программы для Windows создается очередь сообщений. Часть программы, называемая циклом обработки сообщений, выбирает эти со-
общения из очереди и переправляет их соответствующей оконной процедуре. |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Р |
Другие сообщения отправляются непосредственно оконной процедуре, минуя |
|||||||||||||
очередь сообщений. Ниже приведен текст программы: |
И |
||||||||||||
|
#include <windows.h> |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
У |
|
||||
|
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; |
||||||||||||
|
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, |
||||||||||||
|
|
|
|
|
|
|
|
|
|
Г |
|
|
|
|
|
|
|
PSTR szCmdLine, int iCmdShow) |
|
||||||||
|
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
{ static char szAppName[] = "HelloWin" ; |
|
|
|
|
||||||||
|
HWND |
hwnd ; |
|
|
|
|
|
|
|
|
|
|
|
|
MSG |
msg ; |
|
|
|
|
а |
|
|
|
|
||
|
WNDCLASSEX wndclass ; |
|
|
|
|
||||||||
|
|
|
|
|
|
|
|||||||
|
wndclass.cbSize |
= sizeof (wndclass) ; |
|
|
|
|
|||||||
|
wndclass.style |
|
= CS HREDRAW | CS_VREDRAW ; |
||||||||||
|
|
|
|
|
е |
|
|
|
|
|
|
||
|
wndclass.lpfnWndProc |
= WndProc ; |
|
|
|
|
|||||||
|
wndclass.cbClsExtra |
|
= 0к; |
|
|
|
|
|
|||||
|
|
|
т |
|
|
|
|
|
|
|
|||
|
wndclass.cbWndExtra |
= 0 ; |
|
|
|
|
|
|
|||||
|
wndclass.hInstance |
|
= hInstance ; |
|
|
|
|
|
|||||
|
|
о |
|
= LoadIcon (NULL, IDI_APPLICATION) ; |
|||||||||
|
wndclass.hIcon |
|
|
||||||||||
|
wndclass.hCursor |
= LoadCursor (NULL, IDC_ARROW) ; |
|||||||||||
|
wndclass.hbrBackground=(HBRUSH)GetStockObject (WHITE_BRUSH) ; |
||||||||||||
|
л |
|
|
|
|
|
|
|
|
|
|
|
|
|
wndclass.lpszMenuName = NULL ; |
|
|
|
|
||||||||
|
б |
|
|
|
|
|
|
|
|
|
|
|
|
|
wndclass.lpszClassNameи |
= szAppName ; |
|
|
|
|
|||||||
|
wndclass.hIconSm |
|
= LoadIcon (NULL, IDI_APPLICATION) ; |
||||||||||
и |
|
|
|
|
|
|
|
|
|
|
|
|
|
Б |
RegisterClassEx (&wndclass) ; |
|
|
|
|
|
|||||||
|
hwnd = CreateWindow (szAppName, //имя класса окна |
|
|||||||||||
|
|
" HelloWin ", |
|
|
|
|
//заголовок окна |
|
|
||||
|
|
WS_OVERLAPPEDWINDOW, //стиль окна |
|
//начальное положение по x //начальное положение по y //начальный размер по x //начальный размер по y //описатель родительского окна //описатель меню окна
247
hInstance, |
//описатель экземпляра программы |
NULL); |
//параметры создания |
ShowWindow (hwnd, iCmdShow) ; |
|
UpdateWindow (hwnd) ; |
|
while (GetMessage (&msg, NULL, 0, 0))
{TranslateMessage (&msg) ; DispatchMessage (&msg) ;
}
return msg.wParam ;
} |
|
|
|
|
|
|
|
|
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, |
|
|||||||
{ HDC |
hdc ; |
|
|
WPARAM wParam, LPARAM lParam)Р |
||||
|
|
|
|
|
|
И |
||
PAINTSTRUCT ps ; |
|
|
|
|
|
|||
RECT |
rect ; |
|
|
|
|
|
|
|
|
|
|
|
|
У |
|||
switch (iMsg) |
|
|
|
|
|
|||
{ case WM_PAINT : |
|
|
|
|
||||
|
|
|
|
Г |
|
|||
hdc = BeginPaint (hwnd, &ps) ; |
|
Б |
|
|||||
GetClientRect (hwnd, &rect) ; |
|
|
||||||
|
|
|
|
|
|
|
|
|
DrawText (hdc, "Hello, Windows !", -1, &rect, |
|
|||||||
|
|
|
|
|
|
а |
|
|
|
|
DT_SINGLELINE | DT CENTER | DT_VCENTER) ; |
||||||
|
EndPaint (hwnd, &ps) ; |
|
к |
|
|
|||
return 0 ; |
|
|
|
|
|
|||
case WM_DESTROY : |
е |
|
|
|
||||
PostQuitMessage (0) ; |
|
|
|
|||||
return 0 ; |
|
т |
|
|
|
|
||
} |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
||
return DefWindowProc (hwnd, iMsg, wParam, lParam) ; |
|
|||||||
} |
|
о |
|
|
|
|
|
|
Программа создаетиокно, |
в центре рабочей области которого выводится |
текст «HelloWin». Используя манипулятор «мышь», можно перемещать окно по эк- рану и изменять его размеры. При изменении размеров окна программа будет ав-
томатическиперемещатьб строку текста «HelloWin» в новый центр рабочей области окна. Щелкнув на кнопке развертывания окна, можно увеличить окно до размеров всего экрана, а щелкнув на кнопке свертывания окна, убрать его с экрана. Можно
вызватьБвсе эти действия из системного меню. Также можно для завершения про- граммы закрыть тремя разными способами окно: выбрав соответствующую опцию из системного меню, щелкнув на кнопке закрытия окна справа в строке заголовка, или дважды щелкнув на иконке слева в строке заголовка.
11.5. Исходный текст программы
В файле hellowin.cpp имеются две функции: WinMain и WndProc. Обе они
248
являются функциями обратного вызова (CALLBACK). WinMain − это точка входа в программу (аналог функции main языка С(С++)). WndProc − это «окон- ная процедура» для окна HelloWin. Каждое окно имеет соответствующую окон- ную процедуру. Оконная процедура − это функция, отвечающая за ввод инфор- мации и вывод ее на экран. В hellowin.cpp отсутствуют инструкции для непо- средственного вызова WndProc: WndProc вызывается только из Windows. Одна-
ко в WinMain имеется ссылка на WndProc. |
|
|
|
|
||||
|
В hellowin.cpp вызываются следующие функции Windows: |
|||||||
|
LoadIcon − загружает значок для использования в программе. |
|||||||
|
LoadCursor − загружает курсор мыши для использования в программе. |
|||||||
|
GetStockObject − получает графический объект (в этом случае для закра- |
|||||||
шивания фона окна используется кисть). |
|
|
|
Р |
||||
|
RegisterClassEx − регистрирует класс окна. |
У |
||||||
|
CreateWindow − создает окно на основе класса окна. |
|
||||||
|
ShowWindow − выводит окно на экран. |
Г |
И |
|||||
|
UpdateWindow − заставляет окно перерисовать свое содержимое. |
|||||||
|
GetMessage − получает сообщение из очереди сообщений. |
|||||||
|
TranslateMessage − преобразует некоторые сообщения, полученные с по- |
|||||||
мощью клавиатуры. |
|
а |
|
|
|
|
||
|
DispatchMessage − отправляет сообщениеБоконной процедуре. |
|||||||
|
|
|
к |
|
|
|
|
|
|
BeginPaint − инициирует нач ло процесса рисования окна. |
|||||||
|
|
|
яет |
|
|
|
|
|
|
GetClientRect − получает размер р бочей области окна. |
|
||||||
|
DrawText − выводит на э ран стро у текста. |
|
|
|
||||
|
EndPaint − прекраща т рисование окна. |
|
|
|
|
|||
|
PostQuitMessage − вс авл сообщение «завершить» в очередь сообщений. |
|||||||
|
DefWindowProc − выполняет обработку сообщений по умолчанию. |
|||||||
|
|
нти |
|
|
|
|
|
|
|
11.6. Иде ф катры, написанные прописными буквами |
|||||||
|
В hellowin.cppомеется несколько идентификаторов, написанных пропис- |
|||||||
ными буквами. Эти |
дентификаторы задаются в заголовочных файлах Windows |
|||||||
|
б |
|
|
|
|
|
|
|
и содержат двух- или трехбуквенный префикс, за которым следует символ под- |
||||||||
и |
|
|
|
|
|
|
|
|
черк ваниял: |
|
|
|
|
|
|
||
Б |
CS HREDRAW |
DT_VCENTER |
|
WM_CREATE |
||||
CS VREDRAW |
IDC_ARROW |
|
WM_DESTROY |
|||||
|
|
|||||||
|
CW USEDEFAULT |
IDI_APPLICATION |
|
WM_PAINT |
|
|||
|
DT_CENTER |
SND_ASYNC |
|
WS_OVERLAPPEDWINDOW |
||||
|
DT_SINGLELINE |
SND_FILENAME |
|
|
|
|
Это просто числовые константы. Префикс показывает основную катего- рию, к которой принадлежат константы, как показано в табл. 6.
249