GDI lagger efter x sekunder

Tags:    c++

<< < 123 > >>
Hej.

Jeg har lavet et skrivekomponent magen til det i Visual Studio, hvor der er som bekendt en hel del grafiske elementer (linjeboksen, markeringsfunktionen, highlight af visse dele af teksten, etc.), men efter lidt tid eller et bestemt antal operationer (som at markere en linje frem og tilbage en masse gange hurtigt) giver GDI op.

Mit komponent ser således ud:
http://123login.dk/dexo/vse.png

Jeg kan desværre ikke vise, hvordan det ser ud, når GDI kokser, for da vil Windows ikke lade mig tage screenshots. Men jeg kan sige, at markeringen forsvinder og at der kommer en masse streger, der ligner komponentets caret (tekstmarkøren "IBeam"). Hvis jeg minimerer og gendanner vinduet, er komponentet helt sort (hvilket det er indstillet til at være ved programstart-up, inden WM_PAINT bearbejdes).

Jeg har førhen løst problemet med en timer, men det giver programmet en lidt "tung" fornemmelse. Jeg har også udtænkt en måde at "skåne" WM_PAINT på, så den ikke maler HELE komponentet hver gang, men den skal lige finpudses og omdannes til kode, hvilket jeg endnu ikke har gjort, i håb om end nemmere måde.



Thomas



Indlæg senest redigeret d. 14.04.2009 00:39 af Bruger #8985
22 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Hvis du f.eks. ser på CreatePen:
http://msdn.microsoft.com/en-us/library/ms908180.aspx

Kan du se at du skal kalde DeleteObject når du er færdig med at bruge pennen. Det samme gælder for de andre GDI-objekter.



Okay. Problemet er bare, at alle mine GDI-objekter er statiske... Det kan selvfølgelig ændres (hvilket jeg lige gjorde), men GDI giver stadig op. Nu vil jeg prøve at kalde DeleteObject så snart GDI-objektet er færdigt og ikke i bunden sammen med alle de andre.



Du må stadig oprette ufattelig mange GDI-objekter. Man kan ved et uheld komme til at allokere et par stykker som man ikke for nedlagt rigtigt igen, men 1000 pr. sekund er langt fra normalt.

Uden at se koden er det svært præcist at fortælle hvad der går galt.



Well jeg har intet imod at sende dig koden, Bertel... Jeg er bare ikke glad for at offentliggøre den.

Forresten, skal jeg også kalde DeleteObject på strukturer som RECT?

Her er koden til GDI-eksemplet:

Fold kodeboks ind/udKode 


Nu har jeg ændret lidt i koden, og wow... Den tilføjer næsten ikke nogle GDI-objekter (kun en gang i mellem og ikke 1 per firkant, som det er tilfældet med Paint).

Koden ser nu således ud:
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 15.04.2009 01:45 af Bruger #8985
Hvad med funktioner? Tilføjer de også GDI-objekter? Det virker som et lidt dumt spørgsmål, men jeg synes bare, jeg har DeleteObject'ed alle mine GDI-strukturer, hvilket efterlader funktioner som SetTextColor, SetTextMode, TextOut etc. som det eneste GDI-mæssige tilbage.



Så vidt jeg kan se er det ok nu.



Ja, testprogrammet er fint, men hvad med editoren? Jeg har sendt projektet til din e-mail.



Jeg har ikke modtaget "editoren" endnu.



Okay, har du skiftet e-mail? Jeg sendte den i går nat.

Men jeg tror, jeg har løst problemet. Jeg gjorde alle GDI-objekterne statiske. Nu kan jeg så self. ikke kalde DeleteObject på dem, men pyt med det.



HA! Nu virker det helt perfekt! Jeg ville ønske, du ville lade mig give dig pointene, Bertel, for du har sgu fortjent dem... Men skidt med det!



<< < 123 > >>
t