我已经阅读了很多关于尝试对一个richedit控件进行双缓冲的问题,但是还没有看到这个特定问题的任何直接答案(如果微软有官方声明,那么引用/链接真的很棒)
以下是我用于测试的一些代码(VCL / Delphi / Borland Builder 6.0):
if(Message.Msg == WM_PAINT)
{
HDC dc = GetDC(0);
HBITMAP memBitmap = CreateCompatibleBitmap(dc,ClientRect.Right,ClientRect.Bottom);
ReleaseDC(0,dc);
HBITMAP memDC = CreateCompatibleDC(0);
HBITMAP oldBitmap = SelectObject(memDC,memBitmap);
try{
//PAINTSTRUCT ps;
//dc = BeginPaint(Handle,&ps);
dc = GetDC(Handle);
Message.WParam = (int)memDC;
inherited::WndProc(Message);
Message.WParam = 0;
//BitBlt(dc,0,0,ClientRect.Right,ClientRect.Bottom,memDC,0,0,SRCCOPY);
ReleaseDC(Handle,dc);
//EndPaint(Handle,&ps);
} __finally
{
SelectObject(memDC,oldBitmap);
DeleteDC(memDC);
DeleteObject(memBitmap);
}
return;
}
如果我在继承:: WndProc()之前调用BeginPaint()(将消息传递给那些不知道VCL的控件),那么控件不会在我的内存DC或实际窗口DC上绘制任何内容。如果我改为调用GetDC(),控件仍然不会在内存DC上绘制,但它会直接在窗口DC上绘制。我通过注释掉我的BitBlt()调用来确认这一点..如果没有注释掉,客户端区域全是黑色的(意味着控件根本没有在内存DC上绘制),如果我注释掉那一行,控件正确绘制(意味着它忽略了WParam内存DC并直接进入窗口DC)。
虽然听起来我已回答了我自己的问题,但我真正想要的是其他人的确认(链接到MS KB文章或MSDN会很棒,所以我可以向老板展示:),和其他可能实现双缓冲的想法?我不能使用我发现的大多数黑客,比如将控件隐藏在屏幕外或使用WM_PRINT,因为我需要这个控件来实际用于用户输入和滚动条,它不只是只读显示器。
此外,控件正在使用RichEdit 2.0,即使我正在使用VCL ..它已被修改为将窗口创建为“richedit20a”类。我还确认VCL层根本没有弄乱绘画,所以使用纯win32代码也应该看到同样的行为。
答案 0 :(得分:4)
我真正想要的是其他人的确认(链接到MS KB文章 或MSDN会很棒,所以我可以告诉我的老板:)
明显的位置如何:documentation for the WM_PAINT
message,明确说明
wParam中
不使用此参数。
因此没有理由期望修改wParam
会产生任何影响。