Il controllo Richedit 2.0 ignora WPARAM per i messaggi wm_paint?
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.
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.