長方形領域の右180度回転(左180度回転)を行うには PlgBlt 関数を使います。
この API 関数は長方形領域から平行四辺形に変形して転送します。
しかし、平行四辺形の頂点座標を適切にセットすることで図形の右180度回転(左180度回転)が行えます。
ここでは、その具体的な方法を紹介します。
プロトタイプ宣言
BOOL PlgBlt( HDC hdcDest, // 転送先のデバイスコンテキスト・ハンドル CONST POINT* lpPoint, // 転送先の平行四辺形の頂点 HDC hdcSrc, // 転送元のデバイスコンテキスト・ハンドル int nXSrc, // 転送元長方形の左上隅の x 座標 int nYSrc, // 転送元長方形の左上隅の y 座標 int nWidth, // 転送元長方形の横幅 int nHeight, // 転送元長方形の高さ HBITMAP hbmMask, // ビットマスクのハンドル int xMask, // ビットマスク長方形の左上隅の x 座標 int yMask // ビットマスク長方形の左上隅の y 座標 );
頂点座標
平行四辺形の頂点座標には、次のようにセットします。
- lpPoint[0]に右下隅の①をセットする。
- lpPoint[1]に左下隅の②をセットする。
- lpPoint[2]に右上隅の③をセットする。
関数紹介
この関数は右180度回転させたい長方形領域を指定します。
- hDC には、デバイスコンテキストのハンドルを指定します。
- cx には、長方形領域の左上隅の x 座標を指定します。
- cy には、長方形領域の左上隅の y 座標を指定します。
- sx には、長方形領域の横サイズを指定します。
- sy には、長方形領域の縦サイズを指定します。
//------------------------------------------------ // 長方形領域の右180度回転を行う //------------------------------------------------ extern VOID funcPlgBltRote180( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy ) { LONG ex = (cx + sx); LONG ey = (cy + sy); POINT po[ 3 ]; po[ 0 ].x = ex; po[ 0 ].y = ey; po[ 1 ].x = cx; po[ 1 ].y = ey; po[ 2 ].x = ex; po[ 2 ].y = cy; PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 ); }
サンプル
//------------------------------------------------ // 便利なマクロ関数 //------------------------------------------------ #define apiCreateFont(x,y,n,i,u,v,s)\ CreateFont(y,x,0,0,n,i,u,v,\ SHIFTJIS_CHARSET,\ OUT_DEFAULT_PRECIS,\ CLIP_DEFAULT_PRECIS,\ DEFAULT_QUALITY,\ (FIXED_PITCH | FF_DONTCARE),s) //------------------------------------------------ // 巨大な立体文字の描画 //------------------------------------------------ static VOID funcDrawBigString( HDC hDC, LPRECT lprc, LPCTSTR lpString, COLORREF crColor[], UINT nMax ) { nMax--; OffsetRect( lprc, nMax, nMax ); SetTextColor( hDC, *crColor++ ); DrawText( hDC, lpString, -1, lprc, (DT_CENTER | DT_VCENTER | DT_SINGLELINE) ); while ( nMax > 0 ){ OffsetRect( lprc, -1, -1 ); SetTextColor( hDC, *crColor++ ); DrawText( hDC, lpString, -1, lprc, (DT_CENTER | DT_VCENTER | DT_SINGLELINE) ); nMax--; } } //------------------------------------------------ // 巨大な1文字の描画 //------------------------------------------------ static VOID funcDrawBigMoji( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy, TCHAR tcMoji ) { static COLORREF crColor[ 6 ] = { RGB(0xCC,0x66,0x00), RGB(0xFF,0x99,0x00), RGB(0xFF,0x99,0x00), RGB(0xFF,0x99,0x00), RGB(0xFF,0x99,0x00), RGB(0xFF,0xCC,0x00), }; RECT rc; HGDIOBJ hFont; TCHAR szMoji[ 4 ]; hFont = apiCreateFont( 0, sx, FW_BOLD, 0, 0, 0, TEXT("MS 明朝") ); hFont = SelectObject( hDC, hFont ); SetRect( &rc, 0, 0, sx, sy ); OffsetRect( &rc, cx, cy ); SetDCPenColor( hDC, RGB(0x00,0x00,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0xFF,0xCC) ); Rectangle( hDC, rc.left, rc.top, rc.right, rc.bottom ); szMoji[ 0 ] = tcMoji; szMoji[ 1 ] = TEXT('\0'); funcDrawBigString( hDC, &rc, szMoji, crColor, 6 ); DeleteObject( SelectObject(hDC,hFont) ); } //------------------------------------------------ // WM_PAINTメッセージの処理 //------------------------------------------------ static VOID OnPaint( HWND hWnd ) { PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint( hWnd, &ps ); SetBkMode( hDC, TRANSPARENT ); SelectObject( hDC, GetStockObject(DC_PEN) ); SelectObject( hDC, GetStockObject(DC_BRUSH) ); funcDrawBigMoji( hDC, 10, 10, 256, 256, TEXT('G') ); funcDrawBigMoji( hDC, 276, 10, 256, 256, TEXT('G') ); funcPlgBltRote180( hDC, 276, 10, 256, 256 ); EndPaint( hWnd, &ps ); }
※コメント投稿者のブログIDはブログ作成者のみに通知されます