[VB.Net] Location van controls

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Moi_in_actie
  • Registratie: Maart 2007
  • Laatst online: 23:13
Hallo mede-tweakers,

Ik zit met een klein probleempje met betrekking tot het bepalen van locaties bij controls. Om even de situatie te schetsen, ik ben een GUI aan het ontwerpen waarin in het hoofdscherm verschillende Usercontrols worden ingeladen. Deze Usercontrols zijn bij aanvang leeg en afhankelijk van welke pagina er geopend dient te worden, wordt de Usercontrol gevuld. Het vullen van deze Usercontrol gaat als volgt: er bevindt zich altijd een FlowLayoutPanel op de Usercontrol. Hierin worden een soort panels geladen, wat een eigen custom control van mij is. Deze custom control kan gevuld worden met alle UI elementen die ik maar wil, vooraf ergens opgeslagen of niet. Ook kunnen er weer zo'n custom control (panel) in een custom control worden geladen (subpanels). Dit werkt allemaal prima.

Mijn probleem komt bij het resizen van deze elementen. Mijn custom controls zijn panels die kunnen inklappen en uitklappen, waardoor de hoogte veranderd. Als een subpanel uitklapt kan het zijn dat door de nieuwe hoogte ervan, deze hoger wordt (Y locatie binnen het parent panel + hoogte panel) dan het parent panel. Daarom zijn deze panels ook in staat om aangepast te worden en anderen aan te passen.
Als voorbeeld: subpanel 1.2 in parentpanel 1 is 100 pixels hoger geworden en daardoor vallen 30 pixels buiten het parentpanel. Het subpanel vraagt dan aan het parentpanel of deze zich kan/wil aanpassen. Hier zijn wel nog wat beperkingen aan, zoals een max hoogte die niet mag worden overschreven. Zou de max hoogte van het parent panel overschreven worden, wordt de hoogte gelijk gesteld aan de max en komt er een scrollbalk.

Om dit alles goed te laten werken moet ik de locaties van beide elementen met elkaar kunnen vergelijken. Bij beide elementen de .Location opvragen heeft geen zin, omdat dat alleen de locatie t.o.v. diens parent wordt gegeven. Hierbij moet ook gesteld worden dat een subPanel niet direct het child is van het parentPanel. Het subPanel zit namelijk weer in een FlowLayoutPanel, die bijvoorbeeld ook nog in een GroupBox zit, die dan uiteindelijk het echte "child" is van het parentPanel.
Er zijn methoden als .PointToScreen en .PointToClient. Deze heb ik al geprobeerd te gebruiken, maar de waardes kloppen niet. Bijvoorbeeld:

Dim posL1 As Point = parentPanel.PointToClient(subPanel.Location)
of
Dim posL1 As Point = parentPanel.PointToClient(New Point(0, 0))
Dim posL2 As Point = subPanel.PointToClient(New Point(0, 0))

Met behulp van de (verschillen in) locaties, hoogtes van de elementen en de max hoogtes wordt dan het parentPanel aangepast. Echter geeft dit vaak rare waardes. De ene keer als ik via .PointToScreen of .PointToClient van beide elementen hun locatie opvraag, krijg ik een gelijke X-waarde. Dit is echter onmogelijk, aangezien het parentPanel over de volledige breedte loopt (begint bij X = 0) en het subPanel rechts staat uitgelijnd in het parentPanel (bijvoorbeeld bij ongeveer X = 400).
Gebruik ik de 2e optie (vergelijken met (0,0)) dan kloppen deze X-waarden wel, alleen gaat het daar soms fout met de Y-waarden. Zo bijvoorbeeld bij 4 subPanels die onder elkaar (in een FlowLayoutPanel) staan in het parentPanel gaat het bij 3 panels goed, maar het 4e panel totaal niet.

Kortom, ik heb het idee dat de .PointToScreen en .PointToClient methoden niet echt lekker werken. 2 elementen direct met elkaar vergelijken via AA.PointToScreen(BB) werkt gewoon niet (zou de makkelijkste methode zijn). Iemand hier enige ervaring mee of iemand die een goed alternatief weet?

Bvd.

Ryzen 9 9950X3D ~~ 32GB GSkill TridentZ 6000Mhz ~~ ASRock B850M Steel Legend ~~ Powercolor Hellhound RX9070XT