GDIオブジェクトの数って何ですか?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

GDIオブジェクトの数って何ですか?

#1 投稿記事 by ケースケ »

↓ABのメモリ関係?バグ
http://www.discoversoft.net/forum/viewtopic.php?t=167
を見て、気になって自分の作ったプログラムのGDIオブジェクトの数を調べてみました。

1つ、モードレスダイアログを表示する度にGDIオブジェクトの数が上がっていくプログラムがありました。
問題のダイアログは、表示する時と閉じる時にマルチスレッドを一瞬実行して(ウインドウをスライド移動させて画面の外に出したり入れたりしています)、Staticの1つをWM_SETFONTでフォント変更しています。
5つのコントロールを配置して、GDIオブジェクトの数も5ずつ増えるのですが、

GDIオブジェクトの数とは、何者で、何をしたときに増えて(多分ウインドウを表示した時だと思うのですが・・・)、何をしたら減らせますか?

増えて問題ないものならいいのですが、ProjectEditerのように描写に問題が発生するようなら困ったな・・・と思っています。
ナナシ
記事: 11
登録日時: 2005年6月19日(日) 21:21
お住まい: 石川県
連絡する:

#2 投稿記事 by ナナシ »

GDIオブジェクトをざっとあげてみると
・デバイスコンテキスト
・ビットマップ
・ペン
・ブラシ
・リージョン
・フォント
・パレット
などがそうです。他にもあるでしょう。

たとえばCreateBitmapを行うとビットマップが1つ作られるので
GDIオブジェクトの数は1つ増えます。
逆に作成したビットマップをDeleteBitmapで削除すれば1つ減ります。
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

#3 投稿記事 by ケースケ »

ありがとうございます。

RADツールで作ったコントロールもGDIオブジェクトの1つとしてカウントされているのでしょうか?
それが開放されていないとすると、プログラムから特別に何か書くべきですか?

DeleteDC?
DeleteObject?

この辺の命令でしょうか?

再度よろしくお願いします。
ナナシ
記事: 11
登録日時: 2005年6月19日(日) 21:21
お住まい: 石川県
連絡する:

#4 投稿記事 by ナナシ »

コントロールそのものはGDIオブジェクトではないのでカウントはされません。

今回の場合はWM_SETFONTを使用しているとのことですので、
WM_SETFONT用に作成したフォントが削除されていないのではないでしょうか。

コード: 全て選択


Function MainWnd_Create(...)
  Dim hFont As HFONT
  hFont = CreateFont(...)
  SendMessage(hMainWnd, WM_SETFONT, hFont, 0)
EndFunction
上記のようなコードの場合 hFont はローカル変数なので
MainWnd_Create を出るとクリアされますが、
フォントは DeleteObject をするまで残ったままになる点に注意してください。
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

#5 投稿記事 by ケースケ »

ありがとうございます。

フォントをダイアログボックス表示毎に作って、毎回削除するようにすればGDIオブジェクトの増加が少し減りました。


プログラムの最初にフォントを作って、最後に削除するのではいけないのですね。 でもCallbackの中を覗くと最初にフォントを作って最後に削除しているような・・・?


とりあえず、問題解決のコツは分かった(と思う)ので、後はいろいろやってみます。
ありがとうございました。
返信する