[c#]verplaatsen van venster laat zwart blok achter

Pagina: 1
Acties:

  • Magic
  • Registratie: September 2001
  • Niet online
Ik heb de volgende situatie:

ik heb een simpel programmatje gemaakt dat moet docken aan de zijkant van het scherm (links of rechts). tot zover geen probleem. ik haal bij het starten de schermresolutie op, en laat hem aan de hand daarvan de positie berekenen. ik laat hem een stuk uit het scherm steken, zodat hij bij een "MainFormMouseEnter" zijn lokatie weer naar het midden schuift. bij een "MainFormMouseLeave" schuift hij weer terug, totdat er nog een paar pixels van het programma te zien zijn.

nou het volgende probleem:
als hij weer terugschuift, laat hij een zwart blok achter op de plek waar hij vandaan kwam. Het blok verdwijnt als het programma klaar is met schuiven. als ik het venster gedeeltelijk transparant maak (wat uiteindelijk ook de bedoeling is), dan is het probleem er niet, maar dan schuift hij een stuk trager.

ik gebruik de volgende code om te positioneren:
C#:
1
2
3
4
{
    this.Left = schermbreedte-5;
    this.Top= 200;
}


en de volgende code om te schuiven:
C#:
1
2
3
4
5
6
7
if (this.radioButton.Checked )
{
    for (int t=0; t < this.Width-1; t++)
    {
               this.Left++;
    }
}


heb ik met deze code de draad compleet mis geschoten? of zie ik wat over het hoofd? is er misschien een meer efficiente methode?

[ Voor 13% gewijzigd door Magic op 28-01-2004 16:01 ]

Steam: Brainfrz82 | PSN: Brainfrz | Discord: Brainfrz


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

Klein tikje naar Programming & Webscripting

[ Voor 27% gewijzigd door moto-moi op 28-01-2004 16:03 ]

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Roep je die code vanuit een aparte thread aan? Want zoiets hoor je ten eerste vanuit het message-thread te doen, maar als je dat op deze manier doet dan krijgt hij pas de gelegenheid om netjes te tekenen zodra je met het schuiven klaar bent.

Een oplossing dat ik denk: gebruik een timer met korte tussenpozen en elke keer dat die timer een tick geeft, schuif het ding een paar pixels op.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Magic
  • Registratie: September 2001
  • Niet online
Infinitive schreef op 28 januari 2004 @ 16:08:
Roep je die code vanuit een aparte thread aan? Want zoiets hoor je ten eerste vanuit het message-thread te doen
euhm, ikke niet begrijp, ik ben geen programmeer-guru, kun je er wat meer over vertellen of heb je misschien een linkje met wat info daarover? google levert niet echt bevredigende resultaten op zoekthermen "c# message thread". hij gaat dan namelijk forum-threads over c# weergeven.
Een oplossing dat ik denk: gebruik een timer met korte tussenpozen en elke keer dat die timer een tick geeft, schuif het ding een paar pixels op.
dat is misschien wel een oplossing ja. ik probeer het zodra ik weer thuis ben.

[ Voor 4% gewijzigd door Magic op 28-01-2004 16:15 ]

Steam: Brainfrz82 | PSN: Brainfrz | Discord: Brainfrz


Verwijderd

Zou Application.DoEvents al niet voldoende zijn in de loop?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Verwijderd schreef op 28 januari 2004 @ 16:15:
Zou Application.DoEvents al niet voldoende zijn in de loop?
Dat zou een oplossing zijn idd, als het probleem wat ik dacht ook echt het probleem is. Maar om te zeggen dat dat zo'n mooie oplossing is... je bent dan de controle kwijt over hoe snel je venstertje naar rechts schuift. Als je een snelle processor hebt, dan zie je het niet eens. Ik zou dus zo wie zo voor een timer kiezen.

Over die message-thread (ook wel "event"-thread): helaas heb ik op het moment niet voldoende tijd (tentamens ;( ) om er veel over te zeggen, maar misschien dat iemand anders je daar een paar pointers over kan geven.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Maar dat kan je toch ook zonder timer component oplossen?

Gewoon:

code:
1
2
int i = 100;
Thread.Sleep(i);

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Het probleem is inderdaad dat je de messagepump blokkeert, en in principe is het een valide oplossing om DoEvents aan te roepen tijdens iedere iteratie (plus een call naar Thread.Sleep(20) om het op 50fps continu te laten lopen).

Netste manier is echter om er een state machine van te maken, die middels een timer de huidige state (Expanded, Expanding, Collapsing, Collapsed) checked en dan 50 keer per seconde indien hij in een ...ing state verkeert de Left te bewegen richting de eindpositie. Op deze manier kun je namelijk halverwege het collapsen weer gaan expanden, heb je geen blocking loops en heb je een strak statemodel dat ervoor zorgt dat je applicatie zelfs clickable/scrollable etc. doorwerkt tijdens het moven :)

Professionele website nodig?

Pagina: 1