ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

CProgressCtrlのSetStateが反映されない

CProgressCtrlの色を変えようとしたがハマったのでメモ。

CProgressCtrlは、WindowsThemeが有効だとプログレスバーの色を変えるSetBarColorが無視される。そこで、SetStateでPBST_NORMAL, PBST_PAUSED, PBST_ERRORのいずれかを指定することでテーマに沿った色に変えることにした。しかし、なぜか変わらない!

ブレークポイントを設定したら変わることに気づいたので、ためしにバーの値更新周期を50msから500msにしてみたら、動いた。こんなの気づかないよ・・・。どこにもドキュメントされてないし。

以下、更新部分のソースコード

 

Updating CProgressCtrl State

追記:どうやら、プログレスバーの長さが変わっている最中にSetStateしても無視されるようだ。Vista以降では、SetPosで長さを変えると、その長さに向かってプログレスバーが伸びるアニメーションをする。このアニメーションをキャンセルすることで、瞬時にSetStateが有効になる。

 以下、サンプルコード。

gist.github.com