【Win32】WindowsAPIを利用したC++自作ソフトにおける描画乱れ


トラブル内容

WindowsAPIを利用したC++自作ソフトを起動後、10分ぐらい放置するとスタティックコントロールの色が乱れ始めた。

<正常時>

<異常時>

原因

色塗りを行うために、CreateSolidBrush関数でブラシを作成していたが、ブラシ作成後削除していなかった。
ソフトは定期的に色塗りを自動で行うようにしており、ブラシ作成 → 未削除 が繰り返し発生したため、ブラシが大量に残った。
これによって、GDIオブジェクトが大量に生成され、オブジェクトの枯渇によってスタティックコントロールの色が乱れ始めた。

int Coloring(){
    HBRUSH BrushYellow;
    BrushYellow = CreateSolidBrush(RGB(255, 242, 0));  //黄色のブラシを作成
    // 色塗りを実施(省略)
}

最初は問題ないにもかかわらず、ある時点から描画が乱れるという場合には、WindowsのGDIオブジェクトが大量に消費されて枯渇している可能性がある。

<正常時のタスクマネージャーの状態 GDIオブジェクト数:159>

<異常時のタスクマネージャーの状態 GDIオブジェクト数:9999>

対策内容

①色塗り実施後に、DeleteObject関数でブラシを削除する。

int Coloring(){
    HBRUSH BrushYellow;
    BrushYellow = CreateSolidBrush(RGB(255, 242, 0));  //黄色のブラシを作成
    // 色塗りを実施(省略)
    DeleteObject(BrushYellow);
}

②必要なブラシは事前に作成し、以降、ブラシを作成しないような作りに変更する。
 具体的には、ブラシの作成はソフト起動時のみ、ブラシの削除はソフト終了時に実施するように変更する。

参考