Toon posts:

[Win32/GDI] Problemen...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Allereerst, ik ben net begonnen met de GDI en ik heb mezelf al vrij veel handig weten te maken met de GDI api echter zit ik nog met 2 probleempjes waar ik nog geen oplossing op heb weten te vinden.

De betreffende code (Het gaan om een DialogBox aanroep, ik laat alleen de msghandler zien):

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    switch(message)
    {
        // We moeten het venster sluiten
        case WM_CLOSE:
            EndDialog(hwndDlg, wParam);
            return true;

        // Initialiseer het venster
        case WM_INITDIALOG:
        {
            hBufferDC = CreateCompatibleDC(GetDC(hwndDlg));
            hBufferBitmap = CreateCompatibleBitmap(hBufferDC, BUFFER_SIZE_X, BUFFER_SIZE_Y);
            SelectObject(hBufferDC, hBufferBitmap);
            
            // Teken iets in de buffer
            RECT pRect;
            pRect.left = 0; pRect.right = BUFFER_SIZE_X-1;
            pRect.top = 0; pRect.bottom = BUFFER_SIZE_X-1;
            HBRUSH pBrush = CreateSolidBrush(RGB(0,0,0));
            FillRect(hBufferDC, &pRect, pBrush);
            return true;
        }

        // Kopieer de buffer naar het scherm
        case WM_PAINT:
            BitBlt(GetDC(hwndDlg), 10, 10, BUFFER_SIZE_X, BUFFER_SIZE_X, hBufferDC, 0, 0, SRCCOPY);
            return true;

        // Voer de opruimwerkzaamheden uit
        case WM_DESTROY:
            ReleaseDC(hwndDlg, hBufferDC);
            return true;
    }


Allereerst
Het hele verhaal werkt op zich in de eerste fase. Echter gaat na een tijdje het programma flippen. Het blok wat ik met Bitblt naar het scherm kopieer blijft frontaal op het scherm staan. Het programma blijft hangen en hierdoor reageert de hele pc niet meer. Ik heb geen idee waar dit door zou kunnen komen. Iemand een idee? Ik vermoed dat de WM_PAINT niet juist is, ik heb echter nog geen bevestiging hiervoor weten te vinden.

Ten tweede
Ik kan geen kleuren kiezen behalve wit & zwart. Alle andere kleuren (bijv. CreateSolidBrush(RGB(255,0,0)) ) levert een vlak met allerlei grijze kleurtjes en stippellijntjes. Het lijkt allermist op een solid brush :D. Ook hier heb ik nog niets over weten te vinden.

Iemand die me verder kan helpen hiermee?

  • staefke
  • Registratie: December 2003
  • Laatst online: 18-02 08:01
hmmm gezien het feit dat het in het begin wel goed gaat lijkt het er op dat je de DC na het blitten niet released...

uit de MSDN:

The GetDC function retrieves a common, class, or private DC depending on the class style of the specified window. For class and private DCs, GetDC leaves the previously assigned attributes unchanged.
[....] After painting with a common DC, the ReleaseDC function must be called to release the DC. Class and private DCs do not have to be released. ReleaseDC must be called from the same thread that called GetDC. The number of DCs is limited only by available memory.

duh ?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gebruik BeginPaint/EndPaint in WM_PAINT messages, die zijn daar speciaal voor bedoeld. De DC om naar te blitten komt in de PAINTSTRUCT die je meegeeft.

En je moet je objecten idd ook weggooien nadat je ze aangemaakt/opgevraagd hebt (GetDC, CreateSolidBrush, ...)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • CyBoB
  • Registratie: Januari 2001
  • Laatst online: 24-12-2025

CyBoB

.::BURB::.

als je gdi object vergeet te destroy'en kan er een gdi object leak ontstaan in je programma. wat ik vaak doe om te kijken of er niet perongelijk zo'n leak onstaat in me programma is de taskmanager van windows gebruiken. je kan bij het tabblad processes en extra kolom laten tonen met "GDI Objects" die aangeeft hoeveel GDI Object een bepaald process in gebruik heeft. als dit nummer tijdens de lifetime van je applicatie blijft stijgen dan weet je bijna zeker dat je ergens een call naar DestroyObject bent vergeten.

ps. alle gdi objecten die je aanmaakt in je WM_INITDIALOG moet je ook nog even destroy'en bij het sluiten van het dialoog.

Verwijderd

Topicstarter
Okee, ik heb geen last meer van GDI object leaks.

Echter heb ik nog steeds het probleem dat ik alleen zwart en wit kan gebruiken als kleuren. alle andere kleuren resulteren en een soort vaag zwart/wit patroon.

C++:
1
HBRUSH hBrush = CreateSolidBrush(RGB(0,255,0));


Dit moet toch gewoon werken als ik dan met FillRect een rectangle teken?
Waarom levert dit dan zo'n vaag rotpatroon? :+

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Verwijderd schreef op donderdag 12 mei 2005 @ 15:03:
C++:
1
HBRUSH hBrush = CreateSolidBrush(RGB(0,255,0));


Dit moet toch gewoon werken als ik dan met FillRect een rectangle teken?
Waarom levert dit dan zo'n vaag rotpatroon? :+
uit MSDN:
After an application creates a brush by calling CreateSolidBrush, it can select that brush into any device context by calling the SelectObject function.
[edit]
Btw, volgens mij is het ook netter om je oude objecten weer terug te selecten in je dc

[ Voor 11% gewijzigd door farlane op 13-05-2005 10:00 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Sorry voor de kick :+

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            hDlg = hWDlg;
            bufferSizeX = sizeX;
            bufferSizeY = sizeY;

            // Teken een zwart vlak
            hBufferDC = CreateCompatibleDC(GetDC(hDlg));
            hBufferBitmap = CreateCompatibleBitmap(hBufferDC, bufferSizeX, bufferSizeY);
            SelectObject(hBufferDC, hBufferBitmap);

            // Het eigenlijke tekenwerk
            RECT pRect;
            pRect.left = 0; pRect.right = bufferSizeX-1;
            pRect.top = 0; pRect.bottom = bufferSizeY-1;
            
            HBRUSH pBrush = CreateSolidBrush(RGB(200,200,200));
            SelectObject(hBufferDC, pBrush);
            FillRect(hBufferDC, &pRect, pBrush);

            // Geef de DC weer vrij
            ReleaseDC(hDlg, hBufferDC);


Dit zou toch moeten werken imho. Wellicht ben ik gek aan ut worden.
Heeft er iemand een werkend voorbeeld van de GDI van een rood vierkantje in een zwart vierkantje wellicht? :S zo ja, dan zou ik hem eeuwig dankbaar zijn :+

Ga ik ondertussen ff verder met puzzelen :P

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Hier, goede tutorial :) .

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1