2017-08-24 39 views
0

J'ai sauté dans une ancienne application MFC qui a un problème lorsqu'il est exécuté sous Windows 10 1703/Creators mise à jour. Cela fonctionne bien pour XP à Windows 10/1607. Après quelques recherches, il semble que dans Windows 10/1703 l'application ne peut pas coller les métafichiers (wmf et emf) du presse-papiers dans un CRichTextView et l'enregistrer. Les données graphiques ne sont pas incorporées dans le fichier rtf. Voici un exemple dépouillé:Mise à jour de Windows 10 Creators mange des graphiques métafichiers dans MFC RichTextEdit

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"); 
} 

Cet exemple pâtes un métafichier mit « ABC » et une ligne dans la CRichTextView et enregistre le document comme « abc.rtf »

  • de Windows XP Windows 10/1607 cela fonctionne très bien
  • avec les derniers créateurs de mettre à jour le fichier est plus petit et les données ne sont pas enregistrées

Il est probablement lié à RichEditBox: picture and content after the picture disappear (Windows 10 1703 Creators Update)

Des idées? Est-il possible d'obtenir les graphiques de métafichier dans le document sans le presse-papiers? Les bitmaps fonctionnent toujours.

+0

Ce n'est pas un problème de compilateur. Exécutez le même fichier exe sur Windows 7 et 10/1703 et vous obtenez des résultats différents. – Andreas

+0

Quelle version de VS utilisez-vous? Quelle version du contrôle richedit est utilisée par 'CRichEditView'? – zett42

+0

Pour _un moyen d'obtenir les graphiques de métafichier dans le document sans le clipboard_ lire [cette réponse] (https://stackoverflow.com/a/1490785/7571258). C'est C# mais il montre les tags RTF nécessaires. – zett42

Répondre

0

Nous avons eu le même problème dans notre logiciel après la mise à jour des créateurs. Nous obtenons également notre graphique via le presse-papiers. Après quelques recherches sur Google et je suis venu avec ceci:

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(); 

Nous allons l'utiliser pour insérer des graphiques dans notre document. Je ne l'ai pas essayé comme document autonome.