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