Dav. I mit program har jeg lavet en tråd der hvert halve sekund optegner vinduet. Mit problem er at optegnelsen går enormt langsomt (ca. 1 sekund). Jeg benytter mig af 2 for() løkker der kalder SetPixel, og på den måde udfylder hele vinduet. eksempel: hdc=GetDC(hwnd); for(u=0;u<600;u++){ for(i=y;i<y+800;i++){ if(color > 255)color = 255; SetPixelV(hdc, (X+i),(Y+u), (long)color); } } ReleaseDC(hwnd,hdc);
Er der en måde hvorpå jeg kan speed'e denne proces op (jeg kan ikke forestille mig at det _skal_ tage så lang tid at optegne vinduet. På forhånd tak. -Niels
WNDCLASS er defineret i WinMain. Jeg har har ikke oprettet en WM_PAINT metode (optegner den ikke kun når man starter, flytter og ændrer størrelsen på vinduet?)
Jeg vil egentlig bare prøve at lave en funktion der optegner et vindue, da jeg har i sinde at udvikle det til et spil (derfor skal det opdateres hver halve sekund). Hvad er det InvalidateRect() gør?
Nu var 3D ikke lige min hensigt. Det skulle bare være et simpelt platformspil (ikke noget stort), bare for at teste og udvide mine evner inden for programmering...
Hvis du skal have det til at gå hurtigt er du nød til at bruge bitmap's. Først laver du en bitmap med CreateCompatibleBitmap(), så laver du en memory DC med CreateCompatibleDC(), så vælger du bitmappen på din memory DC vha. SelectObject(), dernæst tegner du med din memory DC, og til sidst overfører du bitmappen fra din memory DC til den rigtige DC vha BitBlt().
CreateCompatibleDC returnerer en memory DC der er kompatibel med den DC der angives som parameter, så det skal være: Mhdc = CreateCompatibleDC(hdc); Når du tegner med SetPixelV skal du bruge din memory DC dvs: SetPixelV(Mhdc, ...); Når du så er færdig skal du overføre din bitmap fra memory (Mhdc) til skærmen (hdc) vha BitBlt.
Jeg har nu leget lidt rundt med det, og jeg løbet ind i et problem. Hvis jeg indsætter noget der ligner ovenstående kode i en tråd, så køre den 880 gange hvorefter SelectObject() fejler. Hvorfor gør den det?
Du skal måske delete din bitmap ved at kalde DeleteObject(bitmap) i slutningen af funktionen. Det er ligeledes en god ide at restore det object man har selected med SelectObject(), inden man kalder DeleteDC()/ReleaseDC() (jeg er dog ikke sikker på at det gør nogen forskel):
void do_draw(HWND hwnd) { HDC hdc, mdc; HBITMAP bitmap, oldbitmap; int i, j;
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.