Come evitare lo sfarfallio durante la gestione di WM_ERASEBKGND nella finestra di dialogo di Windows

StackOverflow https://stackoverflow.com/questions/164751

Domanda

Ho una finestra di dialogo che si ridimensiona. Ha anche uno sfondo personalizzato che dipingo in risposta a una chiamata WM_ERASEBKGND (attualmente una semplice chiamata a FillSolidRect).

Quando la finestra di dialogo viene ridimensionata, si verifica uno tremolio tremendo. Per provare a ridurre lo sfarfallio, elenco tutte le finestre secondarie e le aggiungo all'area di ritaglio. Questo sembra aiutare un po '- ora lo sfarfallio è per lo più evidente in tutti i controlli dei bambini mentre ridipingono.

Come posso rendere la finestra senza sfarfallio durante il ridimensionamento? Sospetto che il doppio buffering debba svolgere un ruolo, ma non sono sicuro di come farlo con una finestra di dialogo con i controlli figlio (senza fare in modo che tutti i controlli figlio siano disegnati dal proprietario o qualcosa del genere).

Dovrei notare che sto usando C ++ (non .NET) e MFC, anche se le soluzioni pure basate su Win32 sono benvenute :)

NOTA: una cosa che ho provato ma che non ha funzionato (non so perché) era:

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
È stato utile?

Soluzione

Supponendo che " FillSolidRect " è la cancellazione del tuo background, quindi restituisci TRUE da WM_ERASEBKGND.

Per fare il doppio buffering che stai quasi facendo nel tuo frammento di codice, dovrai usare CreateCompatibleBitmap e selezionarlo nel tuo memDC.

Altri suggerimenti

Prova ad aggiungere la seguente riga alla tua funzione OnInitDialog:

    ModifyStyle(0, WS_CLIPCHILDREN, 0);

Non fare nulla nella gestione di WM_ERASEBKGND e fare la cancellazione come parte del tuo WM_PAINT principale. Puoi dipingere in modo più intelligente in modo da ridisegnare solo le aree non valide o, più facilmente, bufferizzare due volte il disegno.

Non facendo nulla sullo sfondo di cancellazione, hai tutto il tuo codice di disegno in una posizione che dovrebbe rendere più facile per gli altri seguire e mantenere.

Se si sceglie come target WinXP o versione successiva, è anche possibile utilizzare lo stile WS_EX_COMPOSITED per abilitare il doppio buffering per impostazione predefinita per le finestre di livello superiore con questo stile. Tieni presente che questo ha il suo set di limitazioni - in particolare, non è più necessario estrarre i cicli di OnPaint usando GetDC, ecc.

puoi impostare il parametro della tua chiamata sul metodo InvalidateRect come falso. Ciò ti impedirà di inviare WM_ERASEBKGND quando verrà ridisegnata la finestra. Qui è un bel link per prevenire lo sfarfallio nella finestra.

Il doppio buffering è davvero l'unico modo per farlo funzionare.

I controlli per bambini si prenderanno cura di se stessi fintanto che si assicura che CLIPCHILDREN .

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