Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.51 KB | None | 0 0
  1. void draw()
  2. {//отрисовка изображения gif
  3. // Создаем контекст рисования и устанавливаем
  4. // пиксельную систему координат
  5.  
  6. Graphics g(hdc);
  7.  
  8. g.SetPageUnit(UnitPixel);
  9. RectF bounds(0, 0, float(w), float(h));
  10.  
  11. // Загружаем фоновое изображение и растягиваем его на все окно
  12. std::wstring wstr = strToWstring(animations[STATE][(int)currAnim]);
  13. LPWSTR lpstr = (LPWSTR)wstr.c_str();
  14. Image bg(lpstr);//L"b.gif"
  15. g.DrawImage(&bg, bounds);
  16. g.ResetTransform();
  17. }
  18.  
  19. //объявим идентификаторы для картинок
  20. файл: *.rc
  21. IDC_KISS01 RCDATA "catkiss_01.bmpx"
  22. IDC_KISS02 RCDATA "catkiss_02.bmpx"
  23. ...
  24. IDC_KISS22 RCDATA "catkiss_22.bmpx"
  25.  
  26. файл: Resource.h
  27. #define IDC_KISS01 111
  28. #define IDC_KISS02 112
  29. ...
  30. #define IDC_KISS22 132
  31.  
  32. //класс, отвечающий за анимацию
  33. class CAT{
  34.  
  35. public:
  36.  
  37. CAT(){
  38. STATE = "kiss";
  39. ptSrc.x = 0;
  40. ptSrc.y = 0;
  41. }
  42.  
  43. void loadAnimations(HWND hwnd, HINSTANCE hInstance, std::string nameAmim, int nCount, float sp)
  44. {//загрузим каждую картинку-объект в структуру данных для работы с изображениями
  45. hwndAnim = hwnd;
  46. speed = sp;
  47. HGDIOBJ hBitmap;
  48. HRSRC hRSrc;
  49. HGLOBAL hRes;
  50. BITMAPFILEHEADER *pRes;
  51. BITMAPINFOHEADER *bi;
  52. void *bits, *premultiply;
  53. std::vector<alpha> v;
  54.  
  55. int id;
  56. if (nameAmim == "kiss") id = 111;
  57. for (int i = 0; i < nCount; i++){
  58.  
  59. // load resource
  60. hRSrc = FindResource(hInstance, MAKEINTRESOURCE(id++), RT_RCDATA);
  61. hRes = LoadResource(hInstance, hRSrc);
  62. pRes = (BITMAPFILEHEADER*)LockResource(hRes);
  63. bi = (BITMAPINFOHEADER*)(pRes + 1);
  64. bits = ((char*)pRes) + pRes->bfOffBits;
  65.  
  66. // premultiply
  67. premultiply = malloc(bi->biHeight * bi->biWidth * sizeof(RGBQUAD));
  68. for (int c = bi->biHeight * bi->biWidth; c--;) {
  69. RGBQUAD &src = ((LPRGBQUAD)bits)[c];
  70. RGBQUAD &dst = ((LPRGBQUAD)premultiply)[c];
  71. dst.rgbRed = (BYTE)MulDiv(src.rgbRed, src.rgbReserved, 255);
  72. dst.rgbGreen = (BYTE)MulDiv(src.rgbGreen, src.rgbReserved, 255);
  73. dst.rgbBlue = (BYTE)MulDiv(src.rgbBlue, src.rgbReserved, 255);
  74. dst.rgbReserved = src.rgbReserved;
  75. }
  76.  
  77. a.hdcScreen = GetDC(HWND_DESKTOP);
  78.  
  79. // prepare bitmap
  80. hBitmap = CreateCompatibleBitmap(a.hdcScreen, bi->biWidth, bi->biHeight);
  81. a.hdcMem = CreateCompatibleDC(a.hdcScreen);
  82. hBitmap = SelectObject(a.hdcMem, hBitmap);
  83. SetDIBitsToDevice(
  84. a.hdcMem, 0, 0, bi->biWidth, bi->biHeight,
  85. 0, 0, 0, bi->biHeight, premultiply, (BITMAPINFO*)bi, DIB_RGB_COLORS
  86. );
  87. a.sizeWnd.cx = bi->biWidth;
  88. a.sizeWnd.cy = bi->biHeight;
  89. free(premultiply);
  90.  
  91. // prepare window
  92. memset(&a.blend, 0, sizeof(a.blend));
  93. a.blend.BlendOp = AC_SRC_OVER;
  94. a.blend.SourceConstantAlpha = 255;
  95. a.blend.AlphaFormat = AC_SRC_ALPHA;
  96.  
  97. v.push_back(a);
  98. }//for
  99.  
  100. //cleanup
  101. ReleaseDC(HWND_DESKTOP, a.hdcScreen);
  102. //hBitmap = SelectObject(a.hdcMem, hBitmap);
  103. DeleteDC(a.hdcMem);
  104. //DeleteObject(hBitmap);
  105.  
  106. //в некоторых случаях могут быть не точные расчеты, т.к. получаем размеры последней картинки
  107. width = a.sizeWnd.cx;
  108. heigth = a.sizeWnd.cy;
  109.  
  110. animations.insert(std::pair<std::string, std::vector<alpha>>(nameAmim, v));
  111. }
  112.  
  113. void playAnim()
  114. {//проигрываем анимацию из таймера
  115. currAnim += 1 * speed;
  116. //!!! необходимо перенести в участок, где происходит смена состояния
  117. int cout = animations[STATE].size();
  118. a = animations[STATE][(int)currAnim];
  119. UpdateLayeredWindow(hwndAnim, a.hdcScreen, &ptPos, &a.sizeWnd, a.hdcMem, &ptSrc, 0, &a.blend, ULW_ALPHA);
  120. if ((int)currAnim >= cout - 1) currAnim = 0;
  121. }
  122.  
  123.  
  124. void setPos(int &x, int &y)
  125. {
  126. ptPos.x = x; ptPos.y = y;
  127. }
  128.  
  129. private:
  130. struct alpha
  131. {//структура данных загружаемых изображение
  132. BLENDFUNCTION blend;
  133. HDC hdcScreen, hdcMem;
  134. SIZE sizeWnd;
  135. }a;
  136.  
  137. float speed, currAnim;
  138. std::map<std::string, std::vector<alpha>> animations;
  139. std::string STATE;//stand, kiss
  140. HWND hwndAnim;
  141. POINT ptPos, ptSrc;
  142. int width, heigth;//wh img
  143. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement