В моей программе у меня есть требование, чтобы "воспроизвести" или "проанализировать" метафайлы окон (WMF и EMF). Я вырыл через MSDN и Google, и самой близкой, я приехал, является Графика. Метод EnumerateMetafile. Я могу добраться, это для работы, в том моем обратном вызове EnumerateMetafileProc называют, и я могу затем назвать PlayRecord. То, что отсутствует, то, как вытащить полезные данные из того обратного вызова.
Пример я смотрел на: http://msdn.microsoft.com/en-us/library/ms142060.aspx
Обратный вызов имеет recordType параметр, который является ПЕРЕЧИСЛЕНИЕМ. Хорошо это выглядит полезным, кроме их, кажется, не способ бросить данные в любой полезный тип.
Моя цель состоит в том, чтобы воспроизвести создание WMF/EMF, так, чтобы я мог сделать вызовы функции к специализированному графическому классу, который имеет методы как (DrawLine, DrawPoint, DrawArc). В некотором смысле я воссоздаю WMF/EMF, тянущий в совершенно другом формате (Преобразование).
Любая справка в этом чрезвычайно ценна.
Graphics.EnumerateMetafile, к сожалению, очень, очень тонкий слой вокруг Win32 API. Для каждой записи в EMF вы получаете неуправляемый адрес памяти для конкретной структуры записи. Никакой документации о том, что она может содержать - но в Win32 мире тоже не так уж и много.
Так что вам нужно проконсультироваться с древними текстами!
Эта книга пришла с CD-ROM-примером кода , который включает примеры программ для использования API воспроизведения EMF.
Это оставляет вам две проблемы.
Очевидно, что книга вышла из печати, так что убедитесь, что любая купленная вами бывшая в употреблении копия включает в себя рабочий CD-ROM.
Пример кода на Си/Си++ и будет нетривиальной задачей объявить необходимую интероперацию для 100 или около того структур, которые используются для описания всех записей EMF.
Таким образом, другим подходом может быть объявление огромного интерфейса в .NET, который имеет метод для каждого GDI вызова, который вам нужен для перехвата, а затем использование C++/CLI для адаптации примера C++ кода так, чтобы он вызывал ваш огромный интерфейс для каждой записи.
Обновление
Хотя документация MSDN по воспроизведению EMF не содержит подробностей о конкретных записях EMF, Microsoft отдельно опубликовала полную спецификацию по состоянию на 2006:
MS-EMF: Enhanced Metafile Format
Также автор книги, на которую я ссылаюсь выше, предоставил исходный код примеров CDROM для скачивания: