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

SetROP2

SetROP2を使うと、背景色の上に描画色を描画する時の、ビットピクセル操作のモードを変更できる。
(こういう処理をラスタオペレーションというらしい。)

SetROP2 function (wingdi.h) | Microsoft Docs
ラスタオペレーション

WM_PAINTで、

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

			// WM_PAINTブロック
			{

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

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

				// 2つの白い矩形を描画.
				Rectangle(hDC, 10, 10, 100, 100);	// 左上
				Rectangle(hDC, 60, 60, 160, 160);	// 右下

				// 新規に作成した赤いペンと赤いブラシを選択.
				hOldPen = (HPEN)SelectObject(hDC, hPen1);	// hPen1を選択.
				hOldBrush = (HBRUSH)SelectObject(hDC, hBrush1);	// hBrush1を選択.

				// 赤い矩形を描画.
				Rectangle(hDC, 300, 300, 400, 400);	// Rectangleで矩形を描画.

				// 新規に作成した青いペンと青いブラシを選択.
				(HPEN)SelectObject(hDC, hPen2);	// hPen2を選択.
				(HBRUSH)SelectObject(hDC, hBrush2);	// hBrush2を選択.

				// 青い矩形を描画.
				Rectangle(hDC, 350, 350, 450, 450);	// Rectangleで矩形を描画.

				// 元に戻す.
				(HPEN)SelectObject(hDC, hOldPen);	// hOldPenを選択.
				(HBRUSH)SelectObject(hDC, hOldBrush);	// hOldBrushを選択.

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

			}

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

とした場合、

デフォルト
デフォルト

デフォルトは、そのまま重ね合わせるのでこうなる。
しかし、

SetROP2で、背景と描画色が同じなら反転するR2_XORPENをセットすると、

R2_XORPEN
R2_XORPEN

こうなる。
左上は、背景が白で、描画する矩形も白なので黒になり、矩形が重なる部分はさらに反転して白になる。
右下は、色が変わってしまう。

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

CreateHatchBrush

CreateHatchBrushで、模様付きのブラシを作成できる。

CreateHatchBrush function (wingdi.h) | Microsoft Docs
ブラシを作ろう

ハッチパターンって言うのね・・・。

WM_CREATEで、

赤いペンと青い横縞状のハッチブラシを作成。

WM_PAINTで、

で、それを使って描画。

WM_DESTROYで、

終わったら破棄。

赤い外枠に青い横縞線の矩形
赤い外枠に青い横縞線の矩形

赤い外枠に青い横縞線の矩形。

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

PolyBezierTo

PolyBezierToで、ベジェ曲線を描画できる。

PolyBezierTo function (wingdi.h) | Microsoft Docs
ベジェ曲線
ベジェ曲線を手で描いてみる - にせねこメモ

ベジェ曲線の描き方とか理論とかはちょっと難しいので上の記事を参照。
PolyBezierTo.cppにおいて、WindowProcのWM_CREATE時に、

	// スタティック変数の宣言
	static POINT pt[3];	// ベジェ曲線の描画に必要な制御点pt.(要素数3.)

	// ウィンドウメッセージに対する処理.
	switch (uMsg) {	// switch-casa文でuMsgの値ごとに処理を振り分ける.

		// ウィンドウの作成が開始された時.
		case WM_CREATE:		// ウィンドウの作成が開始された時.(uMsgがWM_CREATEの時.)

			// WM_CREATEブロック
			{

				// ベジェ曲線の描画に必要な制御点の初期値をセット.
				pt[0].x = 200;	// pt[0]のX座標は200.
				pt[0].y = 150;	// pt[0]のY座標は150.
				pt[1].x = 300;	// pt[1]のX座標は300.
				pt[1].y = 200;	// pt[1]のY座標は200.
				pt[2].x = 400;	// pt[2]のX座標は400.
				pt[2].y = 250;	// pt[2]のY座標は250.

				// ウィンドウ作成成功
				return 0;	// return文で0を返して, ウィンドウ作成成功とする.

			}

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

まずは、こんな感じで1つの直線上に制御点が通るようにセットしておく。
WM_PAINTで、

開始の制御点も(100, 100)で、これで(100, 100)-(400, 250)の直線上を通るようになっている。
これで実行すると、

ベジェ曲線どころか直線
ベジェ曲線どころか直線

ベジェ曲線どころか直線になってしまう。
そこで、

pt[0]の座標がより左下、pt[1]の座標がより右上に来るように、制御点を修正すると、

S字に曲がるようになった
S字に曲がるようになった

S字に曲がるようになった。
ベジェ曲線っぽいね。

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

Beep

Beepは、ビープ音を鳴らす。

Beep function (utilapiset.h) | Microsoft Docs
ビープ音を鳴らす - プログラミングのメモ帳(C/C++/HSP)

ドの音は440Hzらしいので、それを流してみる。

Win32コンソールアプリケーション
Win32コンソールアプリケーション

Win32コンソールアプリケーションで、

空のプロジェクト
空のプロジェクト

空のプロジェクト。

新しい項目
新しい項目

新しい項目を追加。

Beep.cppを追加。
Beep.cppを追加。

Beep.cppを追加。

440Hzを3秒鳴らす。

Beep 440Hz Start!
Beep 440Hz End!
続行するには何かキーを押してください . . .

動画じゃないと伝わらないと思うが、StartとEndの間でドの音階の信号音が3秒間鳴った。

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

Ellipse

Ellipseは、楕円を描画する。

Ellipse function (wingdi.h) | Microsoft Docs

矩形の、左端、上端、右端、下端、を指定することで、その矩形に内接する楕円を描画する。
Ellipse.cppのWM_PAINTで、

Ellipseに矩形情報を渡すだけ。

楕円
楕円

このように楕円というかこの場合はほぼ円が描画される。

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

PolylineTo

PolylineToは、多角形を描画する。

PolylineTo function | Microsoft Docs

直角三角形を描画する。
PolylineTo.cppのWM_CREATEで、

始点を(50, 50)として、直角三角形を描画するが、始点はMoveToExでセットするため、次の点、そのまた次の点、最後の点(これが始点と同じ)となるようにPOINT配列ptにセットしておく。

WM_PAINTで、

MoveToExで始点(50, 50)をセットしてから、PolylineToにptと直線の数である3を渡す。

直角三角形
直角三角形

直角三角形が描画されている。

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