Просмотр PNG-изображения 1 пиксельная строка снизу и правый столбец отсутствуют - PullRequest
0 голосов
/ 30 января 2020

Использование кода ниже (вызывается из CLoadPngDlg::OnPaint()) для просмотра файла PNG (800X50 пикселей), который уже включен в файл ресурсов ( IDB_FULLSCRINFOBAR_OPAQ_TEST ), но, как вы можете видеть на прикрепленном изображении нижняя и правая линии изображения отсутствуют. Я могу подтвердить, что nWidth=800 и nHeight=50

BOOL CLoadPngDlg::ShowPngAt(CDC *dcWnd) {   

    CGdiPlusBitmapResource      *pPngChannel;
    UINT                        nWidth,nHeight;
    CRect                       rectClient;
    CBitmap                     Bitmap, *pOldBitmap;    
    CDC                         bitmapDC;
    CDC                         *dialogDC;

    pPngChannel = NULL;
    pPngChannel = new CGdiPlusBitmapResource;

    if (!pPngChannel->Load(IDB_FULLSCRINFOBAR_OPAQ_TEST, _T("PNG"))) {
        delete pPngChannel;
        return TRUE;
    }

    GetWindowRect(&rectClient);

    // Get size of bitmap.
    nWidth = pPngChannel->m_pBitmap->GetWidth();
    nHeight = pPngChannel->m_pBitmap->GetHeight();

    bitmapDC.CreateCompatibleDC( dcWnd ); 
    Bitmap.CreateCompatibleBitmap(dcWnd, nWidth, nHeight);
    pOldBitmap = bitmapDC.SelectObject(&Bitmap);    

    Gdiplus::Graphics graphics(bitmapDC.GetSafeHdc());                                      
    graphics.DrawImage(*pPngChannel, 0, 0);

    dcWnd->BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &bitmapDC,   0,  0,   SRCCOPY );

    bitmapDC.SelectObject( pOldBitmap );
    bitmapDC.DeleteDC();


    if (pPngChannel != NULL)
        delete pPngChannel;


    return FALSE;

}

enter image description here

Все просто с прямой копией изображения png внутри клиента область диалога. Итак, в чем здесь проблема?

Редактировать: [решено] Мне нужно было указать размер изображения внутри DrawImage следующим образом. `graphics.DrawImage (* pPngChannel, 0, 0, nWidth, nHeight);

1 Ответ

0 голосов
/ 01 февраля 2020

Я должен был указать размер изображения внутри DrawImage , как это.

graphics.DrawImage(*pPngChannel, 0, 0, nWidth , nHeight);

Я также тестировал эту программу, используя различные настройки DPI. Кажется, что упомянутая проблема отсечения возникает во всех настройках низкого, среднего и высокого DPI. Таким образом, он не зависит от настроек масштабирования в Windows 10.

...