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