MFC使用StretchDIBits和BitBlt怎么实现双缓冲显示
时间: 2024-02-17 18:01:56 浏览: 83
在MFC中使用StretchDIBits和BitBlt实现双缓冲显示的方法如下:
1. 创建两个内存DC:一个用于绘制,一个用于显示。
```c++
CDC* pDCMem = new CDC();
pDCMem->CreateCompatibleDC(pDC);
CBitmap* pBitmapMem = new CBitmap();
pBitmapMem->CreateCompatibleBitmap(pDC, nWidth, nHeight);
CBitmap* pBitmapOld = pDCMem->SelectObject(pBitmapMem);
```
2. 在绘制DC中进行绘制,将绘制结果复制到内存DC中。
```c++
// 在绘制DC中进行绘制
// ...
// 将绘制结果复制到内存DC中
pDCMem->StretchDIBits(0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight, pBuffer, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
```
3. 将内存DC中的内容复制到显示DC中。
```c++
pDC->BitBlt(0, 0, nWidth, nHeight, pDCMem, 0, 0, SRCCOPY);
```
4. 最后,记得在程序结束时删除内存DC和位图对象。
```c++
pDCMem->SelectObject(pBitmapOld);
delete pDCMem;
delete pBitmapMem;
```
相关问题
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);
}
```
MFC使用后HDC和StretchDIBits怎么实现双缓冲显示 代码
要实现MFC中的双缓冲绘图,可以使用以下步骤:
1.创建一个内存位图对象,用于存储绘制的图像。
2.获取内存位图的设备上下文(HDC)。
3.使用内存DC绘制所有图像,而不是直接在屏幕上绘制。
4.使用StretchDIBits函数将内存DC中的图像复制到屏幕DC中。
以下是实现双缓冲绘图的示例代码:
```c++
// 定义内存位图和设备上下文
CBitmap memBitmap;
CDC memDC;
// 获取屏幕DC
CDC* pDC = GetDC();
// 获取屏幕宽度和高度
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
// 创建内存位图
memBitmap.CreateCompatibleBitmap(pDC, screenWidth, screenHeight);
// 获取内存DC
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&memBitmap);
// 绘制所有图像到内存DC中
// ...
// 将内存DC中的图像复制到屏幕DC中
pDC->StretchDIBits(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight, memBitmap, 0, 0, screenWidth, screenHeight, SRCCOPY);
// 释放资源
ReleaseDC(pDC);
memBitmap.DeleteObject();
memDC.DeleteDC();
```
在上面的代码中,绘制所有图像的代码应该在注释部分中,它将所有图像绘制到内存DC中。StretchDIBits函数将内存DC中的图像复制到屏幕DC中,从而实现了双缓冲绘图。
阅读全文