プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

PlgBltで右180度回転

2011年06月06日 18時42分00秒 | グラフィック関連

長方形領域の右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 座標
);

頂点座標

平行四辺形の頂点座標には、次のようにセットします。

  1. lpPoint[0]に右下隅の①をセットする。
  2. lpPoint[1]に左下隅の②をセットする。
  3. lpPoint[2]に右上隅の③をセットする。


関数紹介

この関数は右180度回転させたい長方形領域を指定します。

  1. hDC には、デバイスコンテキストのハンドルを指定します。
  2. cx には、長方形領域の左上隅の x 座標を指定します。
  3. cy には、長方形領域の左上隅の y 座標を指定します。
  4. sx には、長方形領域の横サイズを指定します。
  5. 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 );
}

実行結果


関連記事

←前へ] [目次] [次へ→

コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« PlgBltで右90度回転 | トップ | PlgBltで右270度回転 »
最新の画像もっと見る

コメントを投稿

グラフィック関連」カテゴリの最新記事