Итак, дошла очередь и до WMF. Что эа такое WMF файлы ? Работая с графикой рано или позно у Вас возникнет задача в передаче информации от одной программы к другой. Существует большое количество стандартов, например, DXF. Для его использования необходимо тщательно изучить стандарт и реализовать его поддержку. Существуют и другие стандарты. Но изучение стандартов это дела долгое. Что делать еcли надо, чтобы ваша программа могла быстро и с наименьшими трудностями для Вас сохранить данные. Для этого нужно воспользоваться стандартом Windows - WMF. На Ваш вопрос о том, чем он отличается от DXF, например, я могу сказать, что стандарта WMF практически нет :-)). То есть так же как вы рисуете с помощью GDI теми же командами и пишите в WMF файл. Информация в файле будет векторная. WMF - это список структур, которые содержат информацию о вызове GDI функций. Ладно на примере думаю будет понятно :-)
Создаем приложение как MFC AppWizard с именем WmfTest, как SDI и нажимаем Finish. Теперь создадим функцию рисования в OnDraw.
///////////////////////////////////////////////////// // CWmfTestView drawing void CWmfTestView::OnDraw(CDC* pDC) { CWmfTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPen pen(PS_SOLID,4,RGB(255,0,0)); pDC->SelectObject(pen); pDC->Ellipse(CRect(10,10,100,100)); pDC->Rectangle(CRect(150,150,300,300)); }Запустим программу и посмотрим.
Для записи в WMF файл создадим функцию реакции на нажатие левой кнопки мыши в окне. То есть нажали кнопку мыши информация в WMF файл записалась.
/////////////////////////////////////////////////////// // CWmfTestView message handlers void CWmfTestView::OnLButtonDown(UINT nFlags, CPoint point) { HDC MetaDC; MetaDC=CreateMetaFile("test.wmf"); if (MetaDC!=NULL) { CPen pen(PS_SOLID,4,RGB(255,0,0)); SelectObject(MetaDC,pen); Ellipse(MetaDC,10,10,100,100); Rectangle(MetaDC,150,150,300,300); } CloseMetaFile(MetaDC); CView::OnLButtonDown(nFlags, point); }
Смотрите, создаем контекст метафайла HDC MetaDC, после этого сам метафайл CreateMetaFile("test.wmf") и теперь мы используя контекст метафайла и функции GDI из API !!! спокойно в этот контекст пишем. В конце закрываем метафайл. Готов !.
А теперь проверяем. Запустите приложение. Щелкните левой кнопкой. И экспортируйте файл test.wmf в Corel Draw 8.0. Рисунок будет маленький. Увеличьте его. Разгруппируйте Ungroup. Щелкните в стороне. Теперь это два векторных объекта. На рисунке ниже я специально переместил один узел, чтобы это показать.