win32绘图代码段,将rgb数据绘制到hWnd上
void Show(HWND hwnd, unsigned char* rgb, int w, int h)
{
HDC hdc = GetDC(hwnd);//获取当前的显示设备上下文
RECT rect;
GetClientRect(hwnd, &rect);
int cxClient = rect.right;
int cyClient = rect.bottom;
HDC hdcsource = CreateCompatibleDC(NULL);//创建存放图象的显示缓冲
HBITMAP bitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient);
SelectObject(hdcsource,bitmap); //将位图资源装入显示缓冲
SetStretchBltMode(hdcsource, COLORONCOLOR);
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biHeight = -h;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
bmi.bmiHeader.biSizeImage = 0;
StretchDIBits(hdcsource,0,0, rect.right-rect.left,rect.bottom-rect.top, \
0,0,w,h,rgb,&bmi,DIB_RGB_COLORS,SRCCOPY);
BitBlt(hdc,0,0,cxClient,cyClient,hdcsource,0,0,SRCCOPY);//将图象显示缓冲的内容直接显示到屏幕
DeleteObject(bitmap);
DeleteDC(hdcsource);
ReleaseDC(hwnd, hdc);
}
注意rgb图像的原点即可。
吐槽下,win32绘制图像好麻烦,窗口缩放的时候还得做处理,不然会闪烁。还是Qt大法好。