如何解决HDC和Memory DC是否不同?
我正在研究Windows winapi中的双缓冲。 当我使用DrawText函数在HDC上直接绘制文本时,它的工作原理就像在代码下一样。
case WM_PAINT:
hDC = BeginPaint(hwnd,&ps);
DrawText(hDC,"test",4,&rt,DT_CENTER | DT_WORDBREAK);
DeleteDC(hMemDC);
ReleaseDC(hwnd,hDC);
EndPaint(hwnd,&ps);
break;
但是,我想使用双重缓冲,因此我将内存设置为dc和bitblt。 在代码下是这样,它不起作用。我可以显示空白屏幕。
case WM_PAINT:
hDC = BeginPaint(hwnd,&ps);
hMemDC = CreateCompatibleDC(hDC);
//GetClientRect(hwnd,&crt);
//hBitmap = CreateCompatibleBitmap(hDC,crt.right,crt.bottom);
//OldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
DrawText(hMemDC,DT_CENTER | DT_WORDBREAK);
BitBlt(hDC,800,hMemDC,SRCCOPY);
DeleteDC(hMemDC);
ReleaseDC(hwnd,&ps);
break;
内存DC是否与原始DC不同? 如果我使用CreateCompatibleBitmap函数,它将很好地工作。 我缺少什么概念? 网站组织得井井有条吗?
解决方法
典型的非双缓冲绘制例程如下:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
RECT rcWnd;
GetClientRect(hWnd,&rcWnd);
{
DrawText(hdc,_T("Hello,world!"),-1,&rcWnd,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
EndPaint(hWnd,&ps);
}
break;
典型的双缓冲绘制例程如下:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&rcWnd);
{
const int width = rcWnd.right - rcWnd.left
const int height = rcWnd.bottom - rcWnd.top;
// create a new DC based on the target HDC
HDC hDCMem = CreateCompatibleDC(hdc);
// create a bitmap that is compatible with the target DC
HBITMAP hMemBmp = CreateCompatibleBitmap(hdc,width,height);
// select the new bitmap in to the DC,saving the old bitmap
HBITMAP hOldBmp = (HBITMAP)SelectObject(hDCMem,hMemBmp);
// do your drawing
HBRUSH hBr = CreateSolidBrush(RGB(255,255,255));
FillRect(hDCMem,hBr);
DeleteObject(hBr);
DrawText(hDCMem,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// copy all the bits from our new DC over to the target DC
BitBlt(hdc,rcWnd.left,rcWnd.top,height,hDCMem,SRCCOPY);
// select the original bitmap the DC came with
SelectObject(hDCMem,hOldBmp);
// delete our bitmap
DeleteObject(hMemBmp);
// delete the DC
DeleteDC(hDCMem);
}
EndPaint(hWnd,&ps);
}
break;
case WM_ERASEBKGND:
// since we are drawing the entire area because we are double-buffering,there is
// no need to erase the background. This will speed up your drawing.
return TRUE;
HDC
对象都是相同的-在内存中创建另一个对象时,不会发生任何特殊情况。我的意思是,它们确实都在记忆中。您只是在创建另一个画布来进行绘图,然后一次复制该画布。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。