【问题标题】:Richedit 2.0 control ignores WParam for WM_PAINT messages?Richedit 2.0 控件忽略 WM_PAINT 消息的 WParam?
【发布时间】:2012-03-01 16:29:10
【问题描述】:

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

【问题讨论】:

    标签: winapi richedit trichedit


    【解决方案1】:

    我真正想要的是其他人的确认(链接到 MS 知识库文章 或者 MSDN 会很棒,所以我可以向我的老板展示 :)

    明显的位置怎么样:documentation for the WM_PAINT message,上面写的很清楚

    wParam

    没有使用这个参数。

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

    【讨论】:

    • 哇,我的错。这就是我使用 10 年旧 IDE 附带的 10 年 Win32 文档所得到的。我通常在 MSDN 上查找所有内容,但我想在这种情况下,我只是想出了一些基本的东西,因为 WM_PAINT 永远不会改变......我的错。来自 Borland Builder 6.0 附带的旧文档: WM_PAINT hdc = (HDC) wParam; // 要绘制的设备上下文
    • 该链接确实说明了这一点,但他们没有列出哪些控件支持它:“对于一些常见的控件,默认的 WM_PAINT 消息处理检查 wParam 参数。如果 wParam 为非 NULL,则控件假定该值是 HDC 并使用该设备上下文进行绘制。"
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 2021-09-11
    • 2012-06-08
    • 2014-08-30
    • 2019-01-11
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多