mf c: dr aws изображение в метафайле. перезагрузите метафайл, картинка исчезнет - PullRequest
0 голосов
/ 27 мая 2020

Я не говорю по-английски sh очень хорошо. надеюсь, вы понимаете.

Прочтите файл .emf и нарисуйте текст и изображения.

При необходимости нажмите кнопку и нарисуйте больше текста.

Но когда я нажимаю кнопку, изображение исчезает.

В результате тестирования рисунок исчезает из аргумента drawimage из -1943.

void CTest1Dlg::MakeMetaFile()
{
    int numMeta = 0 ;
    CMetaFileDC *metaDC;
    metaDC = new CMetaFileDC[ 2 ];

    metaFile = new HENHMETAFILE[ 2 ] ;
    m_metaFileDrawArr = new HENHMETAFILE[10] ;

    CFont font, fontLog;
    font.CreateFont(46*CONSTANT, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, _T("맑은 고딕"));
    fontLog.CreateFont(30*CONSTANT, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, _T("맑은 고딕"));

    //CONSTANT              2
    //PAGE_WIDTH            2100*CONSTANT
    //PAGE_HEIGHT           2970*CONSTANT
    metaDC[ numMeta ].CreateEnhanced(NULL, NULL, CRect(0, 0, PAGE_WIDTH*10, PAGE_HEIGHT*10), _T(""));
    metaDC[ numMeta ].SetMapMode(MM_LOMETRIC);
    metaDC[ numMeta ].SelectObject(&font);
    metaDC[ numMeta ].SetBkMode(TRANSPARENT);
    metaFile[ numMeta ] = ::GetEnhMetaFile( "C:\\a\\REPORT.emf" );
    metaDC[ numMeta ].PlayMetaFile(metaFile[ numMeta ], CRect(0, 0, PAGE_WIDTH, -PAGE_HEIGHT));
    DeleteEnhMetaFile(metaFile[ numMeta ]);

    metaDC[ numMeta ].TextOut(GET_W_POS(VIEWER_W_POS_C1), GET_H_POS(VIEWER_H_POS_C1), "abc");

    // draw image
    CRect rectTRG;
    LPWSTR lpszW = new WCHAR[255];
    CString s1,s2,s3;
    s1 = "C:\\a\\1.jpeg";
    s2 = "C:\\a\\2.jpeg";
    s3 = "C:\\a\\3.jpeg";

    LPTSTR lpStr = s1.GetBuffer( s1.GetLength() );
    int nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);
    MultiByteToWideChar(CP_ACP, 0,lpStr, -1, lpszW, nLen);  

    Graphics *graphics;
    graphics = Graphics::FromHDC(metaDC[ numMeta ].m_hDC);

    Image image(lpszW);

    //CONSTANT              2
    //PAGE_WIDTH            2100*CONSTANT
    //PAGE_HEIGHT           2970*CONSTANT
    //PICTURE_HEIGHT        (768 * 0.65 * CONSTANT)
    //PICTURE_WIDTH     (1024 * 0.65 * CONSTANT)

    rectTRG.left    = (LONG)(PAGE_WIDTH/2-PICTURE_WIDTH);
    rectTRG.right   = (LONG)(PAGE_WIDTH/2+PICTURE_WIDTH);
    rectTRG.top     = (LONG)(-(PAGE_HEIGHT/2.5));
    rectTRG.bottom  = (LONG)(-((PAGE_HEIGHT/1.5)+(PICTURE_HEIGHT*2)));

    UINT width = image.GetWidth();
    UINT height = image.GetHeight();
    //  graphics->DrawImage(&image, GDI_RECTF(rectTRG), 0, 0, width, height, UnitPixel);

0 до -1942 в порядке. -1943 ниже изображение исчезает.

    graphics->DrawImage(&image, Rect(600,-1943,2869,-4000), 0, 0, width, height, UnitPixel);


    // 2nd image
    lpStr = s2.GetBuffer( s2.GetLength() );
    nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);
    MultiByteToWideChar(CP_ACP, 0,lpStr, -1, lpszW, nLen);
    Image image2(lpszW);

    rectTRG.left    = (LONG)(PAGE_WIDTH/2-PICTURE_WIDTH);
    rectTRG.right   = (LONG)(PAGE_WIDTH/2+PICTURE_WIDTH);
    rectTRG.top     = (LONG)(-(PAGE_HEIGHT/3.1));
    rectTRG.bottom  = (LONG)(-((PAGE_HEIGHT/1.75)+(PICTURE_HEIGHT*2)));
    graphics->DrawImage(&image2, GDI_RECTF(rectTRG), 0, 0, width, height, UnitPixel);
    graphics->DrawImage(&image2, Rect(600,-1943,2869,-2000), 0, 0, width, height, UnitPixel);

    m_metaFileDrawArr[ numMeta ] = metaDC[ numMeta ].CloseEnhanced();

нажата кнопка

    //road metafile
    metaDC[ numMeta ].CreateEnhanced(NULL, NULL, CRect(0, 0, PAGE_WIDTH*10, PAGE_HEIGHT*10), _T(""));
    metaDC[ numMeta ].SetMapMode(MM_LOMETRIC);
    metaDC[ numMeta ].SelectObject(&font);
    metaDC[ numMeta ].SetBkMode(TRANSPARENT);
    metaDC[ numMeta ].PlayMetaFile(m_metaFileDrawArr[ numMeta ], CRect(0, 0, PAGE_WIDTH, -PAGE_HEIGHT));
    metaDC[ numMeta ].TextOut(GET_W_POS(VIEWER_W_POS_C5), GET_H_POS(VIEWER_H_POS_C2), "def");

    m_metaFileDrawArr[ numMeta ] = metaDC[ numMeta ].CloseEnhanced();

    // draw to picture control.
    CRect rect ;
    CDC *dc = GetDlgItem(IDC_STATIC) -> GetDC();
    GetDlgItem(IDC_STATIC) -> GetClientRect(&rect) ;
    dc -> PlayMetaFile(m_metaFileDrawArr[ numMeta ], &rect) ;

    delete lpszW;
    delete graphics;
}
...