2017-08-24 5 views
0

Windows 10 1703/Creatorsのアップデートで問題が発生した古いMFCアプリケーションにジャンプしました。それはXPのWindows 10/1607に正常に動作します。 調査の結果、Windows 10/1703では、クリップボードのメタファイル(wmfとemf)をCRichTextViewに貼り付けて保存できないようです。グラフィックスデータはrtfファイルに埋め込まれていません。ここ は剥ぎ取ら例です。Windows 10のクリエイターアップデートで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"); 
} 

この例では、拡張メタファイルMIT「ABC」とCRichTextViewにラインを貼り付けし、Windows XPから

  • 「abc.rtf」として文書を保存しますWindowsの1607分の10にこれは、それはおそらく関連しているファイルが小さくなり、データが

が保存されません更新、最新のクリエイターと

  • 正常に動作します〜RichEditBox: picture and content after the picture disappear (Windows 10 1703 Creators Update)

    アイデア?クリップボードなしでドキュメントのメタファイルを取得する方法はありますか? ビットマップはまだ動作します。

  • +0

    これはコンパイラの問題ではありません。 Windows 7と10/1703で同じexeファイルを実行すると、異なる結果が得られます。 – Andreas

    +0

    使用しているVSのバージョンは? 'CRichEditView'によってどのバージョンのリッチエディットコントロールが使用されていますか? – zett42

    +0

    _aの方法は、クリップボードなしでドキュメント内のメタファイルのグラフィックを取得するには[この回答](https://stackoverflow.com/a/1490785/7571258)を読んでください。それはC#ですが、必要なRTFタグを示しています。 – zett42

    答えて

    0

    クリエイターが更新した後、私たちのソフトウェアで同じ問題が発生しました。私たちはまた、クリップボードを介して私たちのグラフィックを取得します。 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(); 
    

    私たちは、ドキュメントにグラフィックスを挿入するために、今、これを使用しています。私はスタンドアロンのドキュメントとして試していません。

    関連する問題