2008-09-11 12 views
4

MSDNはCreatePatternBrushのために次の項目が表示されますWin32のCreatePatternBrush

あなたは がDeleteObjectの機能を使用して ことにより、関連するビットマップに影響を与えることなく、パターンブラシを削除することができます。 したがって、この ビットマップを使用して、任意の数のパターン ブラシを作成できます。

私の質問は反対です。 HBRUSHの寿命が長い場合は、ブラシを作成した直後にHBITMAPを削除できますか? IE:HBRUSHはHBITMAPの独自のコピーを保存していますか?

この場合、HBRUSHにオブジェクトスコープを持たせ、HBITMAPにはメソッドスコープ(HBRUSHを作成するメソッド)を持たせたいと思います。

答えて

5

HBRUSHとHBITMAPは完全に独立しています。ハンドルは完全に独立して削除することができます。作成されたオブジェクトは、いずれのオブジェクトも変更されません。

1

私は、ビットマップがブラシより長くなければならないと考えています。ブラシはそれをコピーするのではなく、既存のビットマップを参照するだけです。

あなたはいつでもそれを試して、何が起こったか見ることができます。

1

私は疑うことCreatePatternBrush()APIをコピーHBITMAPがあるので、あなたは、それを与えるビットマップ:制限されている最大数の

  1. GDIハンドル、および
  2. 潜在的に非常に大きいです。
Win32とGDIが自分のAPIのほとんどが作成されたという理由だけであれば、あなたのデータの内部コピーの作成について保守的になりがち(CreatePatternBrushは()のWindows 95にさかのぼり、そして多くの機能はまだ古い)

、メモリとGDIハンドルは現在よりもはるかに限られた供給量であった。 (例えば、Windows 95は、4MBのRAMしか搭載していないシステムでも正常に動作する必要があります)。

4

ブラシには独自のビットマップのコピーがあります。

GetObjectを使用してLOGBRUSH構造体を塗りつぶすと、元のBITMAPハンドルがメンバlbhatchに返されますが、コピーのハンドルは返されません。これは、ブラシの作成後にビットマップを削除し、残念ながら。また、ビットマップが削除されると、返されたビットマップハンドルでGetObjectを使用すると失敗します。

この場合、ブラシから元のビットマップディメンションを取得する方法はありますか?元のビットマップが削除されても、パターンブラシのコピーを作成したいと思います。私はブラシを塗って元のビットマップのコピーを得ることができますが、サイズはわかりません。 SetbrushorgEx(hdc、-1、-1)を使ってみました。ブラシがデバイスコンテキストに選択され、GetBrushOrgExで取得したときに値が取得されると、-1が小さくなることを期待しました。動作しません。