c ++ - flimmerfri fanekontrol med WS\_EX\_COMPOSITED

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en VS2008 C ++ applikation til Windows XP SP3 udviklet ved hjælp af WTL 8.1. Min ansøgning indeholder en fanekontrol, der flimrer, når applikationsgrænsen er ændret.


Mit vindueshierarki ser sådan ud:


CFrameWindowImpl   CMainFrm
|-CSplitterWindow  Splitter
  |-CTabView       Configuration Tabs
  | |-CDialogImpl  Configuration View 1
  | |-CDialogImpl  Configuration View 2
  | |-CDialogImpl  Configuration View 3
  |-CDialogImpl    Control View


Løsningen, jeg prøver, er at få CFrameWindowImpl afledte klasser brug af WS\_EX\_COMPOSITED stilen og alle vinduer under den bruger WS\_EX\_TRANSPARENT stilen. Desværre viser dette, at fanekontrolknapperne vises som en tom sorte bjælke og kontrollerne for enhver konfigurationsvisning, der ikke vises overhovedet.


Hvis jeg fjerner stilarterne WS\_EX\_COMPOSITED og WS\_EX\_TRANSPARENT, vises formularen korrekt, men CTabView og alt under den blinker forfærdeligt, når størrelsen ændres.


Hvad skal jeg ændre for at eliminere flimmer og trække kontrollerne korrekt?


Tak,
PaulH





Redigere:
 Fik det til at fungere. Jeg fjernede alle WS\_EX\_TRANSPARENT stilarter pr. Mark Ransom s forslag. Jeg sætter WS\_EX\_COMPOSITED stilen på only CTabCtrl (indeholdt i CTabView ). Andre kontroller får dobbeltbuffering efter behov gennem WTL::CDoubleBufferImpl<>.

Bedste reference


Et vindue flimrer, fordi det bliver slettet, før det er slettet. For at eliminere dette skal du slukke for sletningen af ​​vinduet fuldstændigt og bruge dobbelt buffering - trække vinduets indhold i en bitmap og derefter kopiere bitmapet til vinduet. Da bitmapet indeholder Hele indholdet inklusive baggrunden, er der ingen grund til at slette længere.


Det ser ud til, at WS\_EX\_COMPOSITED automatisk håndterer dobbeltbufferingen, men du skal stadig bruge en NULL-baggrundsborste og/eller håndtere WM\_ERASEBKGND-beskeden.

Andre referencer 1


Hvad der ikke er nævnt i MSDN, er at Desktop Window Manager - komponenten, der hakker vinduesmaleri på Windows Vista og 7 for at udføre den skrivbordsammensætning, der er nødvendig for at få aero glass-effekten - implementerer IKKE WS\_EX\_COMPOSITED.


Hvilket betyder, at alt arbejde, du lægger i at få denne stil til at fungere på XP, er dømt til at blive irrelevent på Vista eller senere.


Det andet problem med WS\_EX\_COMPOSITED - og hvorfor det var en valgfri stil og ikke en standard på XP: Den dobbelte buffering optager kun et maleri udført under StartPaint/EndPaint-blokken i overordnet vindue. Masser af selv standardkontroller, udfører maleri uden for deres WM\_PAINT-håndteringsmaskiner, og som følge heraf får backbufferen kun delvis malet.


Desværre er resultatet, at den eneste måde at 'eliminere' flimmer på i indbyggede API-apps er at forsøge at minimere det: WS\_CLIPCHILDREN og WS\_CLIPSIBLINGS kan hjælpe, hvis du ikke har overlappende kontroller - for at sikre at hver kontrolområde kun er malet én gang. Og sørg for, at hoveddialogboksen ikke udfører nogen oversvømmelse i WM\_ERASEBKGND

Andre referencer 2


Det er ikke i min erfaring muligt at bruge dobbeltbuffer til alt, hvad der indeholder børns kontrol (medmindre de alle fuldt ud støtter WM\_PRINT, som de fleste ikke gør).