0

C++とGDI+でメタファイルを描画したいのですが、ブラシとペンがプログラムで作成したものに置き換えられるように変更します。メタファイル自体で指定されている他のブラシの代わりに、このブラシとこのペンを使用したいと思います。

どうすればこれを達成できますか?

EnumerateMetafileとPlayRecordを使おうとしましたが、使用しているペンとブラシを制御する方法がわかりません。以下のコードを試して、基になるHDCの現在のペンとブラシを選択しましたが、予想どおりに機能しません...

何か提案はありますか?(すべてのEMFレコードタイプの完全な処理を書き直さないようにしたい)

前もって感謝します。

暫定コード(期待どおりに何もしません):

// callback function called by EnumerateMetafile:
BOOL CALLBACK metaCallback(
   EmfPlusRecordType recordType, 
   unsigned int flags, unsigned int dataSize, const unsigned char* pStr, void* metafile)
{ 
   HDC hdc = myGraphics->GetHDC ();
   SelectObject(hdc, GetStockObject(WHITE_PEN));
   myGraphics->ReleaseHDC(hdc);

   static_cast <Metafile*>(metafile)->PlayRecord(recordType, flags, dataSize, pStr);
   return TRUE; 
}
4

1 に答える 1

0

これはEMFですか、それともEMF +ですか?通常のEMF(またはWMF)の場合は、GDI+の代わりにEnum[Enh] MetaFileを使用することをお勧めします。これは、この種のものに適したインターフェイスを備えているためです。SelectObjectの独自の処理を実装する必要があります。選択したハンドルがブラシまたはペン(GetObjectTypeで決定)の場合は、そのレコードをスキップします。次に、メタファイルを列挙する前に必要なペン/ブラシを選択すると、そのペン/ブラシはずっとそこにとどまるはずです。

EMF +の場合は、タイプEmfPlusRecordTypeObjectのレコードを探し、ブラシまたはペンオブジェクトの場合は、代わりに必要なブラシまたはペンをロードするレコードを再生することをお勧めします。一部のレコードタイプは、個別のオブジェクトレコードを使用する代わりに単色のブラシを埋め込むため、これは完全な解決策ではありませんが、それは始まりです。

EMF +を処理するには、形式についてある程度理解している必要があります(http://msdn.microsoft.com/en-us/library/cc230724.aspx)。残念ながら、Microsoftは、レコードの構造を提供せず、GDI +または非EMF+レコードの再生に使用するHDCからハンドル/オブジェクトテーブルへのアクセスを提供しないことにより、これを困難にしました。

于 2013-02-06T04:53:09.297 に答える