疑問に思っていることがあるのでお願いします。
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();
とするべきでしょうか?お願いします。
上の追加で、
WM_CREATE:
...
hOldBmp = SelectObject();
break;
WM_CLOSE:
...
SelectObject(hDC, hOldBmp);
DeleteDC(hDC);
つけわすれました。これってやったほうがいいのでしょうか?
昔の OS では個数制限があったような気がしますが、ソースが見つかりません。
最近の OS では、
> デバイスコンテキストの数は、利用可能なメモリの量によってのみ制限されます。
だそうです(ReleaseDC の説明から抜粋)。
シャノンさんありがとうございます。
デバイスコンテキストは一応数は何個でもということでわかりました。
グローバルにしたHDCって前のをを保存しといてSelectする必要があるのでしょうか?
>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が選択されているのかを確認する必要があり、
面倒になる場合があります。
てつやさん、ありがとうございます。
自分は始末書とかまだ縁が無い歳ですが、わかりやすい方法にしてみます。
「始末書」ではなく「後始末」です。
自分で借りたものは自分で返しましょうというコトです。