StretchDIBits(hDC, 0, 0, img.cols, img.rows, 0, 0, img.cols, img.rows, img.data, bmi, DIB_RGB_COLORS, SRCCOPY);什么意思
时间: 2023-10-05 20:13:16 浏览: 35
这是一个 Windows GDI(图形设备接口)函数,它用于将位图数据绘制到设备上。该函数的参数含义如下:
- hDC:目标设备的句柄。
- 0, 0:目标设备的起始坐标。
- img.cols:目标设备的宽度。
- img.rows:目标设备的高度。
- 0, 0:源位图的起始坐标。
- img.cols:源位图的宽度。
- img.rows:源位图的高度。
- img.data:源位图数据的指针。
- bmi:BITMAPINFO 结构体指针,用于描述位图的信息。
- DIB_RGB_COLORS:指定位图使用的颜色表类型。
- SRCCOPY:指定将源位图数据直接拷贝到目标设备上,不做任何处理。
综上所述,该函数的作用是将源位图数据绘制到目标设备上,并且不做任何处理。
相关问题
使用StretchDIBits怎么把图像以及鸟瞰图画在HDC上
StretchDIBits 是一个 GDI 函数,可以将一个位图拉伸或压缩到指定的矩形区域中,并将结果呈现在指定的设备上下文中。下面是一个使用 StretchDIBits 函数将图像和鸟瞰图绘制到 HDC 中的示例代码:
```c++
// 加载图像
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, L"image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
// 创建内存设备上下文
HDC hMemDC = CreateCompatibleDC(NULL);
// 将位图选入内存设备上下文中
HGDIOBJ hOldBitmap = SelectObject(hMemDC, hBitmap);
// 获取位图信息
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
// 创建矩形区域
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = bmp.bmWidth;
rect.bottom = bmp.bmHeight;
// 在 HDC 中绘制图像
StretchDIBits(hDC, 0, 0, 200, 200, 0, 0, bmp.bmWidth, bmp.bmHeight, bmp.bmBits, (BITMAPINFO*)&bmp, DIB_RGB_COLORS, SRCCOPY);
// 绘制鸟瞰图
StretchDIBits(hDC, 200, 0, 200, 200, 0, 0, bmp.bmWidth, bmp.bmHeight, bmp.bmBits, (BITMAPINFO*)&bmp, DIB_RGB_COLORS, SRCCOPY);
// 恢复原始的位图对象
SelectObject(hMemDC, hOldBitmap);
// 删除内存设备上下文
DeleteDC(hMemDC);
// 删除位图
DeleteObject(hBitmap);
```
这段代码中,我们首先加载图像,然后创建一个内存设备上下文,将位图选入内存设备上下文中,获取位图信息,然后使用 StretchDIBits 函数将图像绘制到 HDC 中。接着,我们使用相同的方法绘制鸟瞰图,最后删除内存设备上下文和位图对象。注意,这里的矩形区域大小需要根据实际需求进行调整。
MFC使用HDC和StretchDIBits怎么实现双缓冲显示 代码
使用HDC和StretchDIBits实现双缓冲显示的步骤如下:
1. 创建两个内存DC(Device Context)和两个内存位图(Bitmap),分别用来保存前后两帧图像。
```
CDC* pDC = GetDC();
CRect rect;
GetClientRect(&rect);
CDC memDC1, memDC2;
CBitmap bmp1, bmp2;
memDC1.CreateCompatibleDC(pDC);
memDC2.CreateCompatibleDC(pDC);
bmp1.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
bmp2.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
memDC1.SelectObject(&bmp1);
memDC2.SelectObject(&bmp2);
ReleaseDC(pDC);
```
2. 在每一帧绘制前,将前后两个内存DC的位图进行交换,这样就可以在绘制当前帧时,不影响上一帧的显示。
```
CDC* pMemDC;
CBitmap* pBmp;
if (m_bUseMemDC1) {
pMemDC = &memDC1;
pBmp = &bmp1;
} else {
pMemDC = &memDC2;
pBmp = &bmp2;
}
m_bUseMemDC1 = !m_bUseMemDC1;
```
3. 绘制当前帧到内存DC中。
```
// 绘制当前帧到pMemDC中
// ...
```
4. 将内存DC中的位图通过StretchDIBits函数绘制到屏幕上。
```
CDC* pDC = GetDC();
CRect rect;
GetClientRect(&rect);
StretchDIBits(pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), pBmp->GetBits(), &m_bmpInfo, DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(pDC);
```
完整代码如下:
```
CDC* pDC = GetDC();
CRect rect;
GetClientRect(&rect);
CDC memDC1, memDC2;
CBitmap bmp1, bmp2;
memDC1.CreateCompatibleDC(pDC);
memDC2.CreateCompatibleDC(pDC);
bmp1.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
bmp2.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
memDC1.SelectObject(&bmp1);
memDC2.SelectObject(&bmp2);
ReleaseDC(pDC);
while (true) {
CDC* pMemDC;
CBitmap* pBmp;
if (m_bUseMemDC1) {
pMemDC = &memDC1;
pBmp = &bmp1;
} else {
pMemDC = &memDC2;
pBmp = &bmp2;
}
m_bUseMemDC1 = !m_bUseMemDC1;
// 绘制当前帧到pMemDC中
// ...
pDC = GetDC();
StretchDIBits(pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), pBmp->GetBits(), &m_bmpInfo, DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(pDC);
}
```