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

31

23.03.2006, 21:24

Hallo, also ich glaube ich hab das jetzt mit dem ANSI und UNICODE etc. verstanden!

Aber ich möchte nciht meinen ganzen bisherigen Code auf Unicode umstellen, deshalb die klasse Funktion von "nix da" umstellen!

Also ich hab mir das irgendwie so gedacht:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void LoadBitmap24Bit (::HWND__* hwnd, const char Dateiname[50], HDC *device_context_, HBITMAP *bitmap_) 
{ 
        // Daten für die Ausgabe 

    ::HDC__*            device_context      = NULL; // Primärpuffer 


        // Daten für das Dateihandling 

    void*               file_handle         = NULL; // Handle auf die Datei 

    unsigned long       file_recievedbytes  = 0;    // Hilfsvariable für die gelesenen Bytes 


        // Daten für die Bitmapdaten 

    ::BITMAPFILEHEADER  bitmap_header;              // Bitmap-Header 

    ::BITMAPINFO        bitmap_info;                // Bitmapinformationen 

    unsigned long       bitmap_size         = 0;    // Größe der Daten 

    unsigned char*      bitmap_data         = NULL; // Datenpuffer // signed char? 


        // Datei öffnen 

    file_handle = ::CreateFile (Dateiname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

    // Bitmap-Header lesen 

    if(!::ReadFile (file_handle, &bitmap_header, sizeof(bitmap_header), &file_recievedbytes,NULL) || file_recievedbytes != sizeof(bitmap_header)) 
    { 
        ::CloseHandle (file_handle); 
    } 
        
        // Bitmapinformationen lesen 

    if (!::ReadFile (file_handle, &bitmap_info.bmiHeader, sizeof(bitmap_info.bmiHeader), &file_recievedbytes, NULL) || file_recievedbytes != sizeof(bitmap_info.bmiHeader) || 
        bitmap_info.bmiHeader.biCompression != BI_RGB || 
        bitmap_info.bmiHeader.biBitCount    != 24) 
    { 
        ::CloseHandle (file_handle); 
    } 
    
        // Lesestift von Anfang der Datei zum Beginn der Farbdaten setzen. 

    ::SetFilePointer (file_handle, bitmap_header.bfOffBits, NULL, FILE_BEGIN); 

        // Größe des benötigten Speichers für das Lesen der Farbdaten errechnen 

    bitmap_size = ((bitmap_info.bmiHeader.biWidth + 3) / 4) * 4; 
    bitmap_size =  (bitmap_size * (bitmap_info.bmiHeader.biHeight * bitmap_info.bmiHeader.biBitCount)) / 8; 

        // Speicher für die Farbdaten bereitstellen 

    bitmap_data = new unsigned char[bitmap_size]; 

        // Farbdaten lesen 

    if (!::ReadFile (file_handle, bitmap_data, bitmap_size, &file_recievedbytes, NULL) || file_recievedbytes != bitmap_size) 
    { 
        ::CloseHandle (file_handle); 
        delete [] bitmap_data; 
    } 

        // Primärpuffer holen 

    device_context = ::GetDC (hwnd);

        // Kompatiblen Device Context des Primärpuffers erstellen 

    (*device_context_) = ::CreateCompatibleDC (device_context);

        // Kompatible Bitmap des Primärpuffers erstellen 

    (*bitmap_) = ::CreateCompatibleBitmap (device_context, bitmap_info.bmiHeader.biWidth, bitmap_info.bmiHeader.biHeight);

        // Bitmap mit den Farbdaten füllen 

    ::SetDIBits ((*device_context_), (*bitmap_), 0, bitmap_info.bmiHeader.biHeight, bitmap_data, &bitmap_info, DIB_RGB_COLORS) ;
        
        // Objekte verknüpfen 

    ::SelectObject ((*device_context_), (*bitmap_)); 

        // Temporärer Speicher für die Farbdaten freigeben 

    delete [] bitmap_data; 

        // Datei schließen 

    ::CloseHandle (file_handle); 

        // Zeiger auf Primärpuffer freigeben 

    ::ReleaseDC(hwnd,device_context); 
};

das mit Dateiname[50] ist sicher schlecht gelöst, aber ich ja auch erstmal nur testen ...

So, also Compilerfehler grieg ich jetzt nciht mehr, aber wenn das Programm compiliert ist und starten will, dann rattert mein PC ewig und es kommt dann irgendwann die Meldung, dass ein Problem festegestellt wurde und das programm beendet werden musste ...

Kann mir einer sagen, was da oben falsch ist?

32

23.03.2006, 21:44

const char Dateiname[50]... mach da nen pointer draus... sonnst ist das ja mal :rolleyes: ;)
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

33

23.03.2006, 21:55

Zitat von »"Top_se"«


das mit Dateiname[50] ist sicher schlecht gelöst, aber ich [edit on]will[edit off] ja auch erstmal nur testen ...


Das meinte ich damit!

Klar sollte man da nen Zeiger draus machen, aber das is ja eigentl. cniht entscheiden für mein Problem ...

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

34

24.03.2006, 01:19

Pointerregeln:
1.) im Konstruktor einer Klasse immer auf NULL setzen
2.) immer Pointer-Parameter in Funktionen/Methoden auf NULL prüfen (hier macht das WINAPI ist aber immer besser)
3.) Schauen ob die auf frei gegeben werden.
4.) Als Paramter übergibt man nur sehr ungern sowas wie pD[50], wenn dann *pD.

Ich würde dir mal raten ein paar Thread zu char und Pointern durchzulesen, vorzugsweise den großen Thread hier von mir... :)
https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=5188

35

24.03.2006, 15:38

Hallo!

Danke für den Hinweis, hab mir auch deinen Beitrag durchgelesen, SUPER!

Aber ich hab jetzt mal den Code von "nix da" so umgebaut:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
void LoadBitmap24Bit (::HWND__* hwnd, const char *Dateiname, HDC *device_context_, HBITMAP *bitmap_) 
{ 
        // Daten für die Ausgabe 

    ::HDC__*            device_context      = NULL; // Primärpuffer 


        // Daten für das Dateihandling 

    void*               file_handle         = NULL; // Handle auf die Datei 

    unsigned long       file_recievedbytes  = 0;    // Hilfsvariable für die gelesenen Bytes 


        // Daten für die Bitmapdaten 

    ::BITMAPFILEHEADER  bitmap_header;              // Bitmap-Header 

    ::BITMAPINFO        bitmap_info;                // Bitmapinformationen 

    unsigned long       bitmap_size         = 0;    // Größe der Daten 

    unsigned char*      bitmap_data         = NULL; // Datenpuffer // signed char? 


        // Datei öffnen 

    if ((file_handle = ::CreateFile ("Wuerfel0.png", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) 
        MessageBox(hwnd,"1","Error",NULL); 

        // Bitmap-Header lesen 

    if (!::ReadFile (file_handle, &bitmap_header, sizeof(bitmap_header), &file_recievedbytes,NULL) || file_recievedbytes != sizeof(bitmap_header)) 
    { 
        ::CloseHandle (file_handle); 
        MessageBox(hwnd,"2","Error",NULL); 
    } 
        
        // Bitmapinformationen lesen 

    if (!::ReadFile (file_handle, &bitmap_info.bmiHeader, sizeof(bitmap_info.bmiHeader), &file_recievedbytes, NULL) || file_recievedbytes != sizeof(bitmap_info.bmiHeader) || 
        bitmap_info.bmiHeader.biCompression != BI_RGB || 
        bitmap_info.bmiHeader.biBitCount    != 24) 
    { 
        ::CloseHandle (file_handle); 
        MessageBox(hwnd,"3","Error",NULL); 
    } 
    
        // Lesestift von Anfang der Datei zum Beginn der Farbdaten setzen. 

    ::SetFilePointer (file_handle, bitmap_header.bfOffBits, NULL, FILE_BEGIN); 

        // Größe des benötigten Speichers für das Lesen der Farbdaten errechnen 

    bitmap_size = ((bitmap_info.bmiHeader.biWidth + 3) / 4) * 4; 
    bitmap_size =  (bitmap_size * (bitmap_info.bmiHeader.biHeight * bitmap_info.bmiHeader.biBitCount)) / 8; 

        // Speicher für die Farbdaten bereitstellen 

    bitmap_data = new unsigned char[bitmap_size]; 

        // Farbdaten lesen 

    if (!::ReadFile (file_handle, bitmap_data, bitmap_size, &file_recievedbytes, NULL) || file_recievedbytes != bitmap_size) 
    { 
        ::CloseHandle (file_handle); 
        delete [] bitmap_data; 
        MessageBox(hwnd,"4","Error",NULL); 
    } 

        // Primärpuffer holen 

    if ((device_context = ::GetDC (hwnd)) == NULL) 
        MessageBox(hwnd,"5","Error",NULL); 

        // Kompatiblen Device Context des Primärpuffers erstellen 

    if (((*device_context_) = ::CreateCompatibleDC (device_context)) == NULL) 
        MessageBox(hwnd,"6","Error",NULL); 

        // Kompatible Bitmap des Primärpuffers erstellen 

    if (((*bitmap_) = ::CreateCompatibleBitmap (device_context, bitmap_info.bmiHeader.biWidth, bitmap_info.bmiHeader.biHeight)) == NULL) 
        MessageBox(hwnd,"7","Error",NULL); 

        // Bitmap mit den Farbdaten füllen 

    if (!::SetDIBits ((*device_context_), (*bitmap_), 0, bitmap_info.bmiHeader.biHeight, bitmap_data, &bitmap_info, DIB_RGB_COLORS)) 
        MessageBox(hwnd,"8","Error",NULL); 
        
        // Objekte verknüpfen 

    ::SelectObject ((*device_context_), (*bitmap_)); 

        // Temporärer Speicher für die Farbdaten freigeben 

    delete [] bitmap_data; 

        // Datei schließen 

    ::CloseHandle (file_handle); 

        // Zeiger auf Primärpuffer freigeben 

    ::ReleaseDC(hwnd,device_context); 
}


So, aus Testzwecken hab ich gleich den Dateiname in die Funktion CreateFile rein gepackt, wollte nur testen! Der Name ist auch richtig!
Aber wenn die Funktion aufgerufen wird, dann bekomme ich gleich die erste Meldung (also dass CreateFile() wohl fehlgeschlagen ist)
Warum?

Anonymous

unregistriert

36

24.03.2006, 18:57

Top_se
PNG oder BMP?

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

37

24.03.2006, 19:31

Top_se und Patrick nicht weiterlesen! Hier eine kleine Zukunftsprognose. Möchte mal wissen, ob sie sich erfüllt:



Top_se sagt PNG
Patrick sagt, dass die Funktion ja auch nur bei manchen BMPs funktioniert
Top_se sagt entrüstet, dass er ja pngs laden wollte.
Patrick deutet an, dass das viel zu schwer ist und er besser bei Bmps bleiben soll.
Top_se fleht um Antworten.
Ein schlaues Kerlchen sagt, dass man auch einfach D3DXCreateTextureFromFile benutzen könnte.
Patrick sagt, dass D3DX totaler Mist ist, er sich aber nicht nochmal wiederholen möchte.
Zwei Anfänger fragen warum.
Patrick erklärt, warum D3DX totaler Schrott ist.
Noch ein schlaues Kerlchen sagt, dass man das Rad nicht ständig neu entwickeln sollte.
Patrick gibt 10 Argumente, warum man es doch tun sollte.
Die zwei Anfänger geben ihm völlig recht.
Top_se ist völlig verwirrt.

38

24.03.2006, 19:43

*sich schäm* *viel zu neugierig gewesen sei und gelesen hab*

:-D :-D *lol*
geile Vorhersage Helmut! *rofl*

naja, aber @ Patrik, bzw. "nix da", ähm, naja sicher .png, oder .jpg, wäre mir in dem Fall recht egal, aber hauptsache nciht .bmp *g*

Anonymous

unregistriert

39

24.03.2006, 19:46

Top_se
ich sag dazu nix mehr, der Loader ist für Bitmaps da und nicht für Deine Wunschformate! Und wenn Du noch nie eine Bitmap per Hand geladen hast solltest Du - allein schon aus dem klugen Denken herraus - "höhere" Formate links liegen lassen.

Da wird nichts dran gerüttelt btw. geschüttelt das ist ein Tatbestand und fertig. Du kannst doch kein Programm schreiben wenn Du nur HTML kannst.

Lern BMPs laden und dann gehts erst weiter.

40

24.03.2006, 20:06

okay, dann hab ich dich wohl falsch verstanden, aber trotzdem danke für deine Mühe!

Werbeanzeige