Domanda

Ho letto molti problemi con il tentativo di doppio buffer un controllo di Richedit, ma non ho visto risposte dirette a questa domanda specifica (sarebbe davvero bello avere un preventivo / link in cui Microsoft ha una dichiarazione ufficiale) .

Ecco alcuni codici (VCL / Delphi / Borland Builder 6.0) Ho usato per il test:

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

Se chiamo per iniziare () prima di ereditare :: wndproc () (che passa il messaggio al controllo per quelli che non conoscono VCL), il controllo non disegna nulla sulla mia memoria DC o la finestra effettiva DC . Se invito invece GetDC (), il controllo non disegna ancora la memoria DC, ma quindi disegna direttamente sulla finestra DC direttamente. Lo confermo commentando il mio BitBlt () Chiama. Se non è commentato, l'area client è tutto nero (il che significa che il controllo non ha mai dipinto la memoria DC a tutti), se commento quella linea, Il controllo disegna correttamente (il che significa che Ignroed la memoria WPARAM DC e è andato direttamente alla finestra DC).

Mentre suona come ho risposto alla mia domanda, quello che voglio veramente è la conferma dagli altri (link all'articolo di MS KB o MSDN sarebbe fantastico, quindi posso mostrare il mio capo :), e Possibile altro Idee per ottenere il doppio buffering? Non riesco a utilizzare la maggior parte degli hack che ho trovato come avere il controllo è nascosto fuori schermo o usando wm_print, perché ho bisogno di questo controllo per funzionare effettivamente per l'ingresso utente e le barre di scorrimento , non è solo una lettura solo per il display.

Inoltre, il controllo utilizza Richedit 2.0, anche se sto usando VCL .. È stato modificato per creare la finestra come classe "Richedit20a". Ho anche confermato che lo strato VCL non è affatto scherzando con il dipinto, quindi questo stesso comportamento dovrebbe essere visto con il codice Puro Win32.

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top