
Задания для самостоятельного выполнения
Задание 1.
В среде Visual C++ создайте проект CrtFigLib – библиотеку динамической компоновки, содержащую две функции: рисование окружности красного цвета и вписанного в нее правильного треугольника зеленого цвета DrawCrlTrg, рисование квадрата синего цвета и вписанной в него окружности желтого цвета DrawSqwCrl. Функции DrawCrlTrg и DrawSqwCrl должны принимать три параметра: дескриптор контекста устройства, ширину клиентской области окна, высоту клиентской области окна. Функци DrawCrlTrg и DrawSqwCrl сделайте экспортируемыми.
В среде Visual C++ создайте проект DrawCrlTrg – приложение, выполняющее рисование в центре клиентской области своего окна окружности красного цвета и вписанного в нее правильного треугольника зеленого цвета с помощью функции DrawCrlTrg библиотеки CrtFigLib. Динамическое связывание выполнить с импортом.
В среде Visual C++ создайте проект DrawSqwCrl – приложение, выполняющее рисование в центре клиентской области своего окна квадрата синего цвета и вписанной в него окружности желтого цвета с помощью функции DrawSqwCrl библиотеки CrtFigLib. Динамическое связывание выполнить без импортом.
Скопируйте файлы приложений и DLL библиотеку в одну папку и запустите оба приложения.
Задание 2.
В графическом редакторе создайте 3 рисунка одинаковых размеров формата Bitmap.
В среде Visual C++ создайте проект BmpRes – динамически подключаемую библиотеку, выполняющую единственную функцию – хранение созданных битовых образов. Для этого необходимо к проекту добавить в ресурсы эти битовые образы. Дайте им идентификаторы 1, 2, 3.
В среде Visual C++ создайте проект DrawBmp – приложение, выводящее в циклическом порядке битовые образы, хранящиеся в библиотеке BmpRes.dll, в клиентскую область окна приложения. Смена битового образа должна осуществляться при нажатии на любую из клавиш клавиатуры.
Указание к выполнению второй части задания. При нажатии на клавишу посылается сообщение WM_CHAR. В его обработчике и следует разместить код по загрузке нового битового образа и выдачи команды перерисовки рисунка (вызов функции InvalidateRect(hwnd /*дескриптор перерисовываемого окна*/, NULL, TRUE )). Загрузка битового образа выполняется функцией LoadBitmap, удаление битового образа выполняется функцией DeleteObject. Для рисования битового образа (в обработчике сообщения WM_PAINT) необходимо выполнить следующие действия: создать в памяти контекст устройства, совместимый с физическим (функция CreateCompatibleDC); выбрать в полученный контекст устройства битовый образ (функция SelectObject); получить в переменную типа BITMAP данные о размерах битового образа (функция GetObject); скопировать содержимое контекста устройства в памяти с битовым образом на контекст физического устройства (функция BitBlt). Динамическое связывание выполнить без импорта.
Запустить и протестировать приложение.
Задание 3.
Выполнить предыдущее задание, используя динамическое связывание с импортом. Для этого загрузку битовых образов нужно осуществить в динамически подключаемой библиотеке функцией входа/выхода при обращении приложения к ней (При обработке какого уведомления?) и освобождение их при закрытии приложения (При обработке какого уведомления?). Дескрипторы битовых образов должны быть объявлены как экспортируемые переменные. В приложении эти же переменные должны быть объявлены как импортируемые. Проект для создания динамически подключаемой библиотеки назвать BmpResI, а проект приложения – DrawBmpI.
Задание 4.
Используя созданную в предыдущем задании библиотеку динамической компоновки, создайте приложение DrawBmpIn с той же функциональностью, что и в предыдущем задании, но динамическую компоновку выполнить без импорта, дескрипторы битовых образов не должны объявляться импортируемыми, а их связь с соответствующими дескрипторами библиотеки должна выполняться во время выполнения приложения (Подсказка: используйте функцию GetProcAddress).
Задание 5.
В среде Visual C++ создайте проект ShMemLib – библиотеку динамической компоновки, имеющую следующие элементы. Разделяемая область памяти с именем “common”, хранящая массив символов из 2*1024 элементов StrArr, первоначально инициализированный пустой строкой. Экспортируемая функция ChangeStr, выполняющая запись новой строки в массив символов StrArr. Экспортируемая функция GetStr, возвращающая строку из массива StrArr.
В среде Visual C++ создайте проект ShMemA – приложение c диалоговым окном. В диалоговом окне создайте метку для отображения строки, поле ввода строки, кнопку «Изменить» и кнопку «Считать». При нажатии на кнопке «Изменить», строка из поля ввода должна записываться в строку StrArr разделяемой область памяти “common” ShMemLib библиотеки. При нажатии на кнопке «Считать», строка StrArr разделяемой область памяти “common” ShMemLib библиотеки должна отобразиться в метке диалогового окна приложения ShMem . Динамическое связывание выполнить с импортом.
Запустите два экземпляра приложения и обменяйтесь между ними сообщениями.
Задание 6 (дополнительное).
Измените библиотеку динамической компоновки предыдущего задания так, чтобы строка StrArr хранилась не в специальной разделяемой области, а в проецируемом файле. Протестируйте работу приложений с новой версией библиотеки.