SaveDC

SaveDCは、デバイスコンテキストの状態を保存する。

SaveDC function | Microsoft Docs

SetTextColorでテキストの色、SelectObjectでペンやブラシなどのGDIオブジェクトとの紐づけなど、デバイスコンテキストの状態は頻繫に変わる。
状態を保存しておけば、切り替えに手間がかからない。

SaveDC.cppのWM_COMMANDで、

メニュー項目、Red、Green、Blue、が選択されるごとに、スタティック変数whichの値を変えて画面更新。
あとはWM_PAINTに任せる。

BeginPaint直後に、SetTextColorで赤、緑、青と変えつつ、そのたびにSaveDCで保存している。
SaveDCの戻り値にIDが返り、それをRestoreDCに渡すと復元できる。
なので、最終的にwhichの値で復元する色を決めている。

最初は黒
最初は黒

最初は黒。

Red
Red

Redを選択すると、

赤になる
赤になる

赤になる。

Green
Green

Greenは、

緑になる
緑になる

緑になる。

Blue
Blue

Blueは、

青になる
青になる

青になる。

本当は、あらかじめWM_CREATEとかでSaveDCしてWM_PAINTはRestoreDCだけだったり、1回目の選択でSetTextColorしてSaveDCし、2回目以降はRestoreDCだけするようにしてみたが、デバイスコンテキストハンドルはWM_PAINTするたびに変わってしまい、SaveDCしてもデバイスコンテキストが違うので、状態がスタックしない。
なので、今回はBeginPaintからEndPaintまでの間でSaveDCを繰り返した。
やってみて、これだとSelectObjectやSetTextColorを繰り返すより手間が減るかというと微妙であると感じた・・・。
まあ、量が多ければ減るとはおもうが・・・。

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