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

1

19.02.2012, 20:40

[Problem gelöst] Problem mit Listing 10-01 - Ein Windows-Grundgerüst

Hey Leute.
Habe folgendes Problem:
Ich habe gerade das "Listing 10.01 - Ein Windows-Grundgerüst" aus dem Buch abgetippt (als IDE benutze ich "Visual C++ Express 2010). Das Problem liegt nun an der Stelle "windowclass.lpszClassName = szClassName;". Und zwar ist das problem, das mit "const char szClassName[] = "Ein Windows-Grundgeruest";" ein konstanter char-Array erzeugt wird, der jedoch bei "windowclass.lpszClassName = szClassName;" nicht der Variable "lpszClassName" vom Typ LPCWSTR zugewiesen werden kann.
Die Fehlermeldung lautet "Ein Wert vom Typ ""const char *"" kann keiner Entität vom Typ ""LPCWSTR"" zugewiesen werden.". Jedoch steht es im Buch genau so, ohne das der char-Array in einen LPCWSTR gecastet wird. Ich habe es dann jedoch versucht, und den char-Array an den Stellen, an denen ein LPCWSTR erwartet wird, in einen LPCWSTR gecastet, also bei "windowclass.lpszClassName = szClassName;" und bei den Parametern der CreateWindowEx Funktion. Dann gibt es zwar keine Fehlermeldung mehr, jedoch wird als Titel nicht der korrekte Titel ausgegeben, sondern chinesische/japanische was weiß ich Schriftzeichen. Hat einer eine idee, wie man das Problem lösen könnte? Danke schonmal im Voraus
Hier einmal der komplette Quelltext:

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// C++ für Spieleprogrammierer
// Listing 10.1
// Ein Windows-Grundgerüst

#include <Windows.h>

// Prototyp der Callback-Funktion
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowclass;     // Struktur für Fenstereigenschaften
    HWND hWnd;                  // handle Window (Fenster-Handle)
    MSG message;                // message (Nachricht)

    // Klassenname des Fensters bestimmen (frei wählbar)
    const char szClassName[] = "Ein Windows-Grundgeruest";

    // Struktur "windowclass" mit gewünschten Eigenschaften füllen
    windowclass.cbSize = sizeof (WNDCLASSEX);

    // Fenster soll beim Verschieben neu gezeichnet werden
    windowclass.style = CS_HREDRAW | CS_VREDRAW;

    // Zeiger auf Callback-Funktion
    windowclass.lpfnWndProc = WindowProc;

    // Keine erweitertn Einstellungen
    windowclass.cbClsExtra = NULL;
    windowclass.cbWndExtra = NULL;

    // Instanz speichern
    windowclass.hInstance = hInst;

    // Icons und Cursor festlegen
    windowclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);

    // Hintergrundfarbe festlegen
    windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;

    // Menü wird nicht benötigt
    windowclass.lpszMenuName = NULL;

    // Klassenname angeben
    windowclass.lpszClassName = szClassName; // Hier ist der Fehler

    // Fensterklasse registrieren
    if(!RegisterClassEx(&windowclass))
        return 0;

    // Das Fenster erzeugen
    hWnd = CreateWindowEx (NULL, szClassName, szClassName, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
                           100, 100, 300, 250, NULL, NULL, hInst, NULL);

    // Wenn das Fenster nicht erzeugt wurde, Programm beenden
    if(hWnd == NULL)
        return 0;

    // "Herzschlag" des Programms, hier wrden alle Nachrichten abgeholt, übersetzt und weitergeleitet
    while(GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    // Programm beenden
    return(int)(message.wParam);
}

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // Messages auswerten
    switch(message)
    {
        // Fentser schließen? (Auch Alt-F4)
        case WM_DESTROY:
        {
            // Nachricht zum Beenden schicken
            PostQuitMessage(0);
            return 0;
        }
        break;
        // wurde eine Taste gedrückt?
        case WM_KEYDOWN:
        {
            // ja, also je nach Taste verzweigen
            switch(wParam)
            {
                // wurde "Escape" gedrückt?
                case VK_ESCAPE:
                {
                    // ja, also Nachricht zum Beenden schicken
                    PostQuitMessage(0);
                    return 0;
                }
            }
        }
        break;
    }

    // Nachricht wurde nicht manuell verarbeitet, also von Windows verarbeiten lassen
    return (DefWindowProc(hWnd, message, wParam, lParam));
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jack069« (19.02.2012, 21:51)


2

19.02.2012, 20:53

Hallo,

probier mal "const char szClassName[] = L"Ein Windows-Grundgeruest";".

Mfg
C++-Coder

3

19.02.2012, 20:57

Hallo,

probier mal "const char szClassName[] = L"Ein Windows-Grundgeruest";".

Mfg
C++-Coder
habe es so geändert. jetzt gibt der compiler folgende fehlermeldung aus:
"Ein Wert vom Typ ""const wchar_t[25]"" kann nicht zum Initialisieren einer Itentität vom Typ ""const char[]"" verwendet werden.

MysticDragon

Frischling

Beiträge: 20

Beruf: Student

  • Private Nachricht senden

4

19.02.2012, 21:05

Dein Problem ist wahrscheinlich, dass bei deinem Projekt UNICODE-Zeichensatz verwendet wird. Du kannst dein Problem auf zwei Arten beheben:

1. Du gehst in Projekt->Eigenschaften und änderst dann bei Konfigurationseigenschaften-> Allgemein den Punkt Zeichensatz auf "Multibyte-Zeichensatz verwenden".

2.Oder du schreibst

C-/C++-Quelltext

1
const TCHAR szClassName[] = TEXT("Ein Windows-Grundgeruest");

Im Forum gibt es unter folgendem Link einen guten Artikel über Unicode- und Multibyte-Zeichensatz:
Unicode



Beste Grüße

MysticDragon
Never trust an immediately running system.

5

19.02.2012, 21:19

Dein Problem ist wahrscheinlich, dass bei deinem Projekt UNICODE-Zeichensatz verwendet wird. Du kannst dein Problem auf zwei Arten beheben:

1. Du gehst in Projekt->Eigenschaften und änderst dann bei Konfigurationseigenschaften-> Allgemein den Punkt Zeichensatz auf "Multibyte-Zeichensatz verwenden".

2.Oder du schreibst

C-/C++-Quelltext

1
const TCHAR szClassName[] = TEXT("Ein Windows-Grundgeruest");

Im Forum gibt es unter folgendem Link einen guten Artikel über Unicode- und Multibyte-Zeichensatz:
Unicode



Beste Grüße

MysticDragon
Vielen Dank, habe den Quelltext abgeändert wie du es gesagt hast und jetzt klappt alles super vielen dank

Werbeanzeige