以前写的代码,最近发现自己在同一个界面显示多个图片的时候出现了问题,才回来重新看着个函数,其实原来自己根本不理解SetDIBitsToDevice的含义
这个函数里面xdest ydest决定显示的位置
dwwidth dwheigth xsrc ysrc决定图片显示的区域
原来自己的错误就是没理解xdest ydest dwwidth dwheigth的关系,才出错
/**********************************************
如果要显示图片的一块,lpDCRect和lpDIBRect的快高相等
计算方法
LONG DCWIDTH = lpDCRect->right - lpDCRect->left;
LONG DCHEIGTH = lpDCRect->bottom;
LONG DIBWIDTH = lpDIBRect->right - lpDIBRect->left;
LONG DIBHEIGTH = lpDIBRect->bottom - lpDIBRect->top;
xsrc ysrc决定开始的位置
//**********************************************
/*
hDC: 设备句柄
lpDCRect: left 和 top决定显示区域的起始点,bottom 和 right 决定显示的方式,如果
与lpDIBRect的宽高相等,那么使用SetDIBitsToDevice否则使用StretchDIBits
lpDIBRect:图片的显示区域,决定图片的显示区域
pbmpinfo: 图片的信息头
pbmpdata: 图片数据
*/
//************************************************
BOOL PrintDIB(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,BITMAPINFO *pbmpinfo,BYTE *pbmpdata)
{
BOOL bSuccess=TRUE;
if (lpDCRect->bottom == 0 || lpDCRect->right == 0)
{
return FALSE;
}
if (lpDIBRect->bottom == 0 || lpDIBRect->right == 0)
{
return FALSE;
}
LONG DCWIDTH = lpDCRect->right - lpDCRect->left;
LONG DCHEIGTH = lpDCRect->bottom;
LONG DIBWIDTH = lpDIBRect->right - lpDIBRect->left;
LONG DIBHEIGTH = lpDIBRect->bottom - lpDIBRect->top;
//如果不是24位色彩
HPALETTE temp_pPal;
HPALETTE HPal;
if (GetNumColors(pbmpinfo))
{
CPalette* pPal;
pPal=CreateBmpPalatte(pbmpinfo);
HPal=(HPALETTE)(pPal->m_hObject);
temp_pPal = ::SelectPalette(hDC,HPal,TRUE);
::RealizePalette(hDC);
}
// 设置显示模式
::SetStretchBltMode(hDC, COLORONCOLOR);
/* Determine whether to call StretchDIBits() or SetDIBitsToDevice() */
if (DCWIDTH == DIBWIDTH && DCHEIGTH == DIBHEIGTH)
{
bSuccess = ::SetDIBitsToDevice(
hDC, // hDC
lpDCRect->left, // DestX
lpDCRect->top, // DestY
DIBWIDTH, // nDestWidth
DIBHEIGTH, // nDestHeight
lpDIBRect->left, // SrcX
lpDIBRect->top, // Srcy
0, // nStartScan
lpDIBRect->bottom,
pbmpdata, // lpBits
pbmpinfo, // lpBitsInfo
DIB_RGB_COLORS // wUsage
);
}
// CRect DCRect1=CRect(0,0,320,256);
// CRect DCRect2=CRect(400,0,720,256);
// CRect DCRect3=CRect(0,300,320,256);
// CRect DCRect4=CRect(400,300,720,256);
else
{
bSuccess = ::StretchDIBits(
hDC, // hDC
lpDCRect->left, // DestX
lpDCRect->top, // DestY
DCWIDTH, // nDestWidth
DCHEIGTH, // nDestHeight
lpDIBRect->left, // SrcX
lpDIBRect->top, // SrcY
DIBWIDTH,
DIBHEIGTH,
pbmpdata, // lpBits
pbmpinfo, // lpBitsInfo
DIB_RGB_COLORS, // wUsage
SRCCOPY
);
}
::SelectPalette(hDC,temp_pPal,TRUE);
//delete temp_pPal;
return bSuccess;
}
/**********************************
文章评论(0条评论)
登录后参与讨论