GDIは、画像の回転を達成するため、多くの情報を見つけるために、インターネット上のブロガーは、独り善がりではありません。
HDCの中心に画像が移動して第一SetViewportOrgEx座標の原点場合と試みに見られる、;再取得がHDC上の各点は、三角関数変換を行う、計算された新たな座標点をプロットしています。しかし、理由はダブル、int型の変換の理論的には可能で、それがぼやけされた画像を回転させた後、精度を失うことになります。
添付ファイル:三角関数の式
逆时针:
X1 = xcos(B)-ysin(B)。
Y1 = ycos(B)+ xsin(B)。
顺时针:
X1 xcos =(B)+ ysin(B)。
Y1 = ycos(B)-xsin(B)。
私たちは、大きな回転機能は、画像を達成するために神を使用しますが、VBを使用PlgBltた円の中を行く多くの情報を、見つけます。理解するためによると、それは修正され、C ++に翻訳されました。方法の使用に伴い、以下のコード、フォーカス機能を回転させ、:
書式#include <cmath> 使用して 名前空間はstdを、 extern " C " { の#include <WINDOWS.H> の#include <TCHAR.H> の#include " RESOURCE.H " } の#define ID_TIMER 1 / * 逆时针 X1 = xcos(β)-ysin(β)。 Y1 = ycos(β)+ xsin(β); 顺时针 X1 = xcos(β)+ ysin(β)。 Y1 = ycos(β)-xsin(β)。* / LRESULT CALLBACK WndProcメソッド(HWNDのHWND、UINTメッセージ、WPARAM wParamに、LPARAM lParamに)。空回し(HDC hdcDest、int型 XPOS、int型 YPOS、int型角度、HDC hdcSrc、 int型のxsrc、int型 ySrc、int型 srcWidth、int型srcHeight)。 HWND HWND; HINSTANCE hInst; INT WINAPIのWinMain(HINSTANCE hInstanceは、HINSTANCE hPrevInstance、LPSTR lpCmdLine、INT nShowCmd) { TCHAR szAppName [] = TEXT(" 最初の勝利" )。 MSGのMSG。 WNDCLASSのWNDCLASS。 hInst = hInstanceは、 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProcメソッド。 wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstanceは、 wndclass.hIcon = LoadIcon(NULL、IDI_APPLICATION)。 wndclass.hCursor = LoadCursor(NULL、IDC_ARROW)。 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH)。 wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName。 もし(!RegisterClass(&WNDCLASS)) { のMessageBox(NULL、TEXT(" エラー" )、szAppName、MB_ICONERROR)。 リターン 0 ; } HWND = のcreateWindow(szAppName、 TEXT(" こんにちは" )、 WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME、 20、 // CW_USEDEFAULT 50 、 600、 // CW_USEDEFAULT、 400、 // CW_USEDEFAULT、 NULL、 NULL、 hInstanceは、 NULL); ShowWindow(HWND、nShowCmd)。 UpdateWindow(HWND)。 一方(のGetMessage(&MSG、NULL、0、0 )) { TranslateMessage( &MSG)。 DispatchMessageを(&MSG)。 } 戻りmsg.wParamと、 } HDC、HDC。 PAINTSTRUCT psの。 HDC dcWin、dcBmp1、dcBmp2。 HBITMAP hBmp1、hBmp2。 点PT。 RECTのRECT。 int型の角度= 0 ; 無効回し(HDC hdcDest、int型 XPOS、int型 YPOS、int型角度、HDC hdcSrc、int型のxsrc、int型 ySrc、int型 srcWidth、INT ] .X。srcHeight、COLORREFのCOL) { 点PT [ 3 ]。 POINT defPt [ 3 ]。 二重 notPI = 3.14 / 180 。 ダブルthetS、thetC。 int型のRET; PT [ 0 ] .X = -srcWidth * 0.5 。 PT [ 0 ] .Y = -srcHeight * 0.5 。 PT [ 1 ] .X = PT [ 0 ] .X + srcWidth。 PT [ 1 ] .Y = PT [ 0 ] .Y。 PT [ 2 ] .X = PT [ 0 、PT [ 2] .Y = PT [ 0 ]・Y + srcHeight。 thetS =罪(角度* notPI)。 thetC = COS(角度* notPI)。 defPt [ 0 ] .X =(PT [ 0 ] .X * thetC - PT [ 0 ]・Y * thetS)+ XPOS。 defPt [ 0 ] .Y =(PT [ 0 ] .X * thetS + PT [ 0 ]・Y * thetC)+ YPOS。 defPt [ 1 ] .X =(PT [ 1 ] .X * thetC - PT [ 1 ]・Y * thetS)+ XPOS。 defPt [ 1 ] .Y =(PT [ 1 ] .X * thetS + PT [ 1] .Y * thetC)+ YPOS。 defPt [ 2 ] .X =(PT [ 2 ]・X * thetC - PT [ 2 ]・Y * thetS)+ XPOS。 defPt [ 2 ] .Y =(PT [ 2 ] .X * thetS + PT [ 2 ]・Y * thetC)+ YPOS。 HBRUSH HBRUSH = CreateSolidBrush(COL)。 RECTのRECT。 rect.left = rect.top = 0 。 rect.right = rect.left + srcWidth。 rect.bottom = rect.top + srcHeight。 FillRect(hdcDest、 &RECT、HBRUSH)。 DeleteObjectの(HBRUSH)。 PlgBlt(hdcDest、&defPt [ 0 ]、hdcSrc、のxsrc、ySrc、srcWidth、srcHeight、0、0、0 ); } LRESULT CALLBACK WndProcメソッド(HWNDのHWND、UINTメッセージ、WPARAM wParamに、LPARAM lParamに) { スイッチ(メッセージ) { ケースWM_CREATE: dcWin = GetDC(HWND)。 dcBmp1 = CreateCompatibleDC(dcWin)。 dcBmp2 = CreateCompatibleDC(dcWin)。 hBmp1 = LoadBitmap(hInst、MAKEINTRESOURCE(IDB_BITMAP1))。 hBmp2 = CreateCompatibleBitmap(dcWin、98、98 ); SelectObject(dcBmp1、hBmp1); SelectObject(dcBmp2、hBMP2); // 角度がdcBmp2に絵の回転角の中心の座標(49,49)にdcBmp1 回転(dcBmp2、49、49、角度、dcBmp1 、0、0、98、98、0xFFFFFFの) のSetTimer(HWND、ID_TIMER、500 、NULL); BREAK ; ケースWM_PAINT: HDC = BeginPaint関数(HWND、&PS) にSetBkMode(HDC、TRANSPARENT); のBitBlt(HDC、0は、0、98、98、dcBmp1、0、0 、SRCCOPY)。 BitBlt(HDC、100、0、98、98、dcBmp2、0、0 、SRCCOPY)。 EndPaint(HWND、 &PS); 破ります; ケースWM_TIMER: もし(wParamに== ID_TIMER) { 角 =(角度+ 15)%360 。 [回転(dcBmp2、49、49、角度、dcBmp1、0、0、98、98、0xFFFFFFの)。 InvalidateRect(HWND、NULL、真の); UpdateWindow(HWND)。 } ブレーク; ケースWM_DESTROY: ReleaseDCの(HWND、dcWin)。 DeleteDC(dcBmp1)。 DeleteDC(dcBmp2)。 DeleteObjectの(hBmp1)。 DeleteObjectの(hBmp2)。 KillTimer(HWND、ID_TIMER)。 PostQuitMessage(0 )。 リターン 0 ; } リターンDefWindowProc関数(HWND、メッセージ、wParamに、lParamに)。 }