首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

关于BCB中StretchDIBits怎么使用

2013-01-01 
关于BCB中StretchDIBits如何使用如何将一个bmp文件如“1.bmp”用StretchDIBitsAPI函数显示在Form上。请给个能

关于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("指定的位图文件木有找到!");
    }
}


[解决办法]
用BitBlt几行代码就可以了

[解决办法]
围观楼上一堆人关于BCB中StretchDIBits怎么使用
[解决办法]
BCB 的Canvas封装的大部分的API,如果对api不熟悉使用它很方便

热点排行
Bad Request.