brugergrænseflade - Lagret vindue modtager stadig WM\_PAINT besked efter UpdateLayeredWindow call

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har fået få lagdelt vinduer i min app, der bruger UpdateLayeredWindow() til at håndtere deres visuelle repræsentation. Ifølge MSDN-artiklen om lagrede vinduer 'behøver applikationen ikke at reagere på' når du bruger UpdateLayeredWindow() ' WM\_PAINT eller andre malermeddelelser. ' De delte nogle af de samme beskedhandlere som ikke-lagrede vinduer, så jeg regnede med, at jeg bare ville vende tilbage tidligt fra WM\_PAINT håndtering, hvis målet er et lagdelt vindue. [14] [15]


Dette forårsagede selvfølgelig et stort problem: Hvis en af ​​de lagrede vinduer fik en WM\_PAINT besked, vil indgangskøen engang oversvømmes med en uendelig strøm af WM\_PAINT beskeder . Dette slutresultat giver mening, da vinduet aldrig ville blive valideret, og det vil derfor fortsætte med at tænke det skal males (jeg skal ikke vende tilbage fra handleren uden at validere eller BeginPaint() ing osv.), Men hvad gør det ikke fornuftigt, hvorfor det modtog meddelelsen i første omgang, da det ikke har nogen effekt på et vindue, der brugte UpdateLayeredWindow().


Det ville ikke engang ske pålideligt - lige nu og da, og ikke hver gang vinduets pixler skulle genbruges. Sanity blev gendannet ved at falde tilbage til DefWindowProc(), når et lagdelt vindue fik en WM\_PAINT besked, men jeg har lyst til noget der foregår, som jeg ikke forstår. Og i betragtning af hvor sjældent dette problem manifesterede sig, jeg 'Jeg er bekymret over dette kan bare skjule et mere subtilt problem. Er det forventet adfærd for et vindue med UpdateLayeredWindow() for stadig at få den lejlighedsvise WM\_PAINT besked? Er det ligegyldigt, så længe jeg håndterer det korrekt?


Yderligere information, hvis det er nødvendigt: Vinduet ringer UpdateLayeredWindow() umiddelbart efter oprettelsen, og derefter er det tilbage på egen hånd (det kalder det ikke igen, da det ikke ændres). Brug af C ++ og win32 API, ingen MFC.

Bedste reference


Jeg havde kørt ind i lignende problemer før, selvom min hukommelse måske er lidt rusten nu.


Først skal du holde DefWindowProc. Når docs siger, at du ikke behøver at svare, ville jeg tage det for at betyde at ignorere meddelelsen helt, snarere end at forhindre standardhåndtering.


Jeg oplevede det personligt fra to forskellige årsager. Den ene var et vindue, der faktisk sendte WM\_PAINT meddelelser (onde! Pas på!). Den anden (IIRC) er resultatet af visse RedrawWindow-opkald. I begge tilfælde kritiserede jeg problemet op til dårligt skrevet kode uden for min kontrol, og aldrig havde nogen situationer opstået fra blot at sende den ned til DefWindowProc.


Forhåbentlig får du den samme oplevelse!


Held og lykke. Jeg fandt lagdelt windows for at være dårligt dokumenteret og fuld af interessante advarsler og gotchas, men meget glædeligt, når du får alle kinks udarbejdet.