#define SHOW_NORMAL 1
#define SHOW_CENTER 2
#define SHOW_STRETCH 3
#define SHOW_ISOSTRETCH 4
int ShowDib (HDC hdc, BITMAPFILEHEADER * pbmfh, int cxClient, int cyClient, int wShow)
{
if(NULL==pbmfh)
return 0;
return ShowDib(hdc,(BITMAPINFO*)(pbmfh+1),(BYTE*)pbmfh+(pbmfh->bfOffBits),cxClient,cyClient,wShow);
}
int ShowDib (HDC hdc, BITMAPINFO * pbmi, BYTE * pBits, int cxClient, int cyClient, int wShow)
{
if(NULL==hdc || NULL==pbmi || NULL==pBits || wShow<SHOW_NORMAL || wShow>SHOW_ISOSTRETCH)
return 0;
int cxDib, cyDib ;
int BltMode, ret ;
if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib = pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
}
switch (wShow)
{
case SHOW_NORMAL:
return SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0,
0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;
case SHOW_CENTER:
return SetDIBitsToDevice (hdc, (cxClient - cxDib) / 2,(cyClient - cyDib) / 2,
cxDib, cyDib, 0, 0, 0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;
case SHOW_STRETCH:
BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
ret=StretchDIBits (hdc, 0, 0, cxClient, cyClient,
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
SetStretchBltMode (hdc, BltMode) ;
return ret;
case SHOW_ISOSTRETCH:
BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
if(cxDib*cyClient > cyDib*cxClient)//图更宽
ret=StretchDIBits (hdc,0,
(cyClient-(int)((float)cyDib/(float)cxDib*(float)cxClient))/2,
cxClient, (int)((float)cyDib/(float)cxDib*(float)cxClient) ,
0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
else
ret=StretchDIBits (hdc,
(cxClient-(int)((float)cxDib/(float)cyDib*(float)cyClient))/2, 0,
(int)((float)cxDib/(float)cyDib*(float)cyClient), cyClient,
0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
SetStretchBltMode (hdc, BltMode) ;
return ret;
}
return 0 ;
}
ShowDib (hdc, (BITMAPFILEHEADER * )buf3, 640, 480, SHOW_NORMAL);
SetDIBitsToDevice
最新推荐文章于 2018-08-09 00:25:54 发布