Уроки Iczelion'а




Урок 25. Пpостой битмэп - часть 2


  • Первый метод:
  • .386 .model flat, stdcall ................ .const

    IDB_MYBITMAp equ 100 ............... .data? hInstance dd ?

    .............. .code ............. invoke GetModuleHandle,NULL

    mov hInstance,eax ............ invoke LoadBitmap,hInstance,IDB_MYBITMAp ...........

  • Второй метод:
  • .386 .model flat, stdcall ................

    .data BitmapName db "MyBitMap",0 ............... .data?

    hInstance dd ? .............. .code .............

    invoke GetModuleHandle,NULL mov hInstance,eax ............ invoke LoadBitmap,hInstance,addr BitmapName

    ...........

  • Получите хэндл device context'a (DC). Это можно сделать либо вызовом функции Beginpaint в ответ на сообщение WM_pAINT, либо вызовом GetDC в любое время.
  • Создайте device context в памяти (memory DC) с теми же аттрибутами, что и device context, полученный на предыдущем шаге. Идея в том, чтобы создать некоторую "невидимую" поверхность, на которой мы можем отрисовать битмэп. После этого мы просто копируем содержимое невидимой поверхности в текущий device context с помощью вызова одной-единственной функции. Этот приём называется двойной буферизацией (double buffering) и используется для быстрого вывода изображений на экран. Создать "невидимую" поверхность можно вызовом CreateCompatibleDC:

    CreateCompatibleDC proto hdc:HDC

    При успешном завершении функция возвращает через регистр eax хэндл device context'a в памяти. hdc - это хэндл device context'a, с которым должен быть совместим DC в памяти.

  • После создания невидимой поверхности вы можете отобразить на ней битмэп с помощью вызова SelectObject, передав ей в качестве первого параметра хэндл DC в памяти, а в качестве второго - хэндл битмэпа. Прототип этой функции следующий:
  • SelectObject proto hdc:HDC, hGdiObject:DWORD

  • Теперь битмэп отображен на device context'e в памяти. Единственное, что осталось сделать - это скопировать его на на устройство вывода, то есть на настоящий device context. Этого можно добиться с помощью таких функций, как BitBlt и StretchBlt. BitBlt просто копирует содержимое одного DC в другой, поэтому она работает быстро; StretchBlt может сжимать или растягивать изображение по размерам того DC, куда копирует. Для простоты здесь мы будем использовать&nbsр; BitBlt, имеющую следующий прототип:



  • Содержание  Назад  Вперед