LoginSignup
2
0

More than 1 year has passed since last update.

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

Posted at

トラブル内容

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

<正常時>
image.png
<異常時>
image.png

原因

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

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

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

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

対策内容

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

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

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

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0