SelectClipRgn

SelectClipRgnを使うことで、指定のデバイスコンテキストの描画領域を、指定されたリージョンの部分のみにできる。

SelectClipRgn function (wingdi.h) - Win32 apps | Microsoft Docs

楕円と矩形を結合したリージョンを選択すれば、画像を描画しても結合したリージョンの形に描画される。
(こういうのをクリッピングという。)

WM_CREATEで、

ビットマップのロードとともに、矩形リージョンと楕円リージョンを結合。

WM_PAINTで、

SelectClipRgnでhDCにhRgn1を選択。
これでhDCに描画したものはhRgn1の領域からはみ出ない。
BitBltで画像をhDCに描画すると、

リージョンのところだけ画像が描画される。
リージョンのところだけ画像が描画される。

リージョンのところだけ画像が描画される。

Sample/winapi/SelectClipRgn/SelectClipRgn/src/SelectClipRgn at master · bg1bgst333/Sample · GitHub

CombineRgn

CombineRgnは、2つのリージョンを結合する。

CombineRgn function (wingdi.h) - Win32 apps | Microsoft Docs

WM_CREATEで、

第1引数が結合先リージョン、第2引数が1つ目、第3引数が2つ目で、大体は1つ目のリージョンに2つ目のリージョンを結合するパターンである。
というか空のリージョンハンドルみたいなものがないので、大体こうやって1つずつ結合していくしかない・・・。
(アドレス渡しもできないし・・・。)
今回は矩形リージョンと楕円リージョンを結合する。

WM_PAINTで、

赤いブラシで結合したリージョンを描画すると、

矩形と楕円が結合しているのがわかる。
矩形と楕円が結合しているのがわかる。

矩形と楕円が結合しているのがわかる。

Sample/winapi/CombineRgn/CombineRgn/src/CombineRgn at master · bg1bgst333/Sample · GitHub

CreateEllipticRgn

CreateEllipticRgnは、楕円形のリージョンを生成する。

CreateEllipticRgn function (wingdi.h) - Win32 apps | Microsoft Docs

WM_CREATEで、

楕円リージョンhRgnと赤いブラシhBrush。
WM_PAINTで、

SelectObjectでhBrushを選択して、PaintRgnでhRgnを描画。

楕円が描画された。
楕円が描画された。

楕円が描画された。

Sample/winapi/CreateEllipticRgn/CreateEllipticRgn/src/CreateEllipticRgn at master · bg1bgst333/Sample · GitHub

FrameRgn

FrameRgnは、リージョンの境界線を指定のブラシで描画する。

FrameRgn function (wingdi.h) - Win32 apps | Microsoft Docs

ブラシ、縦線の太さ、横線の太さを指定できる。

今回は、赤いブラシと青いフレーム用ブラシの2種類を用意。

		// 画面の描画を要求された時.
		case WM_PAINT:		// 画面の描画を要求された時.(uMsgがWM_PAINTの時.)
 
			// WM_PAINTブロック
			{

				// このブロックのローカル変数の宣言
				HDC hDC;			// デバイスコンテキストハンドルを格納するHDC型変数hDC.
				PAINTSTRUCT ps;		// ペイント情報を管理するPAINTSTRUCT構造体型の変数ps.
				HBRUSH hOldBrush;	// SelectObjectされるまで使っていた古いブラシのハンドルhOldBrush.

				// ウィンドウの描画開始
				hDC = BeginPaint(hwnd, &ps);	// BeginPaintでこのウィンドウの描画の準備をする. 戻り値にはデバイスコンテキストハンドルが返るので, hDCに格納.
				
				// 赤いブラシを選択.
				hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);	// hBrushを選択.

				// フレーム付きリージョンの描画.
				PaintRgn(hDC, hRgn);	// 赤いリージョンの描画.
				//FrameRgn(hDC, hRgn, hFrameBrush, 1, 3);	// 横幅1で縦幅3のフレーム付きリージョンの描画.

				// 元のブラシに戻す.
				SelectObject(hDC, hOldBrush);	// SelectObjectで元のブラシに戻す.

				// ウィンドウの描画終了
				EndPaint(hwnd, &ps);	// EndPaintでこのウィンドウの描画処理を終了する.

			}

			// 既定の処理へ向かう.
			break;	// breakで抜けて, 既定の処理(DefWindowProc)へ向かう.

PaintRgnだと、

PaintRgnだと塗りつぶされる
PaintRgnだと塗りつぶされる

中身も塗りつぶされる。
しかし、

FrameRgnだと、

青い境界線だけ
青い境界線だけ

青い境界線だけ描かれる。

Sample/winapi/FrameRgn/FrameRgn/src/FrameRgn at master · bg1bgst333/Sample · GitHub

FillRgn

FillRgnは、指定されたブラシでリージョンを描画する。

FillRgn function (wingdi.h) - Win32 apps | Microsoft Docs

WM_CREATEで、

こちらでも赤いブラシを作成。

WM_PAINTで、

こちらではFillRgnにhBrushを直接指定。

赤いブラシで描画
赤いブラシで描画

赤いブラシで描画された。

Sample/winapi/FillRgn/FillRgn/src/FillRgn at master · bg1bgst333/Sample · GitHub

PaintRgn

PaintRgnは、指定されたデバイスコンテキストに設定されているブラシやペンでリージョンを描画する。

PaintRgn function (wingdi.h) - Win32 apps | Microsoft Docs

WM_CREATEで、

リージョンとともに、赤いブラシも生成。

WM_PAINTは、

SelectObjectでhDCに赤いブラシをセットして、hDCを渡したPaintRgnで描画。

赤いブラシで描画
赤いブラシで描画

赤いブラシで描画された。

Sample/winapi/PaintRgn/PaintRgn/src/PaintRgn at master · bg1bgst333/Sample · GitHub

Polygon

Polygonは指定された頂点を持つ閉じた多角形を描画する。

Polygon function (wingdi.h) - Win32 apps | Microsoft Docs

5つの頂点をPOINTの配列ptで指定する。
WM_CREATEで、

頂点、そしてペンやブラシをセット。
WM_PAINTで、

Polygonでptと頂点の数を指定する。

こんな五角形が描画された
こんな五角形が描画された

こんな五角形が描画された。

Sample/winapi/Polygon/Polygon/src/Polygon at master · bg1bgst333/Sample · GitHub