Developer от Бога

DV

четверг, 6 июля 2017 г.

WinAPI. Изображения

В этом примере будет показан минимум действий для открытия изображения в WinAPI, чтоб не загружать код разными стандартными процедурами (как освобождение контекста устройств и другое). На даном этапе достаточно быть ознакомленным с функциями которые участвуют в выводе изображений.
Кнопка - это обычное окно. Открытие изображение в окне и на кнопке требует одинаковых процедур. Первое - создание переменных типа HDC (hDC и CompatibleDC). В hDC тут же устанавливаем контекст дисплея, а в CompatibleDC сохраняем контекст устройства памяти для нужного нам устройства (в нашем случае это контекст дисплея hDC). Далее функцией LoadImage() в параметрах которой указываем тип файла, название и размеры - загружаем изображение и сохраняем его дескриптор в переменную HANDLE HndBitmap; Тут стоит также упомянуть о размерах. Желательно размер изображения сохранять таким, каким он будет выводится в окне, иначе при растягивании или сжимании появятся разные артефакты.
Функцией GetObject() извлекается информация о графическом объекте в созданную переменную BITMAP Bitmap, она понадобится в дальнейшем для вывода изображения. Функция SelectObject() выбирает объект в указанном контексте устройства (DC). С помощью функции StretchBlt(), изображение будет равномерно растянуто/сжато в соответствующем контексте устройства.
Данный пример кода можно размещать в любом месте откуда видно дескриптор главного окна hWnd:


  1. HWND left = CreateWindow("BUTTON", "", WS_CHILD|WS_VISIBLE,
  2. 150,50,200 ,127, hWnd, (HMENU)3001, hInstance, NULL);
  3. img_bt(left);
  4. void img_bt(HWND hwnd){
  5. HDC hDC, CompatibleDC;
  6. hDC = GetDC(hwnd);
  7. CompatibleDC = CreateCompatibleDC(hDC);
  8. HANDLE HndBitmap;
  9. HndBitmap = LoadImage(NULL, "button.bmp", IMAGE_BITMAP, 200,127, LR_LOADFROMFILE);
  10. BITMAP Bitmap;
  11. GetObject(HndBitmap, sizeof(BITMAP), &Bitmap);
  12. SelectObject(CompatibleDC, HndBitmap);
  13. StretchBlt(hDC, 0, 0, 200, 127, CompatibleDC, 0, 0, Bitmap.bmWidth,
  14. Bitmap.bmHeight, SRCCOPY);
  15. }

1 комментарий:

  1. я не хочу выводить прямоугольник, не хочу выводить фон картинки

    ОтветитьУдалить