Oprettet ons. d. 09. marts 2011 kl. 21:20:43

challenge
challenge (9.345 point. Point ude: 60)

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.

Skrevet ons. d. 09. marts 2011 kl. 22:00:33| #1

bertelbrander
bertelbrander (17.270 point)
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.

Skrevet tor. d. 10. marts 2011 kl. 14:21:50| #2

challenge
challenge (9.345 point)
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!

Skrevet tor. d. 10. marts 2011 kl. 17:43:13| #3

challenge
challenge (9.345 point)
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.

Skrevet tor. d. 10. marts 2011 kl. 21:37:40| #4

bertelbrander
bertelbrander (17.270 point)
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.

Skrevet lør. d. 12. marts 2011 kl. 10:10:48| #5

challenge
challenge (9.345 point)
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!

Skrevet fre. d. 18. marts 2011 kl. 13:11:50| #6


Skrevet fre. d. 18. marts 2011 kl. 19:39:36| #7

bertelbrander
bertelbrander (17.270 point)
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.

Skrevet fre. d. 18. marts 2011 kl. 22:19:16| #8

challenge
challenge (9.345 point)
Helt i orden - du skal dog have tak, uanset pointuddeling ;)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Updater Hybrid App

Oprettet den 18. april 2012 kl. 13.29
sir_madsen giver 100 point for svar | Giv et svar »

Ansi-c win32API - kan ikke oprette Richedit4.1 kontrol

Oprettet den 16. april 2012 kl. 22.13
cblcbl giver 60 point for svar | Giv et svar »

Iphone Objective C - Sætte image på et imageview.

Oprettet den 7. april 2012 kl. 11.36
lasserasch giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger