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をセットすると、
こうなる。
左上は、背景が白で、描画する矩形も白なので黒になり、矩形が重なる部分はさらに反転して白になる。
右下は、色が変わってしまう。
Sample/winapi/SetROP2/SetROP2/src/SetROP2 at master · bg1bgst333/Sample · GitHub