Sida 1 av 1

Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 13:44:55
av sodjan
Hej.
Jag vet att det finns många duktiga programmerare här så jag tänkte
fråga här efter två dagars googlande och testande... :-)

Sitter och hjälper grabben med ett vb.net projekt. Ett "vanligt" Windows program.

Vi använder: Visual Studio Express 2013 for Windows Desktop

En form har en bakgrundsbild (inlagd vid design) och sedan ett 20 tal
buttons och text labels. Problemet är att när Windows visar/öppnar formen
så görs det först "hål" i bakgrundsbilden där de olika buttons och labels ska vara.
Dessa "hål" får samma färg som den bakgrund som fanns där innan, antingen
t.ex färgen från skrivbordet eller t.ex text från en websida, om formen öppnades
"framför" en websidan. Det går rellativ fort innan rätt knappar och labels fylls i,
men det hela "blinkar" ganska störande.

Man kan notera att det på min maskin (Win7) så är det föregående bakgrund
som syns genom "hålen". På grabbens Win8.1 maskin så verkar det alltid
bli helt vita rutor, så det är inte helt konsekvent...


Efter googling har vi provat olika "lösningar" som t.ex.
- DoupleBuffering = True (även satt direkt i properties istället för i Load() event.
- SuspendLayout/ResumeLayout

Alla dessa i Load() event, men problemet verkar uppträda innan man kommer
så långt, inget av ovanstående gjorde i alla fall någon skillnad.

Det vore bättre (mindre störande) om Windows inte reserverar (gör hål)
i bakgrundsbilden för de objekt som ska skrivas dit, men just det har jag
inte hittat något sätt att undvika (ställa in).

En sak som vi inte har testat är att sätta alla objekt till visible=False vid
design och sedan ändra till True efter att formen är laddad...

Projektet är skapat som en "Windows Forms". Det finns även "WPF"
som ett alternativ, inget som vi har provat eller testat...

Man kan även notera att man får samma fenomen om man bara minimerar
och sedan återställer fönstret, det verkar alltså ha med hur Windows "ritar",
inte med vb.net som sådant (?).

Hur som helst, om någon som har sett detta fenomen (och hittat en lösning)
så är jag väldigt intresserad... :-)

/Janne.

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 13:51:57
av lgrfbs
"Man kan även notera att man får samma fenomen om man bara minimerar
och sedan återställer fönstret, det verkar alltså ha med hur Windows "ritar",
inte med vb.net som sådant (?)."

Jepp det hänger ihop med drivrutinen för att rita upp objekt på Windows cavans, typ.
Jag hade provat med att lägga "refresh" direkt i onShow eventet vilket gör att det objektet måste ritas om direkt.

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 14:09:37
av sodjan
OK.
Ja, känslan är att det inte finns något att göra i själva vb.net koden åt problemet.

Om man helt tar bort bakgrundsbilden som täcker hela formen, så fungerar allt
mycket bättre, även ifyllnaden av alla buttons och labels går då "direkt"...

Jag lyckades trycka "Print screen" medan effekten syns, se nedan. Någon
halvsekund senare är värderna ifyllda, se andra bilden. Jag positionerade
formen så att bakgrunden skulle kännas igen... :-)

Det vore som sagt helt acceptabelt om rutorna inte "reserverades" utan
bara skrevs över när objektet sedan ritas. Att det tar någon halvsekund
gör ingenting, det är "blinkningen" som stör...

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 14:49:38
av Micke_s
Man kan ju skapa knapparna/fälten när onload kör för formuläret. Eventuellt så räcker det med att köra "hidden" på knapparna "default" och visa dessa vid onload...

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 15:14:07
av sodjan
Ja, vi har diskuterat det och kanske tar och provar.
Men fenomenet dyker ju även upp när form'en ligger "vilande" på
skärmen medan och man t.ex kollar något i browsern. När browsern
stängs ner så får man samma fenomen utan att den aktuella form'en
har varit "nere" eller "stängd", den har bara varit i bakgrunden ett tag.

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 15:25:00
av opatagio
Är inte så att det är "tunga" bilder? Testa en bild i samma pixelstorlek med enbart en färg, grå eller blå, och se om det blir samma fenomen?

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 15:38:39
av sodjan
När det gäller bakgrundsbilden så gjorde vi en med lägre färgdjup
och även en enfärgad. Samma fenomen. Vi har inte provat med
annat filformat än JPG, i och för sig. Kanske ett enklare okomprimerat
format (GIF?) är "snabbare".

Håller på och installerar Express 2013 for Windows Desktop för
att köra lite egna tester...

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 16:54:24
av lgrfbs
Prova *.BMP det är det som brukar vara vanligast när det är bakgrunder och ikoner inom program. Det är i alla fall vad jag har upplevt.

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 17:35:32
av sodjan
Ja, vi får nog testa det också.
Har just fått igång det hela på min laptop och försöker
göra ett testprogram (med WPF) så får vi se... :-)

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 18:06:28
av tecno
Testat med .png?

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 18:34:50
av sodjan
:-) Nej, vi har enbart kört med JPG, so far... :-)

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 21:06:17
av Andax
Nu har jag inte kört vb men har för mig att man kan override någon erase metod och låta den inte göra något. Troligtvis kräver dina knappar i då fall denna basklass med den överridna metoden.

Re: Blinkning då vb.net öppnar en form med bakgrundbild...

Postat: 9 juli 2015, 21:09:16
av sodjan
Update...
Har nu gjort samma test app (en enkel form med bakgrundsbild med 60-70 "buttons")
byggt både med "Forms" och "WPF". Det är mycket bättre prestanda WPF lösningen.

Samtidigt hittade grabben en lösning i "Forms" som med en kombination av
hide, show och speciellt DoEvents på rätt ställe, gjorde att bytet av bild
fördröjdes tills alla objekt var renderade. Inget blink, som det ser ut.

Samtidigt så är väl WPF "framtiden", så att säga...