#include <windows.h>
- #include <math.h>
-
- #define PI 3.141592654
-
-
-
-
-
-
-
-
-
-
-
-
- HBITMAP GetRotatedBitmap( HDC hdc, HBITMAP hBitmap, int source_x, int source_y,
- int dest_width, int dest_height, float angle, COLORREF bkColor )
- {
- HDC sourceDC = CreateCompatibleDC(hdc);
- HDC destDC = CreateCompatibleDC(hdc);
- HBITMAP hbmResult = CreateCompatibleBitmap( hdc, dest_width, dest_height );
-
- HBITMAP hbmOldSource= (HBITMAP)SelectObject( sourceDC, hBitmap );
- HBITMAP hbmOldDest = (HBITMAP)SelectObject( destDC, hbmResult );
-
- HBRUSH hbrBack = CreateSolidBrush( bkColor );
- HBRUSH hbrOld = (HBRUSH)SelectObject( destDC, hbrBack );
- PatBlt( destDC, 0, 0, dest_width, dest_height, PATCOPY );
- DeleteObject( SelectObject( destDC, hbrOld ) );
-
- angle = (float)( angle * PI / 180 );
- float cosine = (float)cos( angle );
- float sine = (float)sin( angle );
-
- SetGraphicsMode(destDC, GM_ADVANCED);
-
-
-
-
-
- XFORM xform;
- xform.eM11 = cosine;
- xform.eM12 = sine;
- xform.eM21 = -sine;
- xform.eM22 = cosine;
- xform.eDx = (FLOAT)dest_width / 2.0f;
- xform.eDy = (FLOAT)dest_height / 2.0f;
-
-
-
-
-
- SetWorldTransform( destDC, &xform );
-
-
-
- BitBlt(destDC, -(dest_width/2),-(dest_height/2), dest_width, dest_height, sourceDC, source_x, source_y, SRCCOPY );
-
-
-
- SelectObject( sourceDC, hbmOldSource );
- SelectObject( destDC, hbmOldDest );
- DeleteObject(sourceDC);
- DeleteObject(destDC);
-
-
-
- return hbmResult;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void RotateBlt( HDC hdc, HDC hOffScreen, int dest_x, int dest_y, int dest_width, int dest_height,
- HBITMAP hBit, int source_x, int source_y, DWORD dFlag, float angle, COLORREF bkColor )
- {
- static HDC hTempMemDC;
- HBITMAP hTempBitmap, hOldBitmap;
-
-
-
- if( !hTempMemDC ) hTempMemDC = CreateCompatibleDC( hdc );
-
-
-
- hTempBitmap = GetRotatedBitmap( hdc, hBit, source_x, source_y, dest_width, dest_height, angle, bkColor );
-
-
-
- hOldBitmap = (HBITMAP)SelectObject( hTempMemDC, hTempBitmap );
-
-
-
-
- BitBlt( hOffScreen, dest_x, dest_y, dest_width, dest_height,
- hTempMemDC, 0, 0, dFlag );
-
- SelectObject( hTempMemDC, hOldBitmap );
- DeleteObject( hTempBitmap );
- }
-
- HWND hWndMain;
- HDC hdc;
- HDC hOffScreenDC;
- HBITMAP hOffScreenBitmap;
- HBITMAP hMemBitmap;
-
- void OnTimer();
-
- LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
- {
- switch( message )
- {
- case WM_CREATE:
- hWndMain = hWnd;
-
-
- hdc = GetDC( hWnd );
- hOffScreenDC = CreateCompatibleDC( hdc );
- hOffScreenBitmap = CreateCompatibleBitmap( hdc, 800, 600 );
- SelectObject( hOffScreenDC, hOffScreenBitmap );
- PatBlt( hOffScreenDC, 0, 0, 800, 600, WHITENESS );
-
-
-
- hMemBitmap = (HBITMAP)LoadImage( GetModuleHandle(NULL),
- TEXT("player_walk.bmp"),
- IMAGE_BITMAP,
- 0,
- 0,
- LR_DEFAULTSIZE | LR_LOADFROMFILE );
-
-
-
- SetTimer( hWnd, 1, 20, NULL );
- break;
-
- case WM_TIMER:
- OnTimer();
- break;
-
- case WM_DESTROY:
-
- DeleteObject( hMemBitmap );
- DeleteObject( hOffScreenBitmap );
- DeleteDC( hOffScreenDC );
- KillTimer( hWnd, 1 );
- PostQuitMessage(0);
- break;
- }
-
- return DefWindowProc( hWnd, message, wParam, lParam );
- }
-
- void OnTimer()
- {
-
-
- static FLOAT angle = 0.0f;
- static BOOL bRotate = FALSE;
-
- if( GetKeyState( VK_LBUTTON ) & 0x8000 ) { bRotate = TRUE; }
-
- if( bRotate )
- {
- angle += 5.0f;
- if( angle >= 360.0f )
- {
- bRotate = FALSE;
- angle = 0.0f;
- }
- }
-
-
-
- PatBlt( hOffScreenDC, 0, 0, 800, 600, WHITENESS );
-
-
-
- RECT Rt;
- GetClientRect( hWndMain, &Rt );
- RotateBlt( hdc, hOffScreenDC, Rt.right / 2, Rt.bottom / 2, 59, 59,
- hMemBitmap, 0, 0, SRCAND, angle, RGB( 255, 255, 255 ) );
-
-
-
- RotateBlt( hdc, hOffScreenDC, Rt.right / 2, Rt.bottom / 2, 59, 59,
- hMemBitmap, 60, 0, SRCPAINT, angle, RGB( 0, 0, 0 ) );
-
-
-
- BitBlt( hdc, 0, 0, 800, 600, hOffScreenDC, 0, 0, SRCCOPY );
- }
출처 : http://mumbi.net/216
Posted by cocy
Trackback : http://sepoc.tistory.com/trackback/47
Recent Comment