Vensterfuncties
In dit overzicht worden functies van vensters besproken, zoals venstertypen, statussen, grootte en positie.
- venstertypen
- vensterrelaties
- venster Status weergeven
- venstergrootte en -positie
- vensteranimatie
- vensterindeling en spiegeling
- venstervernietigings
Venstertypen
Deze sectie bevat de volgende onderwerpen waarin venstertypen worden beschreven.
- Overlappende Windows-
- Pop-upvenstervensters
- Onderliggende Windows-
- gelaagde Windows-
- Message-Only Windows
Overlappende vensters
Een overlappend venster is een venster op het hoogste niveau (niet-onderliggend venster) met een titelbalk, rand en clientgebied; het is bedoeld om te fungeren als het hoofdvenster van een toepassing. Het kan ook een venstermenu hebben, knoppen minimaliseren en maximaliseren, en schuifbalken. Een overlappend venster dat als hoofdvenster wordt gebruikt, bevat doorgaans al deze onderdelen.
Door de stijl WS_OVERLAPPED of WS_OVERLAPPEDWINDOW op te geven in de functie CreateWindowEx, wordt er een overlappend venster gemaakt. Als u de stijl WS_OVERLAPPED gebruikt, heeft het venster een titelbalk en rand. Als u de stijl WS_OVERLAPPEDWINDOW gebruikt, heeft het venster een titelbalk, de grootte van de rand, het venstermenu en de knoppen minimaliseren en maximaliseren.
Pop-upvensters
Een pop-upvenster is een speciaal type overlappend venster dat wordt gebruikt voor dialoogvensters, berichtvakken en andere tijdelijke vensters die buiten het hoofdvenster van een toepassing worden weergegeven. Titelbalken zijn optioneel voor pop-upvensters; anders zijn pop-upvensters hetzelfde als overlappende vensters van de stijl WS_OVERLAPPED.
U maakt een pop-upvenster door de stijl WS_POPUP op te geven in CreateWindowEx-. Als u een titelbalk wilt opnemen, geeft u de WS_CAPTION stijl op. Gebruik de stijl WS_POPUPWINDOW om een pop-upvenster te maken met een rand en een venstermenu. De stijl WS_CAPTION moet worden gecombineerd met de stijl WS_POPUPWINDOW om het venstermenu zichtbaar te maken.
Onderliggende vensters
Een onderliggend venster heeft de WS_CHILD stijl en is beperkt tot het clientgebied van het bovenliggende venster. Een toepassing maakt doorgaans gebruik van onderliggende vensters om het clientgebied van een bovenliggend venster te verdelen in functionele gebieden. U maakt een onderliggend venster door de stijl WS_CHILD op te geven in de functie CreateWindowEx.
Een onderliggend venster moet een bovenliggend venster hebben. Het bovenliggende venster kan een overlappend venster, een pop-upvenster of zelfs een ander onderliggend venster zijn. U geeft het bovenliggende venster op wanneer u CreateWindowExaanroept. Als u de stijl WS_CHILD in CreateWindowEx- opgeeft, maar geen bovenliggend venster opgeeft, wordt het venster niet gemaakt.
Een onderliggend venster heeft een clientgebied, maar geen andere functies, tenzij ze expliciet worden aangevraagd. Een toepassing kan een titelbalk, een venstermenu aanvragen, knoppen minimaliseren en maximaliseren, een rand en schuifbalken voor een onderliggend venster, maar een onderliggend venster kan geen menu hebben. Als de toepassing een menugreep opgeeft, ofwel wanneer de vensterklasse van het kind wordt geregistreerd of het onderliggende venster wordt gemaakt, wordt de menugreep genegeerd. Als er geen randstijl is opgegeven, maakt het systeem een venster zonder rand. Een toepassing kan randloze onderliggende vensters gebruiken om het clientgebied van een bovenliggend venster te verdelen terwijl de delen onzichtbaar blijven voor de gebruiker.
In deze sectie worden de volgende aspecten van onderliggende vensters besproken:
Positionering
Het systeem plaatst altijd een onderliggend venster ten opzichte van de linkerbovenhoek van het clientgebied van het bovenliggende venster. Er wordt nooit een deel van een onderliggend venster weergegeven buiten de randen van het bovenliggende venster. Als een toepassing een onderliggend venster maakt dat groter is dan het bovenliggende venster of een onderliggend venster plaatst, zodat sommige of alle onderliggende vensters buiten de randen van het bovenliggende venster vallen, wordt het onderliggende venster geclipd; Dat wil gezegd, het gedeelte buiten het clientgebied van het bovenliggende venster wordt niet weergegeven. Acties die van invloed zijn op het bovenliggende venster kunnen ook van invloed zijn op het onderliggende venster, als volgt.
Bovenliggend venster | Onderliggend venster |
---|---|
Vernietigd | Vernietigd voordat het bovenliggende venster wordt vernietigd. |
Verborgen | Verborgen voordat het bovenliggende venster is verborgen. Een onderliggend venster is alleen zichtbaar wanneer het bovenliggende venster zichtbaar is. |
Ontroerd | Verplaatst met het clientgebied van het bovenliggende venster. Het kindervenster is verantwoordelijk voor het schilderen van het clientgebied na de verplaatsing. |
Weergegeven | Wordt weergegeven nadat het bovenliggende venster is weergegeven. |
Knipsel
In het systeem wordt niet automatisch een onderliggend venster uit het clientgebied van het bovenliggende venster geknipt. Dit betekent dat het bovenliggende venster over het onderliggende venster wordt getekend als er een tekening op dezelfde locatie wordt uitgevoerd als het onderliggende venster. Het systeem maakt echter wel een clip van het onderliggende venster uit het clientgebied van het bovenliggende venster als het bovenliggende venster de stijl WS_CLIPCHILDREN heeft. Als het onderliggende venster is geknipt, kan het bovenliggende venster er niet overheen tekenen.
Een onderliggend venster kan andere onderliggende vensters in hetzelfde clientgebied overlappen. Een onderliggend venster dat hetzelfde bovenliggende venster deelt als een of meer andere onderliggende vensters, wordt een venster op hetzelfde niveau genoemd. Vensters op hetzelfde niveau kunnen in elkaars clientgebied tekenen, tenzij een van de onderliggende vensters de WS_CLIPSIBLINGS stijl heeft. Als een onderliggend venster deze stijl heeft, wordt een deel van het onderliggende venster dat zich in het onderliggende venster bevindt, afgekapt.
Als een venster de stijl WS_CLIPCHILDREN of WS_CLIPSIBLINGS heeft, treedt er een gering verlies in prestaties op. Elk venster neemt systeembronnen in beslag, dus een toepassing mag geen onderliggende vensters gebruiken zonder onderscheid te maken. Voor de beste prestaties moet een toepassing die het hoofdvenster logisch moet verdelen, dit doen in de vensterprocedure van het hoofdvenster in plaats van door onderliggende vensters te gebruiken.
Relatie met bovenliggend venster
Een toepassing kan het bovenliggende venster van een bestaand onderliggend venster wijzigen door de functie SetParent aan te roepen. In dit geval verwijdert het systeem het onderliggende venster uit het clientgebied van het oude bovenliggende venster en verplaatst het naar het clientgebied van het nieuwe bovenliggende venster. Als SetParent een NULL--ingang opgeeft, wordt het bureaubladvenster het nieuwe bovenliggende venster. In dit geval wordt het onderliggende venster getekend op het bureaublad, buiten de grenzen van een ander venster. Met de functie GetParent wordt een ingang opgehaald naar het bovenliggende venster van een onderliggend venster.
Het bovenliggende venster zorgt ervoor dat een deel van het clientgebied naar een onderliggend venster wordt verplaatst en het onderliggende venster alle invoer van dit gebied ontvangt. De vensterklasse hoeft niet hetzelfde te zijn voor elk van de onderliggende vensters van het bovenliggende venster. Dit betekent dat een toepassing een bovenliggend venster kan vullen met onderliggende vensters die er anders uitzien en verschillende taken uitvoeren. Een dialoogvenster kan bijvoorbeeld veel typen besturingselementen bevatten, elk een onderliggend venster dat verschillende typen gegevens van de gebruiker accepteert.
Een onderliggend venster heeft slechts één bovenliggend venster, maar een bovenliggend venster kan een willekeurig aantal onderliggende vensters hebben. Elk onderliggend venster kan op zijn beurt onderliggende vensters hebben. In deze keten van vensters wordt elk onderliggend venster een onderliggend venster van het oorspronkelijke bovenliggende venster genoemd. Een toepassing gebruikt de functie IsChild om te ontdekken of een bepaald venster een onderliggend venster of een onderliggend venster van een bepaald bovenliggend venster is.
De EnumChildWindows functie inventariseert de onderliggende vensters van een bovenliggend venster. Vervolgens geeft EnumChildWindows de handle door aan elk onderliggend venster aan een door de toepassing gedefinieerde callback-functie. Onderliggende vensters van het opgegeven bovenliggende venster worden ook opgesomd.
Berichten
Het systeem geeft de invoerberichten van een onderliggend venster rechtstreeks door aan het onderliggende venster; de berichten worden niet doorgegeven via het bovenliggende venster. De enige uitzondering is als het onderliggende venster is uitgeschakeld door de functie EnableWindow. In dit geval geeft het systeem invoerberichten door die in plaats daarvan naar het bovenliggende venster zouden zijn gegaan. Hierdoor kan het bovenliggende venster de invoerberichten onderzoeken en indien nodig het onderliggende venster inschakelen.
Een onderliggend venster kan een unieke geheel getal-id hebben. Onderliggende venster-id's zijn belangrijk bij het werken met besturingsvensters. Een toepassing stuurt de activiteit van een besturingselement door deze berichten te verzenden. De toepassing gebruikt de id van het onderliggende venster van het besturingselement om de berichten naar het besturingselement te sturen. Bovendien verzendt een besturingselement meldingsberichten naar het bovenliggende venster. Een meldingsbericht bevat de id van het onderliggende venster van het besturingselement, die het bovenliggende besturingselement gebruikt om te bepalen welk besturingselement het bericht heeft verzonden. Een toepassing geeft de id van het onderliggende venster op voor andere typen onderliggende vensters door de hMenu parameter van de functie CreateWindowEx in te stellen op een waarde in plaats van een menugreep.
Gelaagde Vensters
Het gebruik van een gelaagd venster kan de prestaties en visuele effecten voor een venster met een complexe vorm aanzienlijk verbeteren, de vorm ervan animeren of alfamengingseffecten gebruiken. Het systeem stelt automatisch gelaagde vensters en de vensters van onderliggende toepassingen samen en herschilderen. Hierdoor worden gelaagde vensters soepel weergegeven, zonder de flikkerende typische venstergebieden. Bovendien kunnen gelaagde vensters gedeeltelijk translucent zijn, dat wil gezegd alfa-blended.
Als u een gelaagd venster wilt maken, geeft u de WS_EX_LAYERED uitgebreide vensterstijl op bij het aanroepen van de functie CreateWindowEx of roept u de functie SetWindowLong aan om WS_EX_LAYERED in te stellen nadat het venster is gemaakt. Na de aanroep CreateWindowEx, wordt het gelaagde venster pas zichtbaar nadat de SetLayeredWindowAttributes of UpdateLayeredWindow functie is aangeroepen voor dit venster.
Notitie
Vanaf Windows 8 kunnen WS_EX_LAYERED worden gebruikt met onderliggende vensters en vensters op het hoogste niveau. Vorige Windows-versies ondersteunen alleen WS_EX_LAYERED voor vensters op het hoogste niveau.
Als u het dekkingsniveau of de doorzichtigheidskleursleutel voor een bepaald gelaagd venster wilt instellen, roept u SetLayeredWindowAttributes-aan. Na de aanroep kan het systeem het venster nog steeds vragen om te schilderen wanneer het venster wordt weergegeven of het formaat ervan wordt gewijzigd. Omdat het systeem echter de afbeelding van een gelaagd venster opslaat, zal het systeem het venster niet vragen om te schilderen als delen van het venster worden onthuld als gevolg van relatieve vensters verplaatst op het bureaublad. Oudere toepassingen hoeven hun schildercode niet opnieuw te structureren als ze translucency- of transparantieeffecten voor een venster willen toevoegen, omdat het systeem het schilderij van vensters die SetLayeredWindowAttributes naar het geheugen buiten het scherm omleidt en opnieuw samenstelt om het gewenste effect te bereiken.
Voor een snellere en efficiëntere animatie of als alfa per pixel nodig is, roept u UpdateLayeredWindowaan. UpdateLayeredWindow- moet voornamelijk worden gebruikt wanneer de toepassing rechtstreeks de vorm en inhoud van een gelaagd venster moet leveren, zonder het omleidingsmechanisme te gebruiken dat het systeem biedt via SetLayeredWindowAttributes. Bovendien maakt het gebruik van UpdateLayeredWindow rechtstreeks efficiënter gebruik van geheugen, omdat het systeem niet het extra geheugen nodig heeft dat nodig is voor het opslaan van de installatiekopieën van het omgeleide venster. Roep UpdateLayeredWindow aan om de positie en de grootte van een gelaagd venster te wijzigen voor maximale efficiëntie. Houd er rekening mee dat nadat SetLayeredWindowAttributes is aangeroepen, volgende UpdateLayeredWindow-aanroepen mislukken totdat de bit van de gelaagde stijl is gewist en opnieuw is ingesteld.
Het testen van een gelaagd venster is gebaseerd op de vorm en transparantie van het venster. Dit betekent dat de gebieden van het venster met kleurtoetsen of waarvan de alfawaarde nul is, de muisberichten door laten lopen. Als het gelaagde venster echter de WS_EX_TRANSPARENT uitgebreide vensterstijl heeft, wordt de vorm van het gelaagde venster genegeerd en worden de muisgebeurtenissen doorgegeven aan andere vensters onder het gelaagde venster.
Message-Only Windows
Met een venster met alleen berichten kunt u berichten verzenden en ontvangen. Het is niet zichtbaar, heeft geen z-volgorde, kan niet worden geïnventariseerd en ontvangt geen broadcast-berichten. Het venster verzendt gewoon berichten.
Als u een alleen-berichtvenster wilt maken, geeft u de HWND_MESSAGE constante of een ingang op voor een bestaand berichtvenster in de parameter hWndParent van de functie CreateWindowEx. U kunt een bestaand venster ook wijzigen in een berichtvenster door HWND_MESSAGE op te geven in de parameter hWndNewParent van de functie SetParent.
Als u alleen-berichtvensters wilt zoeken, geeft u HWND_MESSAGE op in de parameter hwndParent van de functie FindWindowEx. Bovendien zoekt FindWindowEx vensters met alleen-berichten en vensters op het hoogste niveau als zowel de parameters hwndParent als hwndChildAfter parameters worden NULL-.
Vensterrelaties
Er zijn veel manieren waarop een venster betrekking kan hebben op de gebruiker of een ander venster. Een venster kan een venster zijn dat eigendom is van een venster, voorgrondvenster of achtergrondvenster. Een venster heeft ook een z-volgorde ten opzichte van andere vensters. Zie de volgende onderwerpen voor meer informatie:
Voorgrond- en achtergrondvensters
Elk proces kan meerdere threads van uitvoering hebben en elke thread kan vensters maken. De thread waarmee het venster is gemaakt waarmee de gebruiker momenteel werkt, wordt de voorgrondthread genoemd en het venster wordt het voorgrondvenstergenoemd. Alle andere threads zijn achtergrondthreads en de vensters die door achtergrondthreads worden gemaakt, worden achtergrondvenstersgenoemd.
Elke thread heeft een prioriteitsniveau dat bepaalt hoeveel CPU-tijd de thread ontvangt. Hoewel een toepassing het prioriteitsniveau van de threads kan instellen, heeft de voorgrondthread normaal gesproken een iets hogere prioriteit dan de achtergrondthreads. Omdat deze een hogere prioriteit heeft, ontvangt de voorgrondthread meer CPU-tijd dan de achtergrondthreads. De voorgrondthread heeft een normale basisprioriteit van 9; een achtergrondthread heeft een normale basisprioriteit van 7.
De gebruiker stelt het voorgrondvenster in door op een venster te klikken of door de toetsencombinatie Alt+TAB of Alt+ESC te gebruiken. Als u een ingang wilt ophalen naar het voorgrondvenster, gebruikt u de functie GetForegroundWindow. Als u wilt controleren of uw toepassingsvenster het voorgrondvenster is, vergelijkt u de ingang die wordt geretourneerd door GetForegroundWindow met die van uw toepassingsvenster.
Een toepassing stelt het voorgrondvenster in met behulp van de functie SetForegroundWindow.
Het systeem beperkt welke processen het voorgrondvenster kunnen instellen. Een proces kan het voorgrondvenster alleen instellen als:
- Aan alle volgende voorwaarden is voldaan:
- Het proces dat SetForegroundWindow- aanroept, behoort tot een bureaubladtoepassing, niet tot een UWP-app of een Windows Store-app die is ontworpen voor Windows 8 of 8.1.
- Het voorgrondproces heeft aanroepen naar SetForegroundWindow- niet uitgeschakeld door een eerdere aanroep naar de LockSetForegroundWindow-functie.
- De time-out voor de voorgrondvergrendeling is verlopen (zie SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
- Er zijn geen menu's actief.
- Daarnaast geldt ten minste één van de volgende voorwaarden:
- Het aanroepende proces is het voorgrondproces.
- Het aanroepende proces is gestart door het voorgrondproces.
- Er is momenteel geen voorgrondvenster en dus geen voorgrondproces.
- Het aanroepende proces heeft de laatste invoergebeurtenis ontvangen.
- Het voorgrondproces of het aanroepende proces wordt foutopsporing uitgevoerd.
Het is mogelijk dat een proces wordt geweigerd het recht om het voorgrondvenster in te stellen, zelfs als het aan deze voorwaarden voldoet.
Een proces dat het voorgrondvenster kan instellen, kan een ander proces inschakelen om het voorgrondvenster in te stellen door de functie AllowSetForegroundWindow aan te roepen of door de functie BroadcastSystemMessage aan te roepen met de vlag BSF_ALLOWSFW. Het voorgrondproces kan aanroepen naar SetForegroundWindow- uitschakelen door de functie LockSetForegroundWindow aan te roepen.
Windows in eigendom
Een overlappend of pop-upvenster kan eigendom zijn van een ander overlappend of pop-upvenster. In eigendom worden verschillende beperkingen voor een venster weergegeven.
- Een venster in eigendom is altijd boven de eigenaar in de z-order.
- Het systeem vernietigt automatisch een venster in eigendom wanneer de eigenaar wordt vernietigd.
- Een venster in eigendom is verborgen wanneer de eigenaar wordt geminimaliseerd.
Alleen een overlappend of pop-upvenster kan een eigenaarsvenster zijn; een onderliggend venster kan geen eigenaarvenster zijn. Een toepassing maakt een venster in eigendom door de venstergreep van de eigenaar op te geven als de hwndParent parameter van CreateWindowEx wanneer er een venster wordt gemaakt met de stijl WS_OVERLAPPED of WS_POPUP. De parameter hwndParentParent moet een overlappend of pop-upvenster identificeren. Als hwndParent een onderliggend venster identificeert, wijst het systeem eigendom toe aan het bovenliggende venster op het hoogste niveau van het onderliggende venster. Nadat u een venster in eigendom hebt gemaakt, kan een toepassing het eigendom van het venster niet overdragen aan een ander venster.
Dialoogvensters en berichtvakken zijn standaard het eigendom van vensters. Een toepassing geeft het eigenaarvenster op bij het aanroepen van een functie waarmee een dialoogvenster of berichtvak wordt gemaakt.
Een toepassing kan de functie GetWindow- gebruiken met de vlag GW_OWNER om een ingang op te halen bij de eigenaar van een venster.
Z-Order
De z-order van een venster geeft de positie van het venster aan in een stapel overlappende vensters. Deze vensterstack is gericht op een imaginaire as, de z-as, die zich uitbreidt vanaf het scherm. Het venster bovenaan de z-order overlapt alle andere vensters. Het venster onderaan de z-order wordt overlapt door alle andere vensters.
Het systeem onderhoudt de z-volgorde in één lijst. Hiermee worden vensters toegevoegd aan de z-volgorde op basis van of het bovenste vensters, bovenste vensters of onderliggende vensters zijn. Een bovenste venster overlapt alle andere niet-bovenste vensters, ongeacht of het het actieve of voorgrondvenster is. Een bovenste venster heeft de stijl WS_EX_TOPMOST. Alle bovenste vensters worden weergegeven in de z-volgorde voor alle niet-bovenste vensters. Een onderliggend venster is gegroepeerd met het bovenliggende venster in z-volgorde.
Wanneer een toepassing een venster maakt, plaatst het systeem het boven aan de z-volgorde voor vensters van hetzelfde type. U kunt de functie BringWindowToTop gebruiken om een venster boven aan de z-volgorde voor vensters van hetzelfde type te plaatsen. U kunt de z-volgorde opnieuw rangschikken met behulp van de functies SetWindowPos en DeferWindowPos.
De gebruiker wijzigt de z-order door een ander venster te activeren. Het systeem plaatst het actieve venster boven aan de z-order voor vensters van hetzelfde type. Wanneer een venster boven aan z-order komt, doe dan de onderliggende vensters. U kunt de functie GetTopWindow gebruiken om alle onderliggende vensters van een bovenliggend venster te doorzoeken en een ingang te retourneren naar het onderliggende venster dat het hoogst in z-volgorde is. Met de functie GetNextWindow wordt een ingang opgehaald naar het volgende of vorige venster in z-volgorde.
Weergavestatus van venster
Op een bepaald moment kan een venster actief of inactief zijn; verborgen of zichtbaar; en geminimaliseerd, gemaximaliseerd of hersteld. Deze kwaliteiten worden collectief aangeduid als het venster tonen status. In de volgende onderwerpen wordt de status van de venstervoorstelling besproken:
- Actief venster
- Uitgeschakelde Windows-
- venster zichtbaarheid
- Geminimaliseerde, gemaximaliseerde en herstelde Windows-
Actief venster
Een actief venster is het venster op het hoogste niveau van de toepassing waarmee de gebruiker momenteel werkt. Om de gebruiker in staat te stellen het actieve venster gemakkelijk te identificeren, plaatst het systeem het boven aan de z-volgorde en wijzigt de kleur van de titelbalk en rand in de door het systeem gedefinieerde actieve vensterkleuren. Alleen een venster op het hoogste niveau kan een actief venster zijn. Wanneer de gebruiker met een onderliggend venster werkt, activeert het systeem het bovenliggende venster op het hoogste niveau dat is gekoppeld aan het onderliggende venster.
Er is slechts één venster op het hoogste niveau in het systeem tegelijk actief. De gebruiker activeert een venster op het hoogste niveau door erop te klikken (of een van de onderliggende vensters), of door de toetsencombinatie Alt+Esc of Alt+Tab te gebruiken. Een toepassing activeert een venster op het hoogste niveau door de functie SetActiveWindow aan te roepen. Andere functies kunnen ertoe leiden dat het systeem een ander venster op het hoogste niveau activeert, waaronder SetWindowPos, DeferWindowPos, SetWindowPlacementen DestroyWindow. Hoewel een toepassing op elk gewenst moment een ander venster op het hoogste niveau kan activeren, moet dit alleen worden uitgevoerd als reactie op een gebruikersactie om verwarring te voorkomen. Een toepassing gebruikt de functie GetActiveWindow om een ingang op te halen in het actieve venster.
Wanneer de activering verandert van een venster op het hoogste niveau van de ene toepassing naar het venster op het hoogste niveau van een andere toepassing, verzendt het systeem een WM_ACTIVATEAPP bericht naar beide toepassingen, waarbij ze op de hoogte worden gesteld van de wijziging. Wanneer de activering verandert in een ander venster op het hoogste niveau in dezelfde toepassing, verzendt het systeem beide vensters een WM_ACTIVATE bericht.
Uitgeschakelde Windows
Een venster kan worden uitgeschakeld. Een uitgeschakeld venster ontvangt geen toetsenbord- of muisinvoer van de gebruiker, maar kan berichten ontvangen van andere vensters, van andere toepassingen en van het systeem. Een toepassing schakelt doorgaans een venster uit om te voorkomen dat de gebruiker het venster gebruikt. Een toepassing kan bijvoorbeeld een drukknop in een dialoogvenster uitschakelen om te voorkomen dat de gebruiker deze kiest. Een toepassing kan op elk gewenst moment een uitgeschakeld venster inschakelen; als u een venster inschakelt, wordt de normale invoer hersteld.
Standaard wordt een venster ingeschakeld wanneer het wordt gemaakt. Een toepassing kan echter de stijl WS_DISABLED opgeven om een nieuw venster uit te schakelen. Een toepassing schakelt een bestaand venster in of uit met behulp van de functie EnableWindow. Het systeem verzendt een WM_ENABLE bericht naar een venster wanneer de ingeschakelde status op het punt staat te veranderen. Een toepassing kan bepalen of een venster is ingeschakeld met behulp van de functie IsWindowEnabled.
Wanneer een onderliggend venster is uitgeschakeld, geeft het systeem de muisinvoerberichten van het kind door aan het bovenliggende venster. Het bovenliggende item gebruikt de berichten om te bepalen of het onderliggende venster moet worden ingeschakeld. Zie Muisinvoervoor meer informatie.
Slechts één venster tegelijk kan toetsenbordinvoer ontvangen; dat venster heeft de focus op het toetsenbord. Als een toepassing gebruikmaakt van de functie EnableWindow om een toetsenbordfocusvenster uit te schakelen, verliest het venster de focus op het toetsenbord naast uitgeschakeld. EnableWindow- stelt vervolgens de toetsenbordfocus in op NULL-, wat betekent dat er geen venster de focus heeft. Als een onderliggend venster of een ander onderliggend venster de toetsenbordfocus heeft, verliest het onderliggende venster de focus wanneer het bovenliggende venster is uitgeschakeld. Zie Toetsenbordinvoervoor meer informatie.
Zichtbaarheid van vensters
Een venster kan zichtbaar of verborgen zijn. Het systeem geeft een zichtbaar venster weer op het scherm. Het verbergt een verborgen venster door het niet te tekenen. Als een venster zichtbaar is, kan de gebruiker invoer aan het venster opgeven en de uitvoer van het venster bekijken. Als een venster verborgen is, wordt het venster in feite uitgeschakeld. Een verborgen venster kan berichten van het systeem of van andere vensters verwerken, maar kan geen invoer van de gebruiker verwerken of uitvoer weergeven. Een toepassing stelt de zichtbaarheidsstatus van een venster in bij het maken van het venster. Later kan de toepassing de zichtbaarheidsstatus wijzigen.
Er is een venster zichtbaar wanneer de stijl WS_VISIBLE is ingesteld voor het venster. De functie CreateWindowEx maakt standaard een verborgen venster, tenzij de toepassing de stijl WS_VISIBLE opgeeft. Normaal gesproken stelt een toepassing de stijl WS_VISIBLE in nadat het een venster heeft gemaakt om de details van het aanmaakproces verborgen te houden voor de gebruiker. Een toepassing kan bijvoorbeeld een nieuw venster verborgen houden terwijl het uiterlijk van het venster wordt aangepast. Als de stijl WS_VISIBLE is opgegeven in CreateWindowEx-, verzendt het systeem het WM_SHOWWINDOW bericht naar het venster na het maken van het venster, maar voordat het wordt weergegeven.
Een toepassing kan bepalen of een venster zichtbaar is met behulp van de functie IsWindowVisible. Een toepassing kan een venster weergeven (zichtbaar maken) of verbergen met behulp van de ShowWindow, SetWindowPos, DeferWindowPosof SetWindowPlacement of SetWindowLong functie. Met deze functies wordt een venster weergegeven of verborgen door de WS_VISIBLE stijl voor het venster in te stellen of te verwijderen. Ze verzenden ook het WM_SHOWWINDOW bericht naar het venster voordat ze het weergeven of verbergen.
Wanneer een eigenaarsvenster wordt geminimaliseerd, worden de bijbehorende vensters automatisch verborgen. Als een eigenaarsvenster wordt hersteld, worden in het systeem ook automatisch de bijbehorende vensters weergegeven. In beide gevallen verzendt het systeem het WM_SHOWWINDOW bericht naar de vensters in eigendom voordat ze worden verborgen of weergegeven. Soms moet een toepassing de vensters in eigendom verbergen zonder de eigenaar te minimaliseren of te verbergen. In dit geval gebruikt de toepassing de functie ShowOwnedPopups. Met deze functie wordt de WS_VISIBLE stijl voor alle vensters ingesteld of verwijderd en wordt het WM_SHOWWINDOW bericht naar de vensters in eigendom verzonden voordat u deze verbergt of weergeeft. Het verbergen van een eigenaarsvenster heeft geen invloed op de zichtbaarheidsstatus van de vensters in eigendom.
Wanneer een bovenliggend venster zichtbaar is, zijn de bijbehorende onderliggende vensters ook zichtbaar. Wanneer het bovenliggende venster is verborgen, worden de onderliggende vensters ook verborgen. Het minimaliseren van het bovenliggende venster heeft geen effect op de zichtbaarheidsstatus van de onderliggende vensters; Dat wil gezegd, worden de onderliggende vensters geminimaliseerd samen met het bovenliggende element, maar de WS_VISIBLE stijl wordt niet gewijzigd.
Zelfs als een venster de stijl WS_VISIBLE heeft, kan de gebruiker het venster op het scherm mogelijk niet zien; andere vensters kunnen het volledig overlappen of het is mogelijk buiten de rand van het scherm verplaatst. Daarnaast is een zichtbaar onderliggend venster onderworpen aan de regels voor knippen die zijn ingesteld door de relatie tussen bovenliggende en onderliggende items. Als het bovenliggende venster van het venster niet zichtbaar is, is het ook niet zichtbaar. Als het bovenliggende venster zich buiten de rand van het scherm verplaatst, wordt het onderliggende venster ook verplaatst omdat er een onderliggend venster wordt getekend ten opzichte van de linkerbovenhoek van het bovenliggende item. Een gebruiker kan bijvoorbeeld het bovenliggende venster met het onderliggende venster ver genoeg van de rand van het scherm verplaatsen dat de gebruiker het onderliggende venster mogelijk niet kan zien, ook al hebben het onderliggende venster en het bovenliggende venster beide de stijl WS_VISIBLE.
Geminimaliseerde, gemaximaliseerde en herstelde Windows
Een gemaximaliseerd venster is een venster met de stijl WS_MAXIMIZE. Standaard vergroot het systeem een gemaximaliseerd venster, zodat het het scherm vult of, in het geval van een onderliggend venster, het clientgebied van het bovenliggende venster. Hoewel de grootte van een venster kan worden ingesteld op dezelfde grootte van een gemaximaliseerd venster, is een gemaximaliseerd venster iets anders. Het systeem verplaatst de titelbalk van het venster automatisch naar de bovenkant van het scherm of naar de bovenkant van het clientgebied van het bovenliggende venster. Het systeem schakelt ook de formaatrand van het venster en de positie van het venster van de titelbalk uit (zodat de gebruiker het venster niet kan verplaatsen door de titelbalk te slepen).
Een geminimaliseerd venster is een venster met de stijl WS_MINIMIZE. Het systeem vermindert standaard een geminimaliseerd venster tot de grootte van de taakbalkknop en verplaatst het geminimaliseerde venster naar de taakbalk. Een hersteld venster is een venster dat is teruggezet naar de vorige grootte en positie, dat wil gezegd, de grootte die het was voordat het werd geminimaliseerd of gemaximaliseerd.
Als een toepassing de stijl WS_MAXIMIZE of WS_MINIMIZE in de functie CreateWindowEx opgeeft, wordt het venster in eerste instantie gemaximaliseerd of geminimaliseerd. Nadat u een venster hebt gemaakt, kan een toepassing de functie CloseWindow gebruiken om het venster te minimaliseren. De functie ArrangeIconicWindows rangschikt de pictogrammen op het bureaublad of rangschikt de geminimaliseerde onderliggende vensters van een bovenliggend venster in het bovenliggende venster. De functie OpenIcon herstelt een geminimaliseerd venster naar de vorige grootte en positie.
De functie ShowWindow kan een venster minimaliseren, maximaliseren of herstellen. Het kan ook de zichtbaarheids- en activeringsstatussen van het venster instellen. De functie SetWindowPlacement bevat dezelfde functionaliteit als ShowWindow-, maar kan de standaard geminimaliseerde, gemaximaliseerde en herstelde posities van het venster overschrijven.
De functies IsZoomed en IsIconic bepalen of een bepaald venster respectievelijk wordt gemaximaliseerd of geminimaliseerd. De functie GetWindowPlacement haalt de geminimaliseerde, gemaximaliseerde en herstelde posities voor het venster op en bepaalt ook de weergavestatus van het venster.
Wanneer het systeem een opdracht ontvangt om een geminimaliseerd venster te maximaliseren of te herstellen, wordt het venster een WM_QUERYOPEN bericht verzonden. Als de vensterprocedure FALSEretourneert, negeert het systeem de opdracht maximaliseren of herstellen.
Het systeem stelt automatisch de grootte en positie van een gemaximaliseerd venster in op de door het systeem gedefinieerde standaardwaarden voor een gemaximaliseerd venster. Als u deze standaardwaarden wilt overschrijven, kan een toepassing de SetWindowPlacement functie aanroepen of het WM_GETMINMAXINFO bericht verwerken dat door een venster wordt ontvangen wanneer het systeem het venster gaat maximaliseren. WM_GETMINMAXINFO bevat een aanwijzer naar een MINMAXINFO structuur met waarden die het systeem gebruikt om de maximale grootte en positie in te stellen. Als u deze waarden vervangt, worden de standaardwaarden vervangen.
Venstergrootte en -positie
De grootte en positie van een venster worden uitgedrukt als een begrenzingsrechthoek, gegeven in coördinaten ten opzichte van het scherm of het bovenliggende venster. De coördinaten van een venster op het hoogste niveau zijn relatief ten opzichte van de linkerbovenhoek van het scherm; de coördinaten van een onderliggend venster zijn relatief ten opzichte van de linkerbovenhoek van het bovenliggende venster. Een toepassing geeft de oorspronkelijke grootte en positie van een venster op wanneer het venster wordt gemaakt, maar kan de grootte en positie van het venster op elk gewenst moment wijzigen. Zie opgevulde shapesvoor meer informatie.
Deze sectie bevat de volgende onderwerpen:
- standaardgrootte en -positie
- trackinggrootte
- Systeemopdrachten
- functies grootte en positie
- berichten grootte en positie
Standaardgrootte en -positie
Met een toepassing kan het systeem de oorspronkelijke grootte of positie van een venster op het hoogste niveau berekenen door CW_USEDEFAULT op te geven in CreateWindowEx-. Als de toepassing de coördinaten van het venster instelt op CW_USEDEFAULT en geen andere vensters op het hoogste niveau heeft gemaakt, stelt het systeem de positie van het nieuwe venster in ten opzichte van de linkerbovenhoek van het scherm; anders wordt de positie ingesteld ten opzichte van de positie van het venster op het hoogste niveau dat de toepassing het laatst heeft gemaakt. Als de parameters voor breedte en hoogte zijn ingesteld op CW_USEDEFAULT, berekent het systeem de grootte van het nieuwe venster. Als de toepassing andere vensters op het hoogste niveau heeft gemaakt, baseert het systeem de grootte van het nieuwe venster op de grootte van het laatst gemaakte venster op het hoogste niveau van de toepassing. Als u CW_USEDEFAULT opgeeft bij het maken van een onderliggend of pop-upvenster, wordt de grootte van het venster ingesteld op de standaard minimale venstergrootte.
Traceringsgrootte
Het systeem behoudt een minimale en maximale traceringsgrootte voor een venster van de WS_THICKFRAME stijl; een venster met deze stijl heeft een grootterand. De minimale traceringsgrootte is de kleinste venstergrootte die u kunt produceren door de formaatrand van het venster te slepen. Op dezelfde manier is de maximale traceringsgrootte de grootste venstergrootte is die u kunt produceren door de rand van de grootte te slepen.
De minimum- en maximumgrootten van een venster worden ingesteld op door het systeem gedefinieerde standaardwaarden wanneer het systeem het venster maakt. Een toepassing kan de standaardinstellingen detecteren en overschrijven door het WM_GETMINMAXINFO bericht te verwerken. Zie Grootte- en positieberichtenvoor meer informatie.
Systeemopdrachten
Een toepassing met een venstermenu kan de grootte en positie van dat venster wijzigen door systeemopdrachten te verzenden. Systeemopdrachten worden gegenereerd wanneer de gebruiker opdrachten kiest in het venstermenu. Een toepassing kan de gebruikersactie emuleren door een WM_SYSCOMMAND bericht naar het venster te verzenden. De volgende systeemopdrachten zijn van invloed op de grootte en positie van een venster.
Bevelen | Beschrijving |
---|---|
SC_CLOSE | Hiermee sluit u het venster. Met deze opdracht wordt een WM_CLOSE bericht naar het venster verzonden. Het raam voert alle stappen uit die nodig zijn om zichzelf op te schonen en te vernietigen. |
SC_MAXIMIZE | Hiermee maximaliseert u het venster. |
SC_MINIMIZE | Hiermee wordt het venster geminimaliseerd. |
SC_MOVE | Hiermee verplaatst u het venster. |
SC_RESTORE | Hiermee herstelt u een geminimaliseerd of gemaximaliseerd venster naar de vorige grootte en positie. |
SC_SIZE | Hiermee start u een grootteopdracht. Als u de grootte van het venster wilt wijzigen, gebruikt u de muis of het toetsenbord. |
Grootte- en positiefuncties
Nadat u een venster hebt gemaakt, kan een toepassing de grootte of positie van het venster instellen door een van de verschillende functies aan te roepen, waaronder SetWindowPlacement, MoveWindow-, SetWindowPosen DeferWindowPos. SetWindowPlacement stelt de geminimaliseerde positie van een venster, gemaximaliseerde positie, herstelde grootte en positie in en geeft de status weer. De functies MoveWindow en SetWindowPos zijn vergelijkbaar; beide de grootte of positie van één toepassingsvenster instellen. De functie SetWindowPos bevat een set vlaggen die van invloed zijn op de weergavestatus van het venster; MoveWindow- bevat deze vlaggen niet. Gebruik de functies BeginDeferWindowPos, DeferWindowPosen EndDeferWindowPos functies om tegelijkertijd de positie van een aantal vensters in te stellen, waaronder de grootte, positie, positie in de z-volgorde en de status weergeven.
Een toepassing kan de coördinaten van de begrenzingsrechthoek van een venster ophalen met behulp van de functie GetWindowRect. GetWindowRect vult een RECT- structuur met de coördinaten van de linker- en rechterbenedenhoek van het venster. De coördinaten zijn relatief ten opzichte van de linkerbovenhoek van het scherm, zelfs voor een onderliggend venster. Met de functie ScreenToClient of MapWindowPoints worden de schermcoördinaten van de begrenzingsrechthoek van een onderliggend venster toegewezen aan coördinaten ten opzichte van het clientgebied van het bovenliggende venster.
Met de functie GetClientRect worden de coördinaten van het clientgebied van een venster opgehaald. GetClientRect vult een RECT- structuur met de coördinaten van de linker- en rechterbenedenhoek van het clientgebied, maar de coördinaten zijn relatief ten opzichte van het clientgebied zelf. Dit betekent dat de coördinaten van de linkerbovenhoek van een clientgebied altijd (0,0) zijn en dat de coördinaten van de rechterbenedenhoek de breedte en hoogte van het clientgebied zijn.
De functie CascadeWindows trapsgewijs de vensters op het bureaublad trapsgewijs of trapsgewijs de onderliggende vensters van het opgegeven bovenliggende venster trapsgewijs trapsgewijs. De TileWindows functietegels de vensters op het bureaublad of tegels de onderliggende vensters van het opgegeven bovenliggende venster.
Berichten grootte en positie
Het systeem verzendt het WM_GETMINMAXINFO bericht naar een venster waarvan de grootte of positie op het punt staat te veranderen. Het bericht wordt bijvoorbeeld verzonden wanneer de gebruiker klikt op Verplaatsen of Grootte in het venstermenu of op de rand of titelbalk klikt; het bericht wordt ook verzonden wanneer een toepassing SetWindowPos aanroept om het venster te verplaatsen of de grootte van het venster te wijzigen. WM_GETMINMAXINFO bevat een aanwijzer naar een MINMAXINFO structuur met de standaard gemaximaliseerde grootte en positie voor het venster, evenals de standaard minimum- en maximumgrootten voor bijhouden. Een toepassing kan de standaardinstellingen overschrijven door WM_GETMINMAXINFO te verwerken en de juiste leden van MINMAXINFOin te stellen. Een venster moet de stijl WS_THICKFRAME of WS_CAPTION hebben om WM_GETMINMAXINFOte ontvangen. Een venster met de stijl WS_THICKFRAME ontvangt dit bericht tijdens het proces voor het maken van vensters en wanneer het wordt verplaatst of het formaat ervan wordt aangepast.
Het systeem verzendt het WM_WINDOWPOSCHANGING bericht naar een venster waarvan de grootte, positie, positie in de z-volgorde of de weergavestatus op het punt staat te veranderen. Dit bericht bevat een aanwijzer naar een WINDOWPOS structuur waarmee de nieuwe grootte, positie, positie van het venster in de z-volgorde en de status wordt opgegeven. Door de leden van WINDOWPOSin te stellen, kan een toepassing van invloed zijn op de nieuwe grootte, positie en weergave van het venster.
Nadat u de grootte, positie, positie van een venster in de z-volgorde of de weergavestatus hebt gewijzigd, verzendt het systeem het WM_WINDOWPOSCHANGED bericht naar het venster. Dit bericht bevat een aanwijzer naar WINDOWPOS- die het venster informeert over de nieuwe grootte, positie, positie in de z-volgorde en de status weergeven. Het instellen van de leden van de WINDOWPOS structuur die wordt doorgegeven met WM_WINDOWPOSCHANGED heeft geen effect op het venster. Een venster dat WM_SIZE en WM_MOVE berichten moet verwerken, moet WM_WINDOWPOSCHANGED doorgeven aan de functie DefWindowProc; anders verzendt het systeem geen WM_SIZE en WM_MOVE berichten naar het venster.
Het systeem verzendt het WM_NCCALCSIZE bericht naar een venster wanneer het venster wordt gemaakt of een grootte heeft. Het systeem gebruikt het bericht om de grootte van het clientgebied van een venster en de positie van het clientgebied ten opzichte van de linkerbovenhoek van het venster te berekenen. Een venster geeft dit bericht doorgaans door aan de standaardvensterprocedure; Dit bericht kan echter handig zijn in toepassingen die het niet-clientgebied van een venster aanpassen of delen van het clientgebied behouden wanneer het venster de grootte heeft. Zie schilderij en tekeningvoor meer informatie.
Vensteranimatie
U kunt speciale effecten produceren bij het weergeven of verbergen van vensters met behulp van de functie AnimateWindow. Wanneer het venster op deze manier wordt geanimeerd, rolt, schuift of vervaagt het venster, afhankelijk van de vlaggen die u opgeeft in een aanroep naar AnimateWindow-.
Het systeem maakt standaard gebruik van roll animatie. Met dit effect lijkt het venster te worden geopend (met het venster) of rol gesloten (waarbij het venster wordt verborgen). U kunt de parameter dwFlags gebruiken om op te geven of het venster horizontaal, verticaal of diagonaal wordt gerold.
Wanneer u de vlag AW_SLIDE opgeeft, gebruikt het systeem diaanimatie. Met dit effect wordt het venster weergegeven om in beeld te schuiven (met het venster) of uit de weergave te schuiven (het venster verbergen). U kunt de parameter dwFlags gebruiken om op te geven of het venster horizontaal, verticaal of diagonaal schuift.
Wanneer u de vlag AW_BLEND opgeeft, gebruikt het systeem een alfa-blended fade.
U kunt ook de vlag AW_CENTER gebruiken om een venster naar binnen samen te vouwen of naar buiten uit te vouwen.
Vensterindeling en spiegeling
De vensterindeling definieert hoe tekst- en Windows Graphics Device Interface-objecten (GDI) worden ingedeeld in een venster of apparaatcontext (DC). Voor sommige talen, zoals Engels, Frans en Duits, is een indeling van links naar rechts (LTR) vereist. Voor andere talen, zoals Arabisch en Hebreeuws, is de indeling van rechts naar links (RTL) vereist. De vensterindeling is van toepassing op tekst, maar is ook van invloed op de andere GDI-elementen van het venster, waaronder bitmaps, pictogrammen, de locatie van de oorsprong, knoppen, trapsgewijze structuurbesturingselementen en of de horizontale coördinaat toeneemt wanneer u naar links of rechts gaat. Nadat een toepassing bijvoorbeeld een RTL-indeling heeft ingesteld, wordt de oorsprong aan de rechterkant van het venster of apparaat geplaatst en neemt het getal dat de horizontale coördinaat aangeeft toe wanneer u naar links navigeert. Niet alle objecten worden echter beïnvloed door de indeling van een venster. De indeling voor dialoogvensters, berichtvakken en apparaatcontexten die niet zijn gekoppeld aan een venster, zoals metabestand en printer-DC's, moeten bijvoorbeeld afzonderlijk worden verwerkt. Details voor deze worden verderop in dit onderwerp vermeld.
Met de vensterfuncties kunt u de vensterindeling opgeven of wijzigen in Arabische en Hebreeuwse versies van Windows. Houd er rekening mee dat het wijzigen van een RTL-indeling (ook wel spiegelen genoemd) niet wordt ondersteund voor vensters met de stijl CS_OWNDC of voor een domeincontroller met de GM_ADVANCED grafische modus.
De vensterindeling is standaard van links naar rechts (LTR). Als u de indeling van het RTL-venster wilt instellen, roept u CreateWindowEx- aan met de stijl WS_EX_LAYOUTRTL. Standaard heeft een onderliggend venster (een venster dat is gemaakt met de stijl WS_CHILD en met een geldige bovenliggende hWnd parameter in de aanroep naar CreateWindow of CreateWindowEx) dezelfde indeling als de bovenliggende parameter. Als u de overname van spiegeling naar alle onderliggende vensters wilt uitschakelen, geeft u WS_EX_NOINHERITLAYOUT op in de aanroep van CreateWindowEx-. Houd er rekening mee dat spiegeling niet wordt overgenomen door vensters die eigendom zijn van windows (die zijn gemaakt zonder de stijl WS_CHILD) of die zijn gemaakt met de bovenliggende hWnd-parameter in CreateWindowEx- ingesteld op NULL-. Als u de overname van spiegeling voor een afzonderlijk venster wilt uitschakelen, verwerkt u het WM_NCCREATE bericht met GetWindowLong en SetWindowLong om de WS_EX_LAYOUTRTL vlag uit te schakelen. Deze verwerking is een aanvulling op elke andere verwerking die nodig is. In het volgende codefragment ziet u hoe dit wordt gedaan.
SetWindowLong (hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))
U kunt de standaardindeling instellen op RTL door SetProcessDefaultLayout-(LAYOUT_RTL) aan te roepen. Alle vensters die na de aanroep zijn gemaakt, worden gespiegeld, maar bestaande vensters worden niet beïnvloed. Als u standaardspiegeling wilt uitschakelen, roept u SetProcessDefaultLayout(0) aan.
Houd er rekening mee dat SetProcessDefaultLayout alleen de DC's van gespiegelde vensters spiegelt. Als u een domeincontroller wilt spiegelen, roept u SetLayout-(hdc, LAYOUT_RTL) aan. Zie de discussie over spiegelingsapparaatcontexten die niet zijn gekoppeld aan vensters, die verderop in dit onderwerp worden besproken voor meer informatie.
Bitmaps en pictogrammen in een gespiegeld venster worden standaard ook gespiegeld. Deze moeten echter niet allemaal worden gespiegeld. Mensen met tekst, een bedrijfslogo of een analoge klok mogen bijvoorbeeld niet worden gespiegeld. Als u het spiegelen van bitmaps wilt uitschakelen, roept u SetLayout- aan met de LAYOUT_BITMAPORIENTATIONPRESERVED bit die is ingesteld in dwLayout-. Als u spiegeling in een DC wilt uitschakelen, roept u SetLayout(hdc, 0) aan.
Als u een query wilt uitvoeren op de huidige standaardindeling, roept u GetProcessDefaultLayout-aan. Na een geslaagde terugkeer bevat pdwDefaultLayout- LAYOUT_RTL of 0. Als u de indelingsinstellingen van de apparaatcontext wilt opvragen, roept u GetLayout-aan. Als het resultaat is geslaagd, retourneert GetLayout- een DWORD- die de indelingsinstellingen aangeeft door de instellingen van de LAYOUT_RTL en de LAYOUT_BITMAPORIENTATIONPRESERVED bits.
Nadat een venster is gemaakt, wijzigt u de indeling met behulp van de functie SetWindowLong. Dit is bijvoorbeeld nodig wanneer de gebruiker de taal van de gebruikersinterface van een bestaand venster wijzigt van Arabisch of Hebreeuws in het Duits. Wanneer u echter de indeling van een bestaand venster wijzigt, moet u het venster ongeldig maken en bijwerken om ervoor te zorgen dat de inhoud van het venster allemaal in dezelfde indeling wordt getekend. Het volgende codevoorbeeld is afkomstig uit voorbeeldcode waarmee de vensterindeling indien nodig wordt gewijzigd:
// Using ANSI versions of GetWindowLong and SetWindowLong because Unicode
// is not needed for these calls
lExStyles = GetWindowLongA(hWnd, GWL_EXSTYLE);
// Check whether new layout is opposite the current layout
if (!!(pLState -> IsRTLLayout) != !!(lExStyles & WS_EX_LAYOUTRTL))
{
// the following lines will update the window layout
lExStyles ^= WS_EX_LAYOUTRTL; // toggle layout
SetWindowLongA(hWnd, GWL_EXSTYLE, lExStyles);
InvalidateRect(hWnd, NULL, TRUE); // to update layout in the client area
}
Bij spiegeling moet u denken in termen van 'near' en 'far' in plaats van 'left' en 'right'. Als u dit niet doet, kan dit problemen veroorzaken. Een veelvoorkomende coderingspraktijk die problemen in een gespiegeld venster veroorzaakt, treedt op bij het toewijzen tussen schermcoördinaten en clientcoördinaten. Toepassingen gebruiken bijvoorbeeld vaak code die vergelijkbaar is met het volgende om een besturingselement in een venster te plaatsen:
// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW
// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);
// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left);
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);
Dit veroorzaakt problemen met spiegelen omdat de linkerrand van de rechthoek de rechterrand wordt in een gespiegeld venster en omgekeerd. Als u dit probleem wilt voorkomen, vervangt u de ScreenToClient--aanroepen door een aanroep naar MapWindowPoints als volgt:
// USE THIS FOR MIRRORING
GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)
Deze code werkt omdat op platforms die spiegeling ondersteunen, MapWindowPoints- wordt gewijzigd om de coördinaten van het linker- en rechterpunt te wisselen wanneer het clientvenster wordt gespiegeld. Zie de sectie Opmerkingen van MapWindowPointsvoor meer informatie.
Een andere veelvoorkomende procedure die problemen in gespiegelde vensters kan veroorzaken, is het positioneren van objecten in een clientvenster met behulp van offsets in schermcoördinaten in plaats van clientcoördinaten. De volgende code gebruikt bijvoorbeeld het verschil in schermcoördinaten als de x-positie in clientcoördinaten om een besturingselement in een dialoogvenster te plaatsen.
// OK if LTR layout and mapping mode of client is MM_TEXT,
// but WRONG for a mirrored dialog
RECT rdDialog;
RECT rcControl;
HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog); // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
rcControl.left - rcDialog.left, // uses x position in client coords
rcControl.top - rcDialog.top,
nWidth,
nHeight,
FALSE);
Deze code is prima wanneer het dialoogvenster de indeling van links naar rechts (LTR) heeft en de toewijzingsmodus van de client MM_TEXT, omdat de nieuwe x-positie in clientcoördinaten overeenkomt met het verschil in linkerranden van het besturingselement en het dialoogvenster in schermcoördinaten. In een gespiegeld dialoogvenster worden links en rechts echter omgekeerd, dus in plaats daarvan moet u MapWindowPoints als volgt gebruiken:
RECT rcDialog;
RECT rcControl;
HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);
// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);
// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)
Dialoogvensters en berichtvakken spiegelen
Dialoogvensters en berichtvakken nemen de indeling niet over, dus u moet de indeling expliciet instellen. Als u een berichtvak wilt spiegelen, roept u MessageBox of MessageBoxEx aan met de optie MB_RTLREADING. Als u een dialoogvenster van rechts naar links wilt indelen, gebruikt u de uitgebreide stijl WS_EX_LAYOUTRTL in de sjabloonstructuur van het dialoogvenster DLGTEMPLATEEX-. Eigenschappenvensters zijn een speciaal geval van dialoogvensters. Elk tabblad wordt behandeld als een afzonderlijk dialoogvenster, dus u moet de WS_EX_LAYOUTRTL stijl opnemen in elk tabblad dat u wilt spiegelen.
Apparaatcontexten spiegelen die niet zijn gekoppeld aan een venster
DC's die niet zijn gekoppeld aan een venster, zoals metabestand of printer-DC's, nemen de indeling niet over. Daarom moet u de indeling expliciet instellen. Als u de indeling van de apparaatcontext wilt wijzigen, gebruikt u de functie SetLayout.
De functie SetLayout wordt zelden gebruikt met vensters. Normaal gesproken ontvangen Windows alleen een gekoppelde domeincontroller bij het verwerken van een WM_PAINT bericht. Af en toe maakt een programma een DC voor een venster door GetDC-aan te roepen. In beide gevallen wordt de initiële indeling voor de domeincontroller ingesteld door BeginPaint- of GetDC- volgens de WS_EX_LAYOUTRTL vlag van het venster.
De waarden die worden geretourneerd door GetWindowOrgEx, GetWindowExtEx, GetViewportOrgEx en GetViewportExtEx worden niet beïnvloed door het aanroepen van SetLayout-.
Wanneer de indeling RTL is, retourneert GetMapMode MM_ANISOTROPIC in plaats van MM_TEXT. Het aanroepen van SetMapMode met MM_TEXT werkt correct; alleen de retourwaarde van GetMapMode wordt beïnvloed. Op dezelfde manier zorgt het aanroepen van SetLayout(hdc, LAYOUT_RTL) wanneer de toewijzingsmodus is MM_TEXT ervoor zorgt dat de gerapporteerde toewijzingsmodus wordt gewijzigd in MM_ANISOTROPIC.
Venstervernietiging
Over het algemeen moet een toepassing alle vensters vernietigen die het maakt. Dit doet u met behulp van de DestroyWindow functie. Wanneer een venster wordt vernietigd, verbergt het systeem het venster, als het zichtbaar is en verwijdert het vervolgens eventuele interne gegevens die aan het venster zijn gekoppeld. Hierdoor wordt de venstergreep ongeldig, die niet meer door de toepassing kan worden gebruikt.
Een toepassing vernietigt veel van de vensters die het maakt kort na het maken ervan. Een toepassing vernietigt bijvoorbeeld meestal een dialoogvenstervenster zodra de toepassing voldoende invoer van de gebruiker heeft om door te gaan met de taak. Een toepassing vernietigt uiteindelijk het hoofdvenster van de toepassing (voordat de toepassing wordt beëindigd).
Voordat een venster wordt vernietigd, moet een toepassing alle gegevens die aan het venster zijn gekoppeld, opslaan of verwijderen en moet deze systeembronnen vrijgeven die voor het venster zijn toegewezen. Als de toepassing de resources niet vrijgeeft, maakt het systeem resources vrij die niet door de toepassing worden vrijgemaakt.
Het vernietigen van een venster heeft geen invloed op de vensterklasse van waaruit het venster wordt gemaakt. Er kunnen nog steeds nieuwe vensters worden gemaakt met die klasse en alle bestaande vensters van die klasse blijven werken. Het vernietigen van een raam vernietigt ook de afstammelingsvensters van het raam. De DestroyWindow- functie verzendt eerst een WM_DESTROY bericht naar het venster en vervolgens naar de onderliggende vensters en onderliggende vensters. Op deze manier worden alle afstammelingsvensters van het raam dat wordt vernietigd ook vernietigd.
Een venster met een venstermenu ontvangt een WM_CLOSE bericht wanneer de gebruiker op sluiten klikt. Door dit bericht te verwerken, kan een toepassing de gebruiker om bevestiging vragen voordat het venster wordt vernietigd. Als de gebruiker bevestigt dat het venster moet worden vernietigd, kan de toepassing de DestroyWindow functie aanroepen om het venster te vernietigen.
Als het venster dat wordt vernietigd het actieve venster is, worden zowel de actieve als de focusstatussen overgebracht naar een ander venster. Het venster dat het actieve venster wordt, is het volgende venster, zoals wordt bepaald door de toetsencombinatie Alt+ESC. Het nieuwe actieve venster bepaalt vervolgens welk venster de toetsenbordfocus ontvangt.