Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查看PNG图像缺少从底部到右侧的1像素行_C++_Visual C++_Mfc_Gdi+ - Fatal编程技术网

C++ 查看PNG图像缺少从底部到右侧的1像素行

C++ 查看PNG图像缺少从底部到右侧的1像素行,c++,visual-c++,mfc,gdi+,C++,Visual C++,Mfc,Gdi+,使用下面的代码(从CLoadPngDlg::OnPaint())查看已包含在资源(IDB_FullScrInfo bar_OPAQ_TEST)文件中的PNG文件(800X50像素),但正如您在所附图像中看到的,图像的底部和右侧行缺少一个。我可以确认nWidth=800和nHeight=50 BOOL CLoadPngDlg::ShowPngAt(CDC *dcWnd) { CGdiPlusBitmapResource *pPngChannel; UINT

使用下面的代码(从
CLoadPngDlg::OnPaint()
)查看已包含在资源(IDB_FullScrInfo bar_OPAQ_TEST)文件中的PNG文件(800X50像素),但正如您在所附图像中看到的,图像的底部和右侧行缺少一个。我可以确认
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;

}

在对话框的客户区内直接复制png图像,事情就简单明了了。那么,这里的问题是什么


编辑:[已解决]我必须像这样指定DrawImage内部的图像大小`graphics.DrawImage(*pPngChannel,0,0,nWidth,nHeight)

我必须像这样指定DrawImage中的图像大小

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


我还使用不同的DPI设置测试了这个程序。似乎在所有低、中、高DPI设置中都会出现上述剪辑问题。因此,它独立于Windows 10下的缩放设置。

为什么
rectClient
是窗口rect而不是客户端rect?您对
dcWnd->BitBlt()的调用不应该使用
nWidth
nHeight
作为blit的大小吗?您的系统是否具有非100%的显示比例?您可以在图像中添加一些其他条形图,以查看它们移动了多远,或者它们是否移动。请确保阅读下的“客户端区域”和“非客户端区域”。@IInspectable我实际上还需要无边框窗口(全屏)的非客户端区域。好,问题是我还必须在DrawImage中指定PNG图像的尺寸,如下所示:graphics.DrawImage(*pPngChannel,0,0,800,50);