Обновление создателей Windows 10 питается графикой метафайлов в MFC RichTextEdit
Я запрыгнул в старое приложение MFC, которое имеет проблемы при запуске под Windows 10 1703/Creators update. Он отлично работает для XP на Windows 10/1607. После некоторого исследования кажется, что в Windows 10/1703 приложение не может вставить метафайлы (wmf и emf) из буфера обмена в CRichTextView и сохранить его. Графические данные не включаются в файл RTF. Вот урезанный пример:
static void testFn(CRichEditView* View)
{
// Minimal Example
// Init MetaFileDC
CMetaFileDC MetaFileDC;
CClientDC DC(NULL);
MetaFileDC.CreateEnhanced(NULL, NULL, NULL, NULL);
CRect Recht(0, 0, 400, 300);
MetaFileDC.SetAttribDC(DC.m_hDC);
MetaFileDC.SetWindowOrg(0, 0);
MetaFileDC.SetWindowExt(Recht.Size());
// draw : "ABC" and a line
MetaFileDC.TextOutA(0, 0, "ABC");
MetaFileDC.MoveTo(0, 0);
MetaFileDC.LineTo(Recht.right, Recht.bottom);
// to clipboard
View->OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_ENHMETAFILE, MetaFileDC.CloseEnhanced());
CloseClipboard();
// paste from clipboard
View->GetRichEditCtrl().Paste();
// save rtf file
View->GetDocument()->OnSaveDocument("abc.rtf");
}
В этом примере вставляется расширенный метафайл с "ABC" и строкой в CRichTextView и сохраняется документ как "abc.rtf".
- С Windows XP на Windows 10/1607 это работает нормально
- с последним обновлением Creators файл меньше и данные не сохраняются
Вероятно, это связано с RichEditBox: изображение и контент после исчезновения изображения (Windows 10 1703 Creators Update)
Есть идеи? Есть ли способ получить графику метафайла в документе без буфера обмена? Растровые изображения все еще работают.
1 ответ
У нас была такая же проблема в нашем программном обеспечении после обновления создателей. Мы также получаем нашу графику через буфер обмена. После некоторого исследования Google и SO я придумал это:
HENHMETAFILE hMetafile = nullptr;
if(OpenClipboard(AfxGetMainWnd()->m_hWnd))
{
if(EnumClipboardFormats(0) == CF_ENHMETAFILE)
hMetafile = (HENHMETAFILE) GetClipboardData(CF_ENHMETAFILE);
CloseClipboard();
}
Gdiplus::MetafileHeader header;
Gdiplus::Metafile::GetMetafileHeader(hMetafile,&header);
HDC hdc = AfxGetMainWnd()->GetDC()->GetSafeHdc();
UINT bufsize = GetWinMetaFileBits(hMetafile,0,0,MM_ANISOTROPIC,hdc);
BYTE* buffer = new BYTE[bufsize];
GetWinMetaFileBits(hMetafile,bufsize,buffer,MM_ANISOTROPIC,hdc);
std::stringstream ss;
ss << "{\\rtf1{\\pict\\wmetafile8";
ss << "\\picw" << (UINT)((header.Width / header.DpiX) * 2540) << "\\pich" << (UINT)((header.Height / header.DpiY) * 2540);
ss << "\\picwgoal" << (UINT)((header.Width / header.DpiX) * 1440) << "\\pichgoal" << (UINT)((header.Height / header.DpiY) * 1440);
ss << " " << std::endl;
ss << std::hex << std::setfill('0');
for(UINT i = 0;i < bufsize;++i)
ss << std::setw(2) << static_cast<UINT>(buffer[i]);
delete[] buffer;
ss << "}}" << std::endl;
return ss.str().c_str();
Мы используем это сейчас, чтобы вставить графику в наш документ. Я не пробовал это как отдельный документ.