В этом примере будет показан минимум действий для открытия
изображения в WinAPI, чтоб не загружать код разными стандартными процедурами (как освобождение контекста устройств и
другое). На даном этапе достаточно быть ознакомленным с функциями которые участвуют в выводе изображений.
Кнопка - это обычное окно. Открытие изображение в окне и на кнопке требует одинаковых процедур. Первое - создание переменных типа HDC (hDC и CompatibleDC). В hDC тут же устанавливаем контекст дисплея, а в CompatibleDC сохраняем контекст устройства памяти для нужного нам устройства (в нашем случае это контекст дисплея hDC). Далее функцией LoadImage() в параметрах которой указываем тип файла, название и размеры - загружаем изображение и сохраняем его дескриптор в переменную HANDLE HndBitmap; Тут стоит также упомянуть о размерах. Желательно размер изображения сохранять таким, каким он будет выводится в окне, иначе при растягивании или сжимании появятся разные артефакты.
Функцией GetObject() извлекается информация о графическом объекте в созданную переменную BITMAP Bitmap, она понадобится в дальнейшем для вывода изображения. Функция SelectObject() выбирает объект в указанном контексте устройства (DC). С помощью функции StretchBlt(), изображение будет равномерно растянуто/сжато в соответствующем контексте устройства.
Данный пример кода можно размещать в любом месте откуда видно дескриптор главного окна hWnd:
Кнопка - это обычное окно. Открытие изображение в окне и на кнопке требует одинаковых процедур. Первое - создание переменных типа HDC (hDC и CompatibleDC). В hDC тут же устанавливаем контекст дисплея, а в CompatibleDC сохраняем контекст устройства памяти для нужного нам устройства (в нашем случае это контекст дисплея hDC). Далее функцией LoadImage() в параметрах которой указываем тип файла, название и размеры - загружаем изображение и сохраняем его дескриптор в переменную HANDLE HndBitmap; Тут стоит также упомянуть о размерах. Желательно размер изображения сохранять таким, каким он будет выводится в окне, иначе при растягивании или сжимании появятся разные артефакты.
Функцией GetObject() извлекается информация о графическом объекте в созданную переменную BITMAP Bitmap, она понадобится в дальнейшем для вывода изображения. Функция SelectObject() выбирает объект в указанном контексте устройства (DC). С помощью функции StretchBlt(), изображение будет равномерно растянуто/сжато в соответствующем контексте устройства.
Данный пример кода можно размещать в любом месте откуда видно дескриптор главного окна hWnd:
- HWND left = CreateWindow("BUTTON", "", WS_CHILD|WS_VISIBLE,
- 150,50,200 ,127, hWnd, (HMENU)3001, hInstance, NULL);
- img_bt(left);
- void img_bt(HWND hwnd){
- HDC hDC, CompatibleDC;
- hDC = GetDC(hwnd);
- CompatibleDC = CreateCompatibleDC(hDC);
- HANDLE HndBitmap;
- HndBitmap = LoadImage(NULL, "button.bmp", IMAGE_BITMAP, 200,127, LR_LOADFROMFILE);
- BITMAP Bitmap;
- GetObject(HndBitmap, sizeof(BITMAP), &Bitmap);
- SelectObject(CompatibleDC, HndBitmap);
- StretchBlt(hDC, 0, 0, 200, 127, CompatibleDC, 0, 0, Bitmap.bmWidth,
- Bitmap.bmHeight, SRCCOPY);
- }
я не хочу выводить прямоугольник, не хочу выводить фон картинки
ОтветитьУдалить