Pregunta

He leído muchos problemas con el intento de un control de doble tampón, pero no he visto ninguna respuesta directa a esta pregunta específica (sería realmente genial tener una cotización / enlace donde Microsoft tiene una declaración oficial) .

Aquí hay algún código (VCL / Delphi / Borland Builder 6.0) que he estado usando para probar:

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;
  }

Si llamo a InicioPaint () antes de heredado :: WNDPROC () (que pasa el mensaje al control para aquellos que no conocen VCL), el control no dibuja nada en mi memoria DC o la ventana real DC . Si llamo a GETDC (), en su lugar, el control aún no se basa en la memoria DC, pero luego se basa en la ventana DC directamente. Confirmo esto comentando mi llamada Bitblt (). Si no está comentado, el área del cliente es todo negro (lo que significa que el control no pintó en la memoria DC en absoluto), si comento a esa línea, El control se basa correctamente (lo que significa que ignoró la memoria WPARAM DC y fue directamente a la ventana DC).

Mientras suena como si hubiera respondido a mi propia pregunta, lo que realmente quiero es confirmación de los demás (enlace al artículo de MS KB o MSDN sería genial, así que puedo mostrarle a mi jefe :), y posible otros ¿Ideas para lograr doble tamponería? No puedo usar la mayoría de los hacks que he encontrado como si el control se escondiera fuera de pantalla o usando WM_PRINT, porque necesito que este control funcione para trabajar por el usuario y las barras de desplazamiento. , no es solo lectura solo para mostrar.

Además, el control está usando RichEdit 2.0, aunque estoy usando VCL. Se ha modificado para crear la ventana como clase "RichEdit20A". También he confirmado que la capa VCL no está jugando con la pintura en absoluto, por lo que este mismo comportamiento debe verse con el código WIN32 puro.

¿Fue útil?

Solución

what I really want is confirmation from others (link to MS KB article or MSDN would be great, so I can show my boss :)

How about the obvious location: The documentation for the WM_PAINT message, which clearly states

wParam

This parameter is not used.

There is therefore no reason to expect that modifying the wParam will have any effect.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top