図形の反転処理、展開処理、回転処理、拡大縮小は 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 座標 );
頂点座標
平行四辺形の頂点座標には、次のようにセットします。
- lpPoint[0]に図形の左上隅をセットする。
- lpPoint[1]に図形の右上隅をセットする。
- lpPoint[2]に図形の左下隅をセットする。
下記は転送前と lpPoint[0] ~ lpPoint[2] の位置が同じため BitBlt 関数と同じ結果になります。
頂点座標を適切にセットすることで図形の反転処理、展開処理、回転処理、拡大縮小が行えます。
左右反転
- lpPoint[0]に右上隅の①をセットする。
- lpPoint[1]に左上隅の②をセットする。
- 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 ); }
[詳細を見る]
上下反転
- lpPoint[0]に左下隅の①をセットする。
- lpPoint[1]に右下隅の②をセットする。
- 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 ); }
[詳細を見る]
上側展開
- lpPoint[0]に左下隅の①をセットする。
- lpPoint[1]に右下隅の②をセットする。
- 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 ); }
[詳細を見る]
下側展開
- lpPoint[0]に左中央の①をセットする。
- lpPoint[1]に右中央の②をセットする。
- 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 ); }
[詳細を見る]
左側展開
- lpPoint[0]に右上隅の①をセットする。
- lpPoint[1]に上中央の②をセットする。
- 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 ); }
[詳細を見る]
右側展開
- lpPoint[0]に上中央の①をセットする。
- lpPoint[1]に左上隅の②をセットする。
- 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度回転)
- lpPoint[0]に右上隅の①をセットする。
- lpPoint[1]に右下隅の②をセットする。
- 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度回転)
- lpPoint[0]に右下隅の①をセットする。
- lpPoint[1]に左下隅の②をセットする。
- 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度回転)
- lpPoint[0]に左下隅の①をセットする。
- lpPoint[1]に左上隅の②をセットする。
- 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%)
- lpPoint[0]に左上隅の①をセットする。
- lpPoint[1]に上中央の②をセットする。
- 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%)
- lpPoint[0]に左上隅の①をセットする。
- lpPoint[1]に右上隅の②をセットする。
- 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%)
- lpPoint[0]に左上隅の①をセットする。
- lpPoint[1]に右上隅の②をセットする。
- 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 ); }
[詳細を見る]
※コメント投稿者のブログIDはブログ作成者のみに通知されます