09. marts 2011 - 21:20Der 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?
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.
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?
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 :)
Helt i orden - du skal dog have tak, uanset pointuddeling ;)
Synes godt om
Ny brugerNybegynder
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.