КОМП'ЮТЕРНІ КУРСИ "ПОШУК"
Контекст у пам'яті
Як відобразити BMP файл на формі

ТЕОРІЯ
Цей контекст використовується для зберігання зображень, які будуть скопійовані на пристрій виводу. Сам собою контекст у пам'яті не створюється. Він обов'язково створюється як сумісний із тим пристроєм чи вікном, на яке передбачається копіювати інформацію (ось він – сумісний контекст – перехідник між програмою та драйвером пристрою!). Алгоритм роботи з контекстом у пам'яті складається з кількох кроків:
- Отримання хендла контексту пристрою (назвемо йогоhDC -handle of Device Context ) для вікна, в яке буде здійснюватися виведення зображення.
- Отримання хендла bitmap'a, який відображатиметься у вікні.
- Отримання сумісного зhDC контексту пам'яті (для зберігання зображення) за допомогою функціїCreateCompatibleDC() (зверніть увагу на назву функції - створити СУМІСНИЙ контекст).
- Вибір зображення (hBitmap ) як поточного для контексту пам'яті (hCompatibleDC ).
- Копіювання зображення контексту пам'яті (hCompatibleDC ) на контекст пристрою (hDC ).
- Видалення сумісного контексту (hCompatibleDC );
- Вжити заходів для того, щоб заміщений bitmap з контексту пам'яті не залишився в пам'яті.
- Звільнення контексту пристрою (hDC ).
При необхідності кроки 6 та 7 можна поміняти місцями. Коли та як видаляти заміщенийbitmap, залежить від програміста та поставленого перед ним завдання.
Саме цей спосіб і використовується в більшості програм копіювання зображення.
SEEING IS BELIEVING
Перед тим,як починати писати програму, ми маємо прояснити собі ще одну тему. В яких одиницях вимірюються розміри вікна і, відповідно, всі усунення у вікні? Щоб відповісти на це питання, ми повинні розглянути
Режими відображення
Переважна більшість функцій, що працюють з віконними координатами, визначають координати щодо початку робочої області вікна, тобто від верхнього лівого кута.
Таким чином, навіть при переміщенні вікна координати об'єктів усередині вікна залишаються незмінними. При цьому одиниці, в яких вимірюються координати, залежать від режиму відображення (mapping mode ), встановленого для цього вікна. Одиниці виміру, залежні від режиму відображення, називають логічними одиницями, а координати у разі називають логічними координатами.
При виведенні інформації на конкретний пристрій одиниці логічних координат перетворюються на фізичні одиниці, якими є пікселі.
Для встановлення поточного режиму відображення використовується функціяSetMappingMode(), яка описана таким чином:
functionSetMapMode ( DC: HDC; p2: Integer ): Integer; stdcall;
Перший аргумент цієї функції - хендл контексту пристрою, для якого встановлюється цей режим. Другий аргумент визначає режим відображення, що задається. При створенні стандартного вікна встановлюється режимММ_ТЕХТ, тобто всі координати обчислюються в пікселах.
МІСТЬ
Наша програма буде відображати bitmap у вікні і за необхідності проводити його масштабування:
АНАЛІЗ
Перший крок алгоритму – отримати хендл контексту пристрою – ми виконуємо за допомогою виклику функціїBeginPaint(hWnd, PaintStruct). АргументhWnd очевидний - ми отримуємоконтекст цього вікна. Що ж доPaintStruct.
Другий крок - отримання хендлаbitmap 'a, який відображатиметься у вікні - ми робимо, викликаючи функціюLoadlmage. Я невипадково скористався саме цією функцією. По-перше, можливості цієї функції досить широкі. Вона дозволяє завантажувати графічні образи як із ресурсів, записаних у виконуваному файлі, і з файлів, містять лише зображення. Графічним чином може бутиbitmap, курсор та іконка. Крім цього, функція дозволяє керувати параметрами відображення та завантаження образу. По-друге, переважна більшість функцій працюють з ресурсами, збереженими у виконуваному файлі, і у програмістів, що починають освоювати Win32, спроби завантажити щось із файлу супроводжуються деякими труднощами. Ця функція описана таким чином:
functionLoadImage ( hInst: HINST; ImageName: PWideChar; ImageType: UINT; X, Y: Integer; Flags: UINT ): THandle; stdcall;
Перший, другий та останній аргументи цієї функції працюють у зв'язці. Перший apryмeнт(hlnst ) - хендл програми. Другий аргумент -ImageName - визначає об'єкт, що завантажується. Останній аргумент -Flags - містить прапори, що визначають режим завантаження об'єкта. Серед цих прапорів є прапорLR_LOADFROMFILE. Його назва визначає призначення - якщо цей прапор встановлений, завантаження відбувається із зовнішнього файлу. Від значення першого та останнього аргументів залежить, як буде інтерпретовано другий аргумент.
Третій аргумент - тип образу, він може приймати значенняIMAGE_BITMAP,IMAGE_CURSOR,IMAGE_ICON таIMAGE__ENHMETAFILE. Четвертий і п'ятий аргументи вказують ширину і висоту іконки чи курсору й у прикладі не використовуються.
ФункціяLoadlmage повертає нам хендл завантаженого bitmap'a (hBitmap ) (абоnil, якщо десь щось не так), після чого ми можемо вважати другий крок нашого алгоритму пройдений.
Третій крок - отримання сумісного контексту пам'яті - виконується з допомогою функціїCreateCompatibleDC. Єдиний аргумент цієї функції – хендл контексту (hDC ), для якого створюється сумісний контекст.
Четвертий крок реалізуємо викликом функціїSelectObject. Першим аргументом вказуємо хендл контексту, у якому заміщається поточний елемент (у разі це хендл щойно створеного контексту у пам'ятіhCompatibleDC ), а другим - хендл елемента, яким заміщається поточний елемент (хендл завантаженого bitmap'a hBitmap) . Важливо, що ця функція повертає хендл ЗАМІЩЕНОГО елемента (hOldBitmap ), тобто, згодом з цим елементом можуть проводитися маніпуляції.
А ось на п'ятому кроці відбувається те, заради чого ми заварили всю цю кашу із завантаженнямbitmap 'ів, сумісними контекстами та іншим. Для копіюванняbitmap 'a (з масштабуванням) з одного контексту на інший ми використовуємо функціюStretchBlt, одну з «могутніх bit», за влучним виразом Чарльза Петцольда. До них, крімStretchBlt, відносятьсяBitBlt іPatBlt.
Напевно,StretchBlt є наймогутнішою з них. І напевно, її міць і зумовила наявність у цієї функції «лише» одинадцяти аргументів.
Джерело:П.В. Румянці. Абетка програмування в WIN32 API.