画像の回転を達成するためのWindows API(GDI)

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、00 ))
    { 
        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、000 ); 
} 

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、9898 ); 

            SelectObject(dcBmp1、hBmp1); 
            SelectObject(dcBmp2、hBMP2); 

            // 角度がdcBmp2に絵の回転角の中心の座標(49,49)にdcBmp1 
            回転(dcBmp2、4949、角度、dcBmp1 、0098980xFFFFFFの
            
            のSetTimer(HWND、ID_TIMER、500 、NULL); 
            
            BREAK ;
         ケースWM_PAINT:
            HDC = BeginPaint関数(HWND、&PS)
            にSetBkMode(HDC、TRANSPARENT); 

            のBitBlt(HDC、0は09898、dcBmp1、00 、SRCCOPY)。
            BitBlt(HDC、10009898、dcBmp2、00 、SRCCOPY)。

            EndPaint(HWND、 PS);
            破ります;
        ケースWM_TIMER:
             もし(wParamに== ID_TIMER)
            {  =(角度+ 15)%360 
                [回転(dcBmp2、4949、角度、dcBmp1、0098980xFFFFFFの)。
                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に)。
}

 

おすすめ

転載: www.cnblogs.com/ddcoder/p/11628116.html