Avatar billede challenge Praktikant
09. marts 2011 - 21:20 Der er 7 kommentarer og
1 løsning

WIn32 SetWindowPos animeret

Hej,

Dette spørgsmål relaterer sig til Win32, og i mindre grad C/C++.

Jeg har i et vindue defineret en ComboBox som jeg subclasser for at trappe CBN_SELCHANGE-beskeden. Jeg gør dette, da jeg ønsker, at brugeren i princippet skal kunne vælge vinduets størrelse, ud fra valget i ComboBoxen. Jeg ønsker imidlertid også, at transitionen mellem vinduestørrelser skal være animeret. Jeg gør derfor dét, at jeg looper igennem en SetWindowPos() og en Sleep(), eks.:
for(int i = 1; i < 400; i++)
{
    SetWindowPos(hWndParent, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom + i, SWP_DRAWFRAME);
    Sleep(1);
}

Dette er blot et eksempel og ikke taget ud fra min kode.
Dette virker imidlertid også fint, dog til et vist punkt - Jeg kan ændre i min ComboBox' selection et par gange, hvor det virker efter hensigten - vinduets størrelse ændrer sig i en animeret facon. Ændrer jeg dog i ComboBoxens selection omkring otte gange, crasher rendering af programmet totalt. Animationen vil typisk stoppe og freexe midt i en transition. Bevæger jeg vinduet bliver vinsuets title bar farvet hvid. Jeg kan generelt ikke bruge programmet, og det reagerer ikke på mine musse-input.

Jeg ved at det er et wild shot, men er der nogen der mon skulle have erfaring med noget lignende?

Jeg kører Windows 7, 64-bit.
Avatar billede bertelbrander Praktikant
09. marts 2011 - 22:00 #1
Det er noget af det der er lidt svært at få til at køre ordentligt ude i virkeligheden...

Jeg ville nok starte med at kikke på nogle af flagene til SetWindowPos, først og fremmest SWP_NO* og se om jeg kan få det til at virke bedre på den måde.

Men det er sjældent en god ide at lave en stor mængde GUI opdatering i en loop, oftest er det bedst at sende en besked til vinduet selv, for hver opdatering (eller et antal opdateringer) dermed undgår man at message køen bliver for fuld.

Hvis du kan lave et komplet men simpelt eksempel der viser problemet, kan jeg godt prøve at eksperimentere lidt med det.
Avatar billede challenge Praktikant
10. marts 2011 - 14:21 #2
Mange tak for feedback!

Jeg vil prøve med at ændre flags, når jeg for lejlighed ved fyraften :) Jeg vil herom vende tilbage senere i dag.

Det lyder meget spændende. Jeg har selv overvejet call-stack-problemstillingen ifm. lidt Google-søgning, men jeg nåede aldrig selv til en konklusion. Du nævner i denne forbindelse, at call-stacken kan overfyldes, og forstlår derfor, at jeg i stedet sender en enkelt besked til vinduet der skal resizes, der således selv resizer og animerer. Er dette rigtigt forstået? Dette stiller mig dog tilbage med et enkelt spørgsmål; hvorledes har dette indflydelse på call-stack? Vil der ikke være lige mange beskeder sendt, uanset hvorfra jeg kalder SetWindowPos (antagende at SetWindowPos selv sender en besked hver gang den kaldes)? Er det noget jeg misorstår?

Den sidste del lyder også meget interessant! :)
Når du nævner et komplet men simpelt eksempel, mener du da i ord eller kode?

Mange tak for hjælpen!
Avatar billede challenge Praktikant
10. marts 2011 - 17:43 #3
Hej igen,

Jeg har prøvet med alle SWP_NO*-flag (også i kombination), og det giver desværre samme resultat.

Jeg har desuden også prøvet at ligge hele SetWindowPos-løkken i en WM_COMMAND under-command, men med samme resultat.
Avatar billede bertelbrander Praktikant
10. marts 2011 - 21:37 #4
Det var mere besked køen end call-stack jeg var bekymret for.
Med simpelt eksempel mente jeg kode, jeg tror godt jeg forstå problemet.
Avatar billede challenge Praktikant
12. marts 2011 - 10:10 #5
Hej,

Jeg sad og arbejdede lidt på det i går aftes, og det ser ud til, at problemet ikke er der længere. Jeg har brugt din metode med at sende en custom besked to hoved-vinduet, der således selv tager sig af bevægelsen, vha. MoveWindow. Dit forslag virkede således alligevel, så for dét må du gerne smide et svar :)

Tak for hjælpen!
Avatar billede challenge Praktikant
18. marts 2011 - 13:11 #6
Bump :)
Avatar billede bertelbrander Praktikant
18. marts 2011 - 19:39 #7
Jeg samler ikke på point, så lav selv et svar og accepter det, så bliver spørgsmålet lukket og du får dine point tilbage.
Avatar billede challenge Praktikant
18. marts 2011 - 22:19 #8
Helt i orden - du skal dog have tak, uanset pointuddeling ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester