Richedit 2.0控件忽略WParam的WM_PAINT消息?

时间:2012-03-01 16:29:10

标签: winapi richedit trichedit

我已经阅读了很多关于尝试对一个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代码也应该看到同样的行为。

1 个答案:

答案 0 :(得分:4)

  

我真正想要的是其他人的确认(链接到MS KB文章   或MSDN会很棒,所以我可以告诉我的老板:)

明显的位置如何:documentation for the WM_PAINT message,明确说明

  

wParam中

     

不使用此参数。

因此没有理由期望修改wParam会产生任何影响。