关于BCB中StretchDIBits如何使用
如何将一个bmp文件如“1.bmp”用StretchDIBits API函数显示在Form上。请给个能显示效果的代码,马上结贴!
[解决办法]
火速看帖,果断回复!
//---------------------------------------
BOOL __stdcall CrnDrawBitmapToHDC(LPCTSTR lpBmpFile, HDC hdc)
{
HBITMAP hBmp = (HBITMAP)::LoadImage(
0,
lpBmpFile,
IMAGE_BITMAP,
0,
0,
LR_CREATEDIBSECTION
[解决办法]
LR_LOADFROMFILE);
BITMAP bmp;
::GetObject(hBmp, sizeof(BITMAP), (LPVOID) &bmp);
int nColors = (1 << bmp.bmBitsPixel);
if (nColors > 256)
nColors = 0;
int nSizeInfo = sizeof(BITMAPINFO) + (nColors * sizeof(RGBQUAD));
LPBITMAPINFO lpBmpInfo = (LPBITMAPINFO)::GlobalAlloc(GMEM_FIXED, nSizeInfo);
lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpBmpInfo->bmiHeader.biWidth = bmp.bmWidth;
lpBmpInfo->bmiHeader.biHeight = bmp.bmHeight;
lpBmpInfo->bmiHeader.biPlanes = 1;
lpBmpInfo->bmiHeader.biBitCount = bmp.bmBitsPixel * bmp.bmPlanes;
lpBmpInfo->bmiHeader.biCompression = BI_RGB;
lpBmpInfo->bmiHeader.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;
lpBmpInfo->bmiHeader.biXPelsPerMeter = 0;
lpBmpInfo->bmiHeader.biYPelsPerMeter = 0;
lpBmpInfo->bmiHeader.biClrUsed = 0;
lpBmpInfo->bmiHeader.biClrImportant = 0;
RGBQUAD rgb[256];
if (nColors <= 256)
{
HDC hMemDC = ::CreateCompatibleDC(NULL);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBmp);
::GetDIBColorTable(hMemDC, 0, nColors, rgb);
for (int i = 0; i < nColors; ++i)
{
lpBmpInfo->bmiColors[i].rgbRed = rgb[i].rgbRed;
lpBmpInfo->bmiColors[i].rgbGreen = rgb[i].rgbGreen;
lpBmpInfo->bmiColors[i].rgbBlue = rgb[i].rgbBlue;
}
::SelectObject(hMemDC, hOldBitmap);
::DeleteDC(hMemDC);
}
::StretchDIBits(hdc,
0,
0,
bmp.bmWidth,
bmp.bmHeight,
0,
0,
bmp.bmWidth,
bmp.bmHeight,
bmp.bmBits,
lpBmpInfo,
DIB_RGB_COLORS,
SRCCOPY);
::DeleteObject(hBmp);
::GlobalFree(lpBmpInfo);
return TRUE;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCHAR szBmpFile[] = TEXT("D:\\ccrun\\222.bmp");
if (FileExists(szBmpFile))
{
HDC hdc = ::GetDC(Handle);
CrnDrawBitmapToHDC(szBmpFile, hdc);
::ReleaseDC(Handle, hdc);
}
else
{
ShowMessage("指定的位图文件木有找到!");
}
}
