質問
MSDN では、CreatePatternBrush について次のように表示されます。
DeleteObject関数を使用して、関連するビットマップに影響を与えることなくパターンブラシを削除できます。したがって、このビットマップを使用して、任意の数のパターンブラシを作成できます。
私の質問はその逆です。HBRUSH の有効期間が長い場合、ブラシを作成した直後に HBITMAP を削除できますか?IE:HBRUSH は HBITMAP の独自のコピーを保存しますか?
この場合、HBRUSH にはオブジェクト スコープがあり、HBITMAP にはメソッド スコープ (HBRUSH を作成するメソッド) があるとします。
解決
HBRUSH と HBITMAP は完全に独立しています。ハンドルは互いに完全に独立して削除でき、一度作成すると、どちらかのオブジェクトを変更しても、もう一方のオブジェクトには影響しません。
他のヒント
ブラシにはビットマップの独自のコピーがあります。これは、ブラシを作成した後にビットマップを削除してからブラシを使用すると簡単に確認できます (正常に動作します)。
ただし、GetObject を使用して LOGBRUSH 構造体を埋めると、残念ながら、コピーのハンドルではなく、メンバー lbhatch 内の元の BITMAP ハンドルが返されます。また、ビットマップが削除されている場合、返されたビットマップ ハンドルで GetObject を使用すると失敗します。
この場合、ブラシから元のビットマップの寸法を取得する方法を知っている人はいますか?元のビットマップは削除しても、パターン ブラシのコピーを作成したいと考えています。ブラシでペイントするだけで元のビットマップのコピーを取得できますが、そのサイズがわかりません。SetbrushorgEx (hdc, -1,-1) を使用してみました。ブラシがデバイス コンテキストに選択されたときに -1 がその寸法を法的に縮小し、GetBrushOrgEx で取得したときに値が取得されることを期待しました。機能しません。
ビットマップはブラシよりも長く存続する必要があると思います。ブラシは既存のビットマップをコピーするのではなく、参照するだけです。
いつでも試してみて、何が起こるかを確認することができます。
HBITMAP は次のとおりであるため、CreatePatternBrush() API が指定したビットマップをコピーするとは思えません。
- 最大数が制限されている GDI ハンドル、および
- 潜在的にかなり大きい。
Win32 と GDI は、データの内部コピーの作成について保守的な傾向があります。ただし、それらの API のほとんどが作成されたとき (CreatePatternBrush() は Windows 95 まで遡り、多くの関数はまだ古いです)、メモリと GDI ハンドルははるかに多くの場所にあったからです。現在よりも供給が限られています。(たとえば、Windows 95 は 4MB の RAM しか搭載していないシステムでも正常に動作する必要がありました。)