[.net] 2 tekeningen over elkaar, hoe 1 van de 2 refreshen?

Pagina: 1
Acties:

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 00:44
Ik ben bezig met het bouwen van een previewpanel waarin ik een overzicht kan zien van de geladen kaarten in een geografisch informatie systeem.

Afbeeldingslocatie: http://www.xs4all.nl/~stiege/jeroen/GoT/mapviewer.jpg

De bitmap in de previewpanel is een snapshot van het ActiveX component in het midden van het scherm, waarbinnen alle geladen kaarten vallen.

De rode border in het midden van de previewmap stelt de weergave van de hoofdpanel voor. Als ik deze wil verslepen, dan moet de rode lijn opnieuw getekend worden.

Zoals ik het nu heb geimplementeerd schokt het previewkaartje gigantisch als ik de rode border versleep. Dit komt omdat de bitmap achtergrond ook op het Graphics object van de panel is getekend, en telkens gerefreshed wordt. Dit is noodzakelijk, omdat de rode border ook opnieuw getekend moet worden.

Nu heb ik geprobeerd om de bitmap als achtergrond (panel.BackGroundImage) te laden, maar dit geeft de volgende problemen:
- De bitmap moet precies in het midden van de panel getekend worden, dat betekent dat ik een nieuwe bitmap moet creëren met precies dezelfde afmetingen als de panel, met als gevolg een weergave die alles behalve vloeiend verloopt bij het resizen
- Wanneer de preview panel geresized wordt, moet de bitmap opnieuw gecreëerd worden, omdat deze zo groot mogelijk op de panel weergegeven dient te worden, maar in de juiste proporties. Wanneer deze bitmap als achtergrond wordt geladen, zie je een fractie van een seconde een kopie van de bitmap naast de previewbitmap liggen. Dat komt omdat een achtergrondbitmap niet éénmaal op het scherm wordt geplaatst, maar oneindig vaak naast elkaar en onder elkaar.

De bitmap als backgroundimage laden is dus geen optie.

Ik ben op zoek naar een oplossing waarbij ik alleen de rode border hoef te refreshen, en dus niet de bitmap. Ik zat te denken om twee panels over elkaar heen te tekenen, waarvan de bovenste een opacity heeft van 0%, maar helaas kun je geen panel afzonderlijk de opacity van instellen.

Wie weet een mogelijkheid om twee verschillende graphics objecten bij te houden, die over elkaar liggen, zodat ik de bitmap of de border afzonderlijk kan refreshen?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Afzonderlijk refreshen kan volgens mij niet met het standaard .NET framework.

Je zou er zelf natuurlijk wel wat voor kunnen maken, of er zullen vast wel standaard components voor je zijn.

Maar ik denk dat je zelf een leuke workaround kan bedenken.

[ Voor 54% gewijzigd door pjvandesande op 22-09-2004 15:27 ]


Verwijderd

Wat dacht je van double buffering van het achtergrondplaatje en het rode lijntje er aan het eind van elke paint (of hoe het ook heet in .net) ongebufferd overheen te tekenen? Weet het niet hoor, maar lijkt mij dat dat sowieso sneller moet gaan (als je dat niet al doet).

Aangezien je over graphics objecten praat neem ik aan dat je ook double buffering kent maar voor het geval dat:

http://windowsforms.net/articles/windowsformspainting.aspx

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Teken geen RODE border, maar een XOR border. Op die manier teken je de 1e keer de border om hem weer te geven en de 2e keer dezelfde border om hem weer weg te halen.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Als je een beetje aan het painten gaat, heb je er vrij snel last van knipperende plaatjes.
Ik teken meestal in een userControl o.i.d. en zet dan deze code in de New
code:
1
2
3
 Me.SetStyle(Windows.Forms.ControlStyles.UserPaint, True)
 Me.SetStyle(Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
 Me.SetStyle(Windows.Forms.ControlStyles.DoubleBuffer, True)


Dit zorgt voor het double-bufferen en de rest kan je hetzelfde laten.
Er zijn ook wel voorbeelden te vinden over het tekenen van selectierectangle; meestal onder de naam "Rubberband".

Misschien handig:
http://www.codeproject.com/dotnet/rubberbandline.asp
http://www.codeproject.com/vb/net/EnPicbox.asp

[ Voor 3% gewijzigd door MrSleeves op 23-09-2004 12:55 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services