Win32显示图像

编辑 / C/C++ / 发布于2020-09-02 / 更新于2023-03-16 / 阅读 253

在windows下将数据以位图的方式显示:

//变量定义

HWND hWnd;              //窗口句柄定义
HDC hdc_mem;            //缓冲句柄
HBITMAP screen_hb ;		// DIB
HBITMAP screen_ob ;		// 老的 BITMAP
void* buffer;           //数据存储区

BITMAPINFO bi = { { sizeof(BITMAPINFOHEADER), 100, 100, 1, 24, BI_RGB,
       100 * 100 * 3, 0, 0, 0, 0 } };
//初始化配置
HDC hdc = GetDC(hWnd);
hdc_mem = CreateCompatibleDC(hdc);
screen_hb = CreateDIBSection(hdc_mem, &bi, DIB_RGB_COLORS, (void**)&buffer, NULL, 0);   
if (screen_hb == NULL) return -3;
screen_ob = (HBITMAP)SelectObject(hdc_mem, screen_hb);
ReleaseDC(hWnd, hdc);

//显示数据  dat为位图数据指针,size为1像素所占字节大小
ImageLoad(void* dat, int width, int height,int size)
{
    if (hdc_mem && screen_hb)
    {
        HDC hDC = GetDC(hWnd);
        memcpy(buffer, dat, width * height * size);
        BitBlt(hDC, 0, 0, width, height, hdc_mem, 0, 0, SRCCOPY);
        ReleaseDC(hWnd, hDC);
    }
}

CreateDIBSection函数中的第四个参数非常重要,这个参数是一个指针,指向存储位图数据的一块内存。我们传递给函数一个指针变量后,函数自动分配一块内存出来,这块内存自动分配,自动释放。在配置好后,我们将位图数据放置到这块内存中,在调用BitBlt就可以显示图像了。
做这个的原因是,自己准备学习3d render需要显示,如果加载QT\SDL库有点大材小用,并且网上一些其他的用来显示的加了很多其他功能代码,总体的代码量有点多。