[WinApi, C(++)] Veranderen owner van een Top Level window

Pagina: 1
Acties:

  • Xymox
  • Registratie: Februari 2002
  • Laatst online: 18-11 15:00

Xymox

Determinism rulez !

Topicstarter
Ik zoek een manier om de owner van een Top Level window aan te passen.

Het betreft het volgende:

Als een Top Level window wordt aangemaakt met CreateWindow is het mogelijk een parentwindow op te geven in de parameters. Dit zorgt ervoor dat het window "owned" wordt. Er zal geen icon in de taskbar verschijnen en zodra de parent (owner window) gesloten wordt zal automatisch het owned window ook afgesloten worden.
Verder zal het owned window altijd weergegeven worden boven de owner in de Z order. Andere windows met dezelfde owner zullen met elkaar een eigen Z order hebben.

Stel ik heb deze situatie (allemaal Top Level Windows) :

Window1 : CreateWindow( ...., NULL, ....)
Window2 : CreateWindow( ...., NULL, ....)
Window3 : CreateWindow( ...., Window1, ....)

Window1 is de owner van Window3. Er zijn slechts twee taskbar icons zichtbaar (Window1 en Window2).

Wat ik probeer uit te vogelen is het aanpassen van de owner van Window2 zodat deze net als Window3 aan Window1 hangt.

De enige WinApi functie die iets met een parent van een window doet is SetParent( Window, Parent )

SetParent( Window2, Window1 )

Echter zorgt deze functie ervoor dat er geen owner/owned relatie wordt aangelegd tussen de windows, maar een Parent/Child relatie.

Dit houdt in dat Window2 een child wordt van Window1. Het window kan alleen weergegeven worden binnen de boundaries van de client area van Window1 en zal altijd "on top" boven het parent window staan. Er kunnen geen andere windows tussen komen.
Dus eigenlijk net als childwindows (buttons, datafields etc) "geplakt" zitten op hun parent window.
Window3 zal hiermee dus altijd boven Window2 weergegeven worden.

SetParent lijkt mij dus niet de manier.

Vreemde is dat Windows geen enkele manier heeft om de owner aan te passen (ik zou naast een SetParent een SetOwner functie verwachten).

Wellicht wil ik iets dat echt niet mogelijk is, maar voordat ik het opgeef zou ik graag hier wat WinApi freaks willen vragen of het wel dan niet mogelijk is.

Wellicht is het aanpassen van het systeem die de Z order beheerd een optie ? Misschien de onderliggende attributen (SetWindowLong) aanpassen ?

Hoe dan ook, een oplossing zou ervoor moeten zorgen dat van een window nadat het aangemaakt is de owner aangepast kan worden. Er zou dan (visueel) geen verschil moeten zijn tussen :

Window2 = CreateWindow( ..., Window1, .... )

en

Window2 = CreateWindow( ..., NULL, .... )
SetOwner( Window2, Window1 )


Tips of suggesties zijn erg welkom.

Intel i9-9900K | MSI MPG Z390 Gaming Pro Carbon | MSI RTX 2080Ti Gaming X Trio | Ballistix Sport LT (32GB) | MSI Optix MAG274QRF-QD 1440p | Samsung 970 EVO Plus (2TB) | NZXT Kraken X52 | Valve Index | Fractal Design R6 | Synology DS420j


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom wil je de owner eigenlijk wijzigen?
After creating an owned window, an application cannot transfer ownership of the window to another window

[ Voor 68% gewijzigd door .oisyn op 15-01-2007 01:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xymox
  • Registratie: Februari 2002
  • Laatst online: 18-11 15:00

Xymox

Determinism rulez !

Topicstarter
.oisyn schreef op maandag 15 januari 2007 @ 01:27:
Waarom wil je de owner eigenlijk wijzigen?


[...]
- Om het window van de taakbalk te halen (ik wil één entry daar hebben zodat als je daar op klikt alle owned windows naar voren komen
- Het window mee te laten doen met alle owned windows in hun onderlinge Z order (gelijk aan de Z order wanneer je het window bij creatie wel de owner had opgegeven). De owner blijft dan altijd onder de owned windows in de Z oder staan. Klikken op de owner haalt dan dus alle owned window naar voren en worden boven de owner weergegeven.
- Het window automatisch laten sluiten als de owner gesloten wordt

Je quote heb ik inderdaad ook gelezen en op internet nergens een oplossing kunnen vinden. Lijkt erop dat een simpele wijziging van owner niet mogelijk is (terwijl het wel mogelijk is een veel rigoureuze wijziging van een parent te doen).

Intel i9-9900K | MSI MPG Z390 Gaming Pro Carbon | MSI RTX 2080Ti Gaming X Trio | Ballistix Sport LT (32GB) | MSI Optix MAG274QRF-QD 1440p | Samsung 970 EVO Plus (2TB) | NZXT Kraken X52 | Valve Index | Fractal Design R6 | Synology DS420j


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Xymox schreef op maandag 15 januari 2007 @ 07:43:
[...]


- Om het window van de taakbalk te halen (ik wil één entry daar hebben zodat als je daar op klikt alle owned windows naar voren komen
- Het window mee te laten doen met alle owned windows in hun onderlinge Z order (gelijk aan de Z order wanneer je het window bij creatie wel de owner had opgegeven). De owner blijft dan altijd onder de owned windows in de Z oder staan. Klikken op de owner haalt dan dus alle owned window naar voren en worden boven de owner weergegeven.
- Het window automatisch laten sluiten als de owner gesloten wordt
Dat snap ik allemaal, maar waarom creëer je de window dan niet gewoon met een owner? Mijn vraag was: waarom wil je 'm wijzigen, niet waarom je die window owned wil hebben ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xymox
  • Registratie: Februari 2002
  • Laatst online: 18-11 15:00

Xymox

Determinism rulez !

Topicstarter
.oisyn schreef op maandag 15 januari 2007 @ 13:00:
[...]

Dat snap ik allemaal, maar waarom creëer je de window dan niet gewoon met een owner? Mijn vraag was: waarom wil je 'm wijzigen, niet waarom je die window owned wil hebben ;)
Omdat de owner op het moment van creatie van het window nog niet bekend (gecreerd is).
Zodra de owner in de lucht komt moeten alle windows die dat window als owner willen hebben omgehangen worden.

Het is een valide vraag die je stelt. Echter is de reden waarom ik het nodig heb hetzelfde als de reden waarom je de functie SetParent nodig zou moeten hebben : het omhangen van parents / owners nadat het window gecreerd is.

Intel i9-9900K | MSI MPG Z390 Gaming Pro Carbon | MSI RTX 2080Ti Gaming X Trio | Ballistix Sport LT (32GB) | MSI Optix MAG274QRF-QD 1440p | Samsung 970 EVO Plus (2TB) | NZXT Kraken X52 | Valve Index | Fractal Design R6 | Synology DS420j