Deze vraag gaat over een c++ projectje, gemaakt in dev/c++ voor win32. Op een venster heb ik allemaal met LineTo gemaakte lijnen staan. Nu is het het geval dat wanneer mijn venster het commando WM_PAINT krijgt, het scherm weer leeg word. Hoe sla ik de inhoud van het venster tijdelijk ergens in op, om het later weer terug te zetten. Het liefst met een bitmap oid. Ik heb geprobeerd, en de documentatie er op nageslagen, maar ik kom er niet uit. Weet iemand raad?
Gewoon alle beginpunten en lengtes ed opslaan in variablen en deze bij een WM_PAINT event hertekenen.
Wat eigenlijk nog mooier is, is dat je een class Line oid maakt en dan alle Line objecten die je maakt (dus iedere keer als je een lijn tekent, maak je een Line object bij) bijhouden en deze dan allemaal hertekenen als er een WM_PAINT event is.
En iedere keer je een object aanmaakt ga je die ergens in een Array of een vector oid bijhouden. Bij het WM_PAINT event ga je die array overlopen en voor ieder object de draw functie aanroepen:
Zoiets dus ongeveer....
Opslaan als een bitmap in het geheugen vind ik eerder inefficient.
Wat eigenlijk nog mooier is, is dat je een class Line oid maakt en dan alle Line objecten die je maakt (dus iedere keer als je een lijn tekent, maak je een Line object bij) bijhouden en deze dan allemaal hertekenen als er een WM_PAINT event is.
code:
1
2
3
4
5
6
7
8
| Class CMyLine
{
private:
int xCo, yCo;
int toXco, toYco;
public:
void Draw();
}; |
En iedere keer je een object aanmaakt ga je die ergens in een Array of een vector oid bijhouden. Bij het WM_PAINT event ga je die array overlopen en voor ieder object de draw functie aanroepen:
code:
1
2
3
4
| for (int i = 0; i < LineArray.Count; i ++ )
{
LineArray[i]->Draw();
} |
Zoiets dus ongeveer....
Opslaan als een bitmap in het geheugen vind ik eerder inefficient.
https://fgheysels.github.io/
Door elke keer zoals het hoort opnieuw die lijnen te tekenen als je een WM_PAINT ontvangt. Misschien is je scherm wel kleiner of juist groter geworden...
Het is natuurlijk mogelijk wat jij wil, maar ik kan je even zo snel geen richting op sturen.
Het is natuurlijk mogelijk wat jij wil, maar ik kan je even zo snel geen richting op sturen.
We adore chaos because we like to restore order - M.C. Escher
Ik begreep dat je WM_PAINT ook ontvangt als je scherm nog versleept word. Natuurlijk kan ik de lijnen wel opnieuw gaan tekenen, maar stelt dat het geen lijnen waren maar een mandelbrot oid. Dan is het programma iedere keer tijden lang aan het tekeken. En bovenal wil ik gewoon leren hoe je iets in zo'n bitmap opslaat. Ik probneer nu te tekenen op virtuele hdc's, dat werkt niet
Verwijderd schreef op 08 oktober 2002 @ 17:00:
Ik begreep dat je WM_PAINT ook ontvangt als je scherm nog versleept word. Natuurlijk kan ik de lijnen wel opnieuw gaan tekenen, maar stelt dat het geen lijnen waren maar een mandelbrot oid. Dan is het programma iedere keer tijden lang aan het tekeken. En bovenal wil ik gewoon leren hoe je iets in zo'n bitmap opslaat. Ik probneer nu te tekenen op virtuele hdc's, dat werkt niet
Tja, maar stel dat je scherm resized zoals LordLarry al zei, dan klopt je tekening ook al niet meer.
https://fgheysels.github.io/
Duidelijk een geval van 'flickerfree drawing' 
i.a.w. je maakt een bitmap aan ter grootte van je scherm & hierin doe je alle tekenwerk.
Bij elke paint opdracht kwak je deze bitmap op je scherm.
Wanneer je wijzigingen in je scherm hebt, bewerk je deze (of een nieuwe copy) van de bitmap gewoon
Voor een sample van flickerfree drawing zie ook:
ik zoek op codeproject naar flicker free tekenen

Daarnaast zou je natuurlijk al je bewerkingen wel moeten loggen zodat je deze in een teken actie kunt reproduceren (bedenk een list, array of stack ??).
Windows gaat voor jou niet onthouden wat je allemaal hebt gewild met de muis....
..jij moet onthouden wat je hebt getekend.
i.a.w. je maakt een bitmap aan ter grootte van je scherm & hierin doe je alle tekenwerk.
Bij elke paint opdracht kwak je deze bitmap op je scherm.
Wanneer je wijzigingen in je scherm hebt, bewerk je deze (of een nieuwe copy) van de bitmap gewoon
Voor een sample van flickerfree drawing zie ook:
ik zoek op codeproject naar flicker free tekenen
Daarnaast zou je natuurlijk al je bewerkingen wel moeten loggen zodat je deze in een teken actie kunt reproduceren (bedenk een list, array of stack ??).
Windows gaat voor jou niet onthouden wat je allemaal hebt gewild met de muis....
..jij moet onthouden wat je hebt getekend.
[ Voor 0% gewijzigd door DolleDries op 08-10-2002 17:09 . Reden: Nog iets verder gelezen ;) ]
WM_PAINT wordt aangeroepen als er een deel van je venster (of het hele venster) opnieuw getekend moet worden, bijvoorbeeld als je resized, of het venster onder een ander venster vandaan schuift etc. Bij die WM_PAINT moet je het venster zo tekenen dat het klopt met de nieuwe situatie.
Als er in jouw geval nooit wat veranderd (of delen nooit veranderen) kan je dat best tijdelijk opslaan. Je kunt met CreateCompatibleDC/CreateCompatibleBitmap/SelectObject een DC+bitmap maken waar je op tekent, en dan bij WM_PAINT alleen een BitBlt naar de window DC.
Als er in jouw geval nooit wat veranderd (of delen nooit veranderen) kan je dat best tijdelijk opslaan. Je kunt met CreateCompatibleDC/CreateCompatibleBitmap/SelectObject een DC+bitmap maken waar je op tekent, en dan bij WM_PAINT alleen een BitBlt naar de window DC.
Hoe doe ik dat precies, die drie achter elkaar? Ik heb ze wel geprobeert te gebruiken, maar ik deed alles fout, want ik gebeurde niets.
(alles uit m'n hoofd dus weet niet of het helemaal klopt)
(voor CreateCompatibleDC kun je geloof ik ook NULL gebruiken ipv hDC, zonder Get/ReleaseDC dus, maar moet je even controleren)
Dan gewoon tekenen op die hBackDC, en bij WM_PAINT:
Vergeet niet alles weer op te schonen als je window gedestroyed wordt:
C++:
1
2
3
4
5
6
7
| HDC hDC, hBackDC; HBITMAP hBackBmp, hOldBmp; hDC = GetDC(hWnd); hBackDC = CreateCompatibleDC(hDC); hBackBmp = CreateCompatibleBitmap(hDC, width, height); hOldBmp = (HBITMAP)SelectObject(hBackDC, hBackBmp); ReleaseDC(hWnd, hDC); |
(voor CreateCompatibleDC kun je geloof ik ook NULL gebruiken ipv hDC, zonder Get/ReleaseDC dus, maar moet je even controleren)
Dan gewoon tekenen op die hBackDC, en bij WM_PAINT:
C++:
1
| BitBlt(hDC, 0, 0, width, height, hBackDC, 0, 0, SRCCOPY); |
Vergeet niet alles weer op te schonen als je window gedestroyed wordt:
C++:
1
2
3
| SelectObject(hBackDC, hOldBmp); DeleteObject(hBackBmp); DeleteDC(hBackDC); |
edit:
bugje weggewerkt, code werkt nu volgens mij
bugje weggewerkt, code werkt nu volgens mij
Bedankt voor die code, maar ik doe vat iets fout want het werkt niet
. Kan je mijn anders e-mailen, dan stuur ik mijn code op. Mijn adres = princevegetable_et_wanadoo_punt_nl (et = @, punt = . )
Pagina: 1