Графические вставки из bmp-файлов в WIN программах в режиме работы с оперативной памятью

Возьмем за основу программу mov05.cpp. В этой программе уберем движение стрелки, уберем фон в виде зеленого эллипса, добавим фон в виде зеленого поля и голубого неба из bmp-файла. Новую программу поместим в файл mov08.cpp. Работа программы mov08.cpp будет во многом похожа на работу программы mov07.cpp. Но будут свои особенности, на которые обратим внимание.

   В программе mov05.cpp задержка в движении графических объектов осуществляется с помощью системного таймера. В функции Move_OnTimer(), которая обрабатывает сообщения от таймера, работа построена следующим образом.

Создается контекст памяти, совместимый с контекстом экрана.

Растровое изображение, в виде битовой караты, загружается из ресурса в память.

Битовая карта связывается с контекстом памяти.

Выполняется рисование графических объектов в памяти на битовой карте. По сути дела рисование происходит на фоне, взятом из bmp-файла. 

После этого изображение из контекста памяти копируется в контекст экрана с помощью функции BitBlt().

Затем все повторяется как в программе mov05.cpp. Ниже приводится измененный код функции Move_OnTimer(). 

 

//функция обрабатывает сообщение  WM_TIMER

void Move_OnTimer(HWND hwnd)

{

      //получаем идентификатор контекста экрана

      HDC hdcWin = GetDC(hwnd); 

 

      //создаем контекст памяти hdcMem, совместимый с контекстом экрана hdc

      HDC hdcMem = CreateCompatibleDC(hdcWin);

 

      //загружаем в память bitmap-ресурс из модуля exe-файла

      //hInstApp — идентификатор экзепляра приложения

      //»BitmapShip» — идентификатор bitmap-ресурса (в файле ресурсов)

      //hBitmap — идентификатор загруженного bitmap-ресурса

      HBITMAP hBitmap = LoadBitmap(hInstApp, «BitmapField»);

     

      //выбираем bitmap-объект hBitmap в контекст памяти hdcMem

      HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMem, hBitmap);

     

 

            tP += dtP;

            dtP *= 0.99115;

            xP2 = TrajP(tP).x;

            yP2 = TrajP(tP).y;

 

      fiP2 =atan2l(yP2-yP1,xP2-xP1);

 

//рисуем фигуру в точке (x2, y2)

      TracP(hdcMem, tP, dtP);

      Plain(hdcMem,PtP,7,xP1,yP1,xP2,yP2,fiP1,fiP2,kxP,kyP);

 

      xP1 = xP2; yP1 = yP2; fiP1 = fiP2;

 

      //копируем изображение из контекста памяти hdcMem в контекст экрана hdc

      BitBlt(hdcWin, nLeft,mTop, nRight-nLeft, mBottom-mTop, hdcMem, 0, 0, SRCCOPY);

 

      DeleteObject(hBitmap);      //убираем растровое изображение из памяти

      SelectObject(hdcMem, hBitmapOld); //востанавливаем контекст памяти

Ссылка на основную публикацию
Adblock detector