- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум73
- •Часть 1 Теоретические сведения
- •1. Основы архитектурЫ защищенного режима Регистры процессора
- •Адресация памяти
- •2. Логические шрифты Создание логических шрифтов
- •Вывод на экран текстовых строк
- •3. Таймеры Windows Организация и обслуживание таймеров
- •Мультимедийные таймеры
- •Измерение интервалов времени
- •Организация периодического процесса
- •Задание однократного интервала времени
- •4. Дочерние окна Создание и использование дочерних окон
- •Окна предопределенных классов в главном окне
- •5. Вывод растровых изображений
- •Процедура вывода растрового изображения
- •Компоновка составных изображений
- •6. Обслуживание файлов в 32-разрядных приложениях Windows
- •Базовые операции с файлами Открытие и создание файла
- •Запись и чтение файла
- •Файлы, проецируемые в память
- •7. Процессы и потоки
- •Создание дочернего процесса
- •Создание дочернего потока
- •Синхронизация потоков Общие характеристики объектов Windows
- •Синхронизация с помощью состояний потока
- •Синхронизация с помощью событий
- •Критические секции и защита данных
- •8. Библиотеки динамической компоновки
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Создание логических шрифтов
- •Работа 2. Таймеры Windows(индивидуальное задание а)
- •Работа 3. Дочернее окно в главном окне приложения
- •Работа 4. Вывод растровых изображений с использованием совместимой памяти
- •Работа 5. Измерение временных характеристик программы с помощью мультимедийного таймера
- •Работа 6. Вывод движущихся изображений с синхронизацией от системного таймера (индивидуальное задание b)
- •Работа 7. Повышение качества движущихся изображений с помощью совместимой памяти
- •Работа 8. Движение изображения по фоновому рисунку
- •Работа 9. Работа с файлами (индивидуальное задание c)
- •Работа 10. Стандартные диалоги Windows для работы с файлами
- •Работа 11. Проецирование файла в память
- •Работа 12. Потоки (индивидуальное задание d)
- •Работа 13. Синхронизация потоков с помощью событий
- •Работа 14. Защита данных с помощью критической секции
- •Работа 15. Библиотеки динамической компоновки
- •Работа 16. Передача параметров в функции dll-библиотек
- •Индивидуальные задания лабораторного практикума
- •Задание c2.Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел.
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
Компоновка составных изображений
Выше уже отмечалось, что в совместимом контексте, как и в любом контексте устройства, имеются дескрипторы графических инструментов вместе с некоторыми их характеристиками (например, цветом шрифта или фона под ним). Это дает возможность рисовать с помощью этих инструментов в совместимой памяти, как в обычном окне. Выбрав в совместимый контекст дескриптор изображения, загруженного из файла, мы можем далее, например, заключить часть изображения в цветную рамку или вывести поверх него некоторую надпись:
SelectBitmap(hdcMem,hBitmap);//Выбираем в совместимый
//контекст дескриптор совместимой памяти
SetTextColor(hdcMem,RGB(0,0,200);//Изменяем цвет шрифта в
//совместимом контексте
SetTextMode(HdcMem,TRANSPARENT); //Делаем в нем фон прозрачным
charstr[]="Образец";//Строка для вывода поверх изображения
TextOut(hdcMem,100,100,str,strlen(str));//Выводим строку
Разумеется, выведенный в совместимую память текст не появится в окне приложение до тех пор, пока мы не скопируем совместимую память в окно функцией BitBlt().
Часто возникает необходимость размещения в окне нескольких изображений либо вывод небольшого рисунка поверх фонового изображения, которое само хранится в файле .BMPи должно быть сначала скопировано в окно. В таких случаях создается несколько областей совместимой памяти и, соответственно, несколько совместимых контекстов. В каждую область совместимой памяти загружается свое изображение, а затем эти области либо по отдельности копируются в окно приложения, либо (что лучше) сначала копируются в отдельную область совместимой памяти большого размера, а та уже копируется в окно (рис. 5.3).
Рис. 5.3. Объединение нескольких изображений в совместимой памяти и их копирование в окно приложения
Однако для выполнения такой процедуры необходимо иметь пустуюсовместимую память требуемого размера. Для такой памяти предусмотрена функцияCreateCompatibleBitmap():
HBITMAP hBitMap=CreateCompatibleBitmap(hdc,800,600);
В этом примере создается совместимая память размером во весь экран (800600 пикселов). Заметим, что для создания совместимой памяти таким способом так же, как и при создании совместимого контекста, требуется иметь контекст окнаhdc. Поскольку пустая совместимая память обычно создается заранее, в функцииOnCreate(), контекстhdcполучают вызовом функцииGetDC().
При создании пустой совместимой памяти с помощью функции CreateCompatibleBitmap()следует иметь в виду, что реально эта память отнюдь не пуста, а может быть заполнена любым “мусором”. Если затем эта память заполняется копируемым в нее изображением целиком, то “мусор”, разумеется, затирается. Если, однако, графические объекты выводятся в отдельные участки большого блока совместимой памяти, ее следует предварительно очистить. Проще всего это сделать с помощью функцииFillRect(), которая позволяет залить указанную в ее параметрах прямоугольную область любой кистью (не обязательно белой):
RECTrect;//Структура,описывающая прямоугольник
rect.left=rect.top=0;//Зальем всю совместимую память
rect.right=800;//размером 800600 пикселов
rect.bottom=600;
HBRUSH hBrush=CreateSolidBrush(RGB(180,250,250));//Кисть
FillRect(hdcMem,&rect,hBrush);//Заливаем
В этом примере вся совместимая память закрашивается бледно-бирюзовой кистью.