Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

11

27.12.2006, 14:07

Ich habe das ganze jetzt so gelöst:

@rfklaffehn: Ich habe das bitmap jetzt mittels GetObject(); gefüllt

@firefly: Ich lade das Bild in WM_CREATE, denn das soll ja nur einmal gemacht werden, doch seht selbst.

C-/C++-Quelltext

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP  hBitmap;
    static HDC      hdcBmp;
    static BITMAP   bitmap;
    HDC             hdc;
    PAINTSTRUCT     ps;
    
    // Nachrichten switchen

    //-------------------

    switch(message)
    {

    case WM_CREATE:
        {
            hBitmap = (HBITMAP)LoadImageW(NULL,L"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

            if(hBitmap == NULL) 
            { 
                MessageBoxW(hwnd,L"Bild konnte nicht geladen werden",L"Error",0); 
                return -1; 
            }

            GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;
            
            return 0;
        }

    case WM_PAINT:
        {
            hdc = BeginPaint(hwnd, &ps);

            hdcBmp = CreateCompatibleDC(hdc); 
            SelectObject(hdcBmp, hBitmap);

            BitBlt(hdc, 200, 200, bitmap.bmWidth, bitmap.bmHeight,  
                                    hdcBmp, 0, 0, SRCCOPY) ; 

            EndPaint(hwnd, &ps);
            return 0;
        }

    case WM_DESTROY:
        {
            // Anfrage zum Beenden senden

            //---------------------------

            PostQuitMessage(0);
            return 0;
        }
    }
    // Den Rest der Standardwindowprozedur überlassen

    //-----------------------------------------------

    return DefWindowProc(hwnd, message, wParam, lParam);
}


Funktioniert einwandfrei.

Falls noch etwas nicht gut oder unsicher ist, bitte melden (oder falls ich etwas noch nicht freigegeben habe, was ich noch brauche oder umgekehrt, was wiederum "Performance" kosten würde)!!!

Ansonten, danke soweit für eure (mal wieder echt gute!) Hilfe - spacegaier

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

12

27.12.2006, 14:11

kannst noch den hdcBmp freigeben...

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

13

27.12.2006, 14:21

Stimmt, wäre es aber nicht überhaupt sinnvoller, das hdcBmp in WM_CREATE zu erstellen (also nur einmal) und dann erst am Programmende zu löschen? Oder wo würdest du es löschen?

14

27.12.2006, 14:49

Naja du holst dir ja in der WM_PAINT immer einen neuen DC ... d.h. muss der 2. DC DAZU kompatibel sein ... und du hast was grundlegendes vergessen!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case WM_PAINT:
{
    HDC hDC = BeginPaint(hWnd, &ps);
    HDC hMemDC = CreateCompatibleDC(hDC);
    HBITMAP hBitmapOld = static_cast<HBITMAP>(SelectObject(hMemDC, hBitmap));

    BitBlt(hDC, 200, 200, bitmap.bmWidth, bitmap.bmHeight, hMemDC, 0, 0, SRCCOPY) ;
    EndPaint(hWnd, &ps);

    SelectObject(hMemDC, hBitmapOld);
    DeleteDC(hMemDC);
            
    return 0;
}
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

15

27.12.2006, 14:55

EDIT:// Und was ist das grundlegende?

16

27.12.2006, 15:00

Ja... man holt grundsätzlich, bevor man das 1. Objekt eines Types in diesem Fall HBITMAP auswählt, das alte Objekt des DCs. Wenn man mit zeichnen fertig ist, setzt man wieder das alte rein. Naja und du musst deinen memdc auch wieder löschen ;) das sind die beiden änderungen. richtig.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

17

27.12.2006, 15:25

Was bringt der Aufwand? Ich sehe hierin keinen Vorteil. Warum soll ich mir die alten Objekte holen, die mich doch nicht mehr interessieren, denn täten sie das hätte ich sie ja irgendwo gespeichert, oder?

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

18

27.12.2006, 20:48

Grundlegend ist erstmal dass man in WM_CREATE keine Zeichenfunktionen verwenden KANN!

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

19

27.12.2006, 20:57

Tue ich doch auch gar nicht. Ich lade in WM_CREATE lediglich die Bilder. Doch ich verstehe nicht, warum der Aufwand um das alte Objekt zu speichern.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

20

27.12.2006, 21:17

Und nochwas, es geht jetzt schon wieder nicht, da ich einigews verändert habe (http://spieleprogrammierer.de/phpBB2/viewtopic.php?t=6921). Ich hole mir nun so den Fehlercode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if(hBitmap[i] == NULL) 
                { 
                    MessageBoxW(hwnd,L"Bild konnte nicht geladen werden",L"Error",0); 
                    DWORD dw = GetLastError();
                    wchar_t temp[512];
                    swprintf(temp, 512, L"Code: %d", dw); 
                    MessageBox(hwnd,temp,NULL,MB_OK);


                    return -1; 
                }


Der Code ist 0 (NULL) -> ??? Was passt diesmal nicht?

Werbeanzeige