4

MSDN では、CreatePatternBrush について次のように表示されます。

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

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

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

4

4 に答える 4

5

HBRUSH と HBITMAP は完全に独立しています。ハンドルは互いに完全に独立して削除できます。一度作成すると、どちらのオブジェクトへの変更も他方に影響しません。

于 2008-10-17T14:27:04.970 に答える
4

ブラシには、ビットマップの独自のコピーがあります。これは、ブラシを作成した後にビットマップを削除し、ブラシを使用することで簡単に確認できます(正常に機能します)

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

この場合、ブラシから元のビットマップの寸法を取得する方法を知っている人はいますか?元のビットマップが削除されていても、パターンブラシのコピーを作成したいのですが。ブラシでペイントするだけで元のビットマップのコピーを取得できますが、サイズがわかりません。SetbrushorgEx(hdc、-1、-1)を使用してみましたが、デバイスコンテキストでブラシを選択したときに-1がその寸法を法として減少し、GetBrushOrgExで取得したときに値を取得することを期待していました。動作しません。

于 2009-06-17T12:58:30.097 に答える
1

HBITMAPは次のとおりであるため、CreatePatternBrush()APIが指定されたビットマップをコピーすることは疑わしいです。

  1. 最大数が制限されているGDIハンドル、および
  2. 潜在的にかなり大きい。

Win32とGDIは、ほとんどのAPIが作成されたとき(CreatePatternBrush()はWindows 95に準拠し、多くの関数はまだ古い)、メモリとGDIハンドルがはるかに多く存在していたため、データの内部コピーの作成について保守的になる傾向があります。現在よりも供給が限られています。(たとえば、Windows 95は、RAMが4MBしかないシステムで正常に動作する必要がありました。)

于 2008-09-16T13:03:57.920 に答える
1

ビットマップはブラシよりも長く存続する必要があると思います。ブラシは既存のビットマップをコピーするのではなく、参照するだけです。

いつでも試してみて、何が起こったのかを確認できます。

于 2008-09-11T07:25:34.563 に答える