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

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

PlgBltの使い方

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

図形の反転処理、展開処理、回転処理、拡大縮小は PlgBlt 関数でそれぞれ行えます。

  • 左右反転、上下反転
  • 上側展開、下側展開、左側展開、右側展開
  • 右90度回転、右180度回転、右270度回転
  • 左90度回転、左180度回転、左270度回転
  • 縮小(50%)、原寸(100%)、拡大(200%)

この関数は長方形領域から平行四辺形に変形して転送するのが目的です。
しかし、平行四辺形の頂点座標を適切にセットすることで図形の反転処理などが行えます。
ここでは、その具体的な方法を紹介します。

プロトタイプ宣言

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]に図形の左下隅をセットする。

下記は転送前と lpPoint[0] ~ lpPoint[2] の位置が同じため BitBlt 関数と同じ結果になります。
頂点座標を適切にセットすることで図形の反転処理、展開処理、回転処理、拡大縮小が行えます。

左右反転

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

//------------------------------------------------
// 長方形領域の左右反転を行う
//------------------------------------------------
extern VOID funcPlgBltHReverse( 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 = cy;
    po[ 1 ].x = cx;
    po[ 1 ].y = cy;
    po[ 2 ].x = ex;
    po[ 2 ].y = ey;
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

上下反転

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

//------------------------------------------------
// 長方形領域の上下反転を行う
//------------------------------------------------
extern VOID funcPlgBltVReverse( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    po[ 0 ].x = cx;
    po[ 0 ].y = ey;
    po[ 1 ].x = ex;
    po[ 1 ].y = ey;
    po[ 2 ].x = cx;
    po[ 2 ].y = cy;
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

上側展開

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

//------------------------------------------------
// 長方形領域の上側展開を行う
//------------------------------------------------
extern VOID funcPlgBltFoldUp( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    sy /= 2;
    po[ 0 ].x = (cx);
    po[ 0 ].y = (ey);
    po[ 1 ].x = (ex);
    po[ 1 ].y = (ey);
    po[ 2 ].x = (cx);
    po[ 2 ].y = (ey - sy);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

下側展開

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

//------------------------------------------------
// 長方形領域の下側展開を行う
//------------------------------------------------
extern VOID funcPlgBltFoldDown( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    sy /= 2;
    cy += sy;
    po[ 0 ].x = (cx);
    po[ 0 ].y = (cy);
    po[ 1 ].x = (ex);
    po[ 1 ].y = (cy);
    po[ 2 ].x = (cx);
    po[ 2 ].y = (cy - sy);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

左側展開

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

//------------------------------------------------
// 長方形領域の左側展開を行う
//------------------------------------------------
extern VOID funcPlgBltFoldLeft( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    sx /= 2;
    po[ 0 ].x = (ex);
    po[ 0 ].y = (cy);
    po[ 1 ].x = (ex - sx);
    po[ 1 ].y = (cy);
    po[ 2 ].x = (ex);
    po[ 2 ].y = (ey);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

右側展開

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

//------------------------------------------------
// 長方形領域の右側展開を行う
//------------------------------------------------
extern VOID funcPlgBltFoldRight( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    sx /= 2;
    cx += sx;
    po[ 0 ].x = (cx);
    po[ 0 ].y = (cy);
    po[ 1 ].x = (cx - sx);
    po[ 1 ].y = (cy);
    po[ 2 ].x = (cx);
    po[ 2 ].y = (ey);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

右90度回転(左270度回転)

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


//------------------------------------------------
// 長方形領域の右90度回転を行う
//------------------------------------------------
extern VOID funcPlgBltRote90( 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 = cy;
    po[ 1 ].x = ex;
    po[ 1 ].y = ey;
    po[ 2 ].x = cx;
    po[ 2 ].y = cy;
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

右180度回転(左180度回転)

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


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

詳細を見る

右270度回転(左90度回転)

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


//------------------------------------------------
// 長方形領域の右270度回転を行う
//------------------------------------------------
extern VOID funcPlgBltRote270( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    po[ 0 ].x = cx;
    po[ 0 ].y = ey;
    po[ 1 ].x = cx;
    po[ 1 ].y = cy;
    po[ 2 ].x = ex;
    po[ 2 ].y = ey;
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

縮小(50%)

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

//------------------------------------------------
// 長方形領域の縮小(50%)を行う
//------------------------------------------------
extern VOID funcPlgBltZoom50( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    po[ 0 ].x = (cx);
    po[ 0 ].y = (cy);
    po[ 1 ].x = (cx + sx/2);
    po[ 1 ].y = (cy);
    po[ 2 ].x = (cx);
    po[ 2 ].y = (cy + sy/2);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

原寸(100%)

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

//------------------------------------------------
// 長方形領域の原寸(100%)を行う
//------------------------------------------------
extern VOID funcPlgBltZoom100( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    po[ 0 ].x = (cx);
    po[ 0 ].y = (cy);
    po[ 1 ].x = (ex);
    po[ 1 ].y = (cy);
    po[ 2 ].x = (cx);
    po[ 2 ].y = (ey);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る

拡大(200%)

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

//------------------------------------------------
// 長方形領域の拡大(200%)を行う
//------------------------------------------------
extern VOID funcPlgBltZoom200( HDC hDC, LONG cx, LONG cy, LONG sx, LONG sy )
{
    LONG    ex = (cx + sx);
    LONG    ey = (cy + sy);
    POINT   po[ 3 ];
    
    po[ 0 ].x = (cx);
    po[ 0 ].y = (cy);
    po[ 1 ].x = (ex + sx);
    po[ 1 ].y = (cy);
    po[ 2 ].x = (cx);
    po[ 2 ].y = (ey + sy);
    PlgBlt( hDC, po, hDC, cx, cy, sx, sy, NULL, 0, 0 );
}

詳細を見る



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« PlgBltで拡大(200%) | トップ | MSDNライブラリ(日本語版) »
最新の画像もっと見る

コメントを投稿

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