HDCの制限

解決


origi  2005-01-19 19:07:00  No: 56072  IP: [192.*.*.*]

疑問に思っていることがあるのでお願いします。
OSはWindows XP の Visual C++ .net の WinAPI です。
いま、グローバルの HDC をいくつも作ってそれを画面に時に応じて表示しているのですが、
HDC ってだいたいどれくらいまで作れるのでしょうか?
いまは40*40が10〜20ほどなのですが、後には100くらいまでになる予定なので、
どれほどまで大丈夫か教えてください。お願いします。

あと、次のようなものは問題ないのでしょうか?リソースが気になって・・・。

(けっこういいかげんです。細かいことは気にしないでください。)
HDC hDC;
HBITMAP hBmp;

WndPro()
{
  WM_CREATE:
    hBmp = LoadBMP("test.bmp")   //(自作関数)
    SelectObject(hDC, hBmp);
    break;
  WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    BitBlt(hdc, ...., hDC, ...);
    EndPaint(hWnd, &ps);
  WM_CLOSE:
    DeleteObject(hBmp);
    DeleteDC(hDC);
}

この上のプログラムで、WM_CREATE 時に
 hOldBmp = SelectObject();
とするべきでしょうか?お願いします。

編集 削除
origi  2005-01-19 19:08:50  No: 56073  IP: [192.*.*.*]

上の追加で、
WM_CREATE:
  ...
  hOldBmp = SelectObject();
  break;
WM_CLOSE:
  ...
  SelectObject(hDC, hOldBmp);
  DeleteDC(hDC);

つけわすれました。これってやったほうがいいのでしょうか?

編集 削除
シャノン  2005-01-19 22:56:44  No: 56074  IP: [192.*.*.*]

昔の OS では個数制限があったような気がしますが、ソースが見つかりません。
最近の OS では、

> デバイスコンテキストの数は、利用可能なメモリの量によってのみ制限されます。

だそうです(ReleaseDC の説明から抜粋)。

編集 削除
origi  2005-01-20 21:53:28  No: 56075  IP: [192.*.*.*]

シャノンさんありがとうございます。
デバイスコンテキストは一応数は何個でもということでわかりました。
グローバルにしたHDCって前のをを保存しといてSelectする必要があるのでしょうか?

編集 削除
てつや  2005-01-20 23:41:48  No: 56076  IP: [192.*.*.*]

>WM_CREATE:
>  ...
>  hOldBmp = SelectObject();
>  break;
>WM_CLOSE:
>  ...
>  SelectObject(hDC, hOldBmp);
>  DeleteDC(hDC);
>
>つけわすれました。これってやったほうがいいのでしょうか?
当然やっておきましょう。

>グローバルにしたHDCって前のをを保存しといてSelectする必要があるのでしょうか?
OSが一応面倒見てくれますから一応大丈夫だったりするんですが、mallocしてる
のにfreeしないで終了するのと同じ扱いになります。
そんなコード書く人って信用されないですよね。後始末は大事です。

デバイスコンテキストはCreateXXした時にデフォルトのHBITMAPも同時に作成され、
それがSelectされた状態になっています。
そのまんまDeleteDCすれば、SelectされているHBITMAPも同時に破棄されます。

もしも自分の作ったHBITMAPに差し替えた場合は、

A. 元のHBITMAPをどこかに保存しておいて破棄する時は再度Selectされた状態に
戻してからDeleteDCする。
そして自分の作ったHBITMAPをDeleteObjectする。
(上記の方法)

B. どうせ元のHBITMAP使わないから、差し替えた時に即座にDeleteObjectしてしまう。
Selectされている自分の作ったHBITMAPは、DeleteDCする時に同時に破棄される
から後始末不要。(つまりDeleteObject不要)

のどちらかにします。

A.の方がいわゆるお行儀の良い書き方です。
B.の方が一見楽に見えますが、HBITMAPが複数あり、HDCに状況に応じてSelect
させた場合、最終的にどのHBITMAPが選択されているのかを確認する必要があり、
面倒になる場合があります。

編集 削除
origi  2005-01-21 22:23:16  No: 56077  IP: [192.*.*.*]

てつやさん、ありがとうございます。
自分は始末書とかまだ縁が無い歳ですが、わかりやすい方法にしてみます。

編集 削除
瀬戸っぷ  2005-01-21 23:22:38  No: 56078  IP: [192.*.*.*]

「始末書」ではなく「後始末」です。
自分で借りたものは自分で返しましょうというコトです。

編集 削除