2013-02-03 40 views
0

在使用GDI +的C++中,我想繪製一個圖元文件,但修改它的方式是用我在程序中創建的圖形替換筆刷和筆。我希望使用這個筆和這支筆來代替元文件中指定的其他人。如何在繪圖時覆蓋圖元文件的筆和畫筆?

我怎麼能做到這一點?

我試圖使用EnumerateMetafile和PlayRecord,但我沒有看到如何獲得使用筆和畫筆的控制權。我試過下面的代碼來選擇底層HDC的當前Pen和Brush,但是因爲我期待它不起作用...

有什麼建議嗎? (我想避免重寫所有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; 
} 

回答

0

這是一個EMF或EMF +?如果它是一個普通的EMF(或WMF),我建議使用Enum [Enh] MetaFile而不是GDI +,因爲它具有更好的界面。你只需要實現你自己對SelectObject的處理。如果選擇的句柄是筆刷或筆(由GetObjectType確定),請跳過該記錄。然後,如果您在枚舉圖元文件之前選擇想要的筆/筆,它應該保持整個時間。

對於EMF +,我建議查找類型爲EmfPlusRecordTypeObject的記錄,如果它們是筆刷或筆對象,則可以播放加載相同筆刷或筆的記錄。這不是一個完整的解決方案,因爲某些記錄類型嵌入純色筆而不是使用單獨的對象記錄,但這是一個開始。

要處理EMF +,您需要對格式(http://msdn.microsoft.com/en-us/library/cc230724.aspx)有所瞭解。不幸的是,微軟通過不提供記錄結構以及不提供GDI +的句柄/對象表格或者用於播放非EMF +記錄的HDC來訪問這個難題。

+0

非常感謝,我現在只看到你的答案(不知道爲什麼我沒有得到或看到通知)。 – bfredo123