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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

12.05.2014, 15:18

Verwende entweder TCHAR oder die zu den jeweiligen Zeichentypen passenden Funktionen (CreateWindowExA für char Strings und CreateWindowExW für wchar_t Strings). ;)

12

12.05.2014, 15:38

hm. habe es mal mit CreateWindowExA probiert. die fehler die mir intellisense entgegen schmeißt sind zwar weg, aber scheinbar hat mein compiler probleme mit meinem "=" operator


(Link)


EDIT: Huch, da hab ich die zweite fehlermeldung weg geschnitten.
"Ein Wert vom Typ ""const char*"" kann keiner Entität vom Typ ""LPCWSTR"" zugewiesen werden."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

12.05.2014, 15:40

Du musst natürlich auch WNDCLASSEXA und RegisterClassA etc. verwenden...

Rein prinzipiell gibt es von allen WinAPI Funktionen, die von Internationalisierung betroffen sind, eine *A und eine *W Variante. Die *A Variante nimmt ANSI char Strings und tut diese in der Regel intern in wchar_t Strings übersetzen, die *W Variante nimmt direkt wchar_t Strings entgegen. Wenn du char Strings verwenden willst, musst du durchgehend die *A Varianten verwenden. Die Varianten ohne einem A oder W hinten dran sind einfach nur Makros, die, je nachdem ob UNICODE defined ist, entweder zur *A oder zur* W Variante werden...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (12.05.2014, 15:45)


14

12.05.2014, 15:45

upps ^^
Jetzt funktioniert zwar das Fenster, jedoch stehen in der Titelleiste lauter Asiatische Schriftzeichen :D
bei ClassExW bleibt die Fehlermeldung

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

12.05.2014, 15:46

Lass mich raten, du hast jetzt einfach irgendwo per Cast dem Compiler den Mund zugeklebt, anstatt das Problem zu beheben? ;)

16

12.05.2014, 15:47

nein :D
ich habe alle WNDCLASSEX mit WNDCLASSEXA und RegisterClassEx mit RegisterClassExA respektive W ersetzt ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

12.05.2014, 15:49

Wo verwendest du die W Varianten? Wieso vermischt du *A mit *W? Zeig mal den relevanten Code, so wie er jetzt ist...

18

12.05.2014, 16:00

vermischt habe ich garnichts. ich habe beides separat ausprobiert

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // Fensterklasse registrieren
    if (!RegisterClassExA(&windowclass))
        return (0);

    // Das Fenster erzeugen
    hWnd = CreateWindowExA(NULL,
        szClassName,
        "Das erste Fenster!",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        100, 100,
        300, 250,
        NULL,
        NULL,
        hInst,
        NULL);

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
    LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEXA windowclass;        // Struktur für Fenstereigenschaften
    HWND hWnd;                  // Fenster-Handle
    MSG message;                // Nachricht

    // Der Klassenname des Fensters ist frei wählbar
    const char szClassName[] = "erstes Fenster";

    // Struktur mit gewünschten Eigenschaften füllen
    //

    // Größe der Struktur zwischenspeichern
    windowclass.cbSize = sizeof (WNDCLASSEXA);


das sind alle stellen in der CLASSEX vorkommt

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tomahawk145« (12.05.2014, 16:07)


19

12.05.2014, 18:03

Du hast vermutlich in den Projekteinstellungen einen Zeichensatz ausgewählt, der nicht mit deinem verwendeten String-Literalen übereinstimmt.

Da du vorher keine expliziten WinAPI Funktionen verwendet hast, sondern deren Makros, die nach den Projekteinstellungen die ~A oder ~W Funktion aufrufen, und der Compiler einen Error ausgespuckt hat, gehe ich davon aus, dass du auf Unicode in den Projekteinstellungen umgestellt hast.

Wenn du, wie ich annehme, Unicode im gesamten Projekt verwenden möchtest, musst du das in Projekt > Eigenschaften > Allgemein > Zeichensatz umstellen und entsprechende Datentypen verwenden:

C-/C++-Quelltext

1
2
3
const wchar_t* szClassName = L"MyClass";
WNDCLASS wc; // wird zu WNDCLASSW getypedef'd
wc.lpszClassName = szClassName;


Wenn du hingegen Multibyte verwenden möchtest:

C-/C++-Quelltext

1
2
3
const char* szClassName = "MyClass";
WNDCLASS wc; // wird zu WNDCLASSA getypedef'd
wc.lpszClassName = szClassName;
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »iSmokiieZz« (12.05.2014, 18:17)


20

12.05.2014, 18:42

hm funktioniert leider immernoch nicht..
hier mal der ganze code:

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// 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);

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

    // Der Klassenname des Fensters ist frei wählbar
    const wchar_t* szClassName[] = "erstes Fenster";

    // Struktur mit gewünschten Eigenschaften füllen
    //

    // Größe der Struktur zwischenspeichern
    windowclass.cbSize = sizeof (WNDCLASSEXW);

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

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

    // Keine erweiterten Einstellungen
    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;

    // Instanz speichern
    windowclass.hInstance = hInst;

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

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

    // Ein Menü brauchen wir nicht
    windowclass.lpszMenuName = NULL;

    // Klassenname angeben
    windowclass.lpszClassName = szClassName;

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

    // Das Fenster erzeugen
    hWnd = CreateWindowExW(NULL,
        szClassName,
        "Das erste Fenster!",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        100, 100,
        300, 250,
        NULL,
        NULL,
        hInst,
        NULL);

    // Prüfen, ob alles glattging
    if (hWnd == NULL)
        return (0);

    // Der "Herzschlag" des Programms.
    // Hier werden alle Nachrichten abgeholt,
    // übersetzt und weitergeleitet
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);

    }

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

} // WinMain


// Callback-Funktion zur Nachrichtenverarbeitung
//
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam)
{
    // Messages auswerten
    switch (message)
    {
        // Fenster schliessen? (Auch Alt-F4)
    case WM_DESTROY:
    {
        // Nachricht zum Beenden schicken
        PostQuitMessage(0);
        return (0);

    }

        // 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;
    }

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

} // WindowProc


habe ich was vergessen? stehe gerade wie der ochse vom berg, habt bitte geduld :wacko:

Werbeanzeige