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

29.05.2016, 13:19

Static Text (Listing 10.3.1&2)

Hallo erstmal,
ich habe am Anfang dieses Jahres mit der 4.Auflage von C++ für Spieleprogrammierer angefangen (Grün-Rotes cover). Ich habe fleißig programmiert hänge nun aber bei dem Listing 10.3.1 und 10.3.2 fest da beides sowohl der Button als auch der Text nicht erscheinen. Ich benutze Microsoft Visual Studio Express 2012 und mein Computer läuft auf Windows 8. Hier möchte ich noch einmal hinzufügen, dass ich mir sehr sicher bin das ich keinen Tippfehler habe.
Wäre nett wenn mir irgend jemand helfen könnte, oder jemand antworten könnte der diesen Fehler auch schon einmal bewältigen musste. Zudem könnten mir auch die Leute helfen die diesen Abschnitt im Buch schon geschafft haben indem sie mir sagen wo sie das Listing 10.3.1 & 10.3.2 eingefügt haben z.B. nach : //Programm beenden
return (int)(message.wParam);
etc.
Ich freue und bin dankbar für jede Antwort und wünsche euch noch vil erfolg beim programmieren ;)

return 0;

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

29.05.2016, 14:38

Dann zeig doch am besten mal deinen Code. Irgendwas wirst du bei dir ja falsch machen. So können wir nur raten woran es liegt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

29.05.2016, 16:38

Gerne!

Ach ja stimmt wollte ich eigentlich machen habe ich dann jedoch vergessen.
Danke für den Reminder

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
132
133
134
135
136
137
138
139
140
141
#include <Windows.h>

//Prototype 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)
{
    WNDCLASSEX windowclass;
    HWND       hWnd;
    MSG        message;

    //Klassenname des Fensters ist frei wählbar
    const TCHAR szClassName[] = TEXT ("Erstes Fenster");

    //Struktur mit gewünsten Eigenschaften füllen

    //Größe der Struktur zwischenspeichern
    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 erweiterte 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 = LoadCursor (NULL, IDC_HELP);

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

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

    //KlassenName angeben
    windowclass.lpszClassName = szClassName;

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

        //Das Fenster erzeugen
        hWnd = CreateWindowEx (NULL,
                               szClassName,
                               TEXT("Mein erstes Fenster!"),
                               WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               300, 250,
                               NULL,
                               NULL,
                               hInst,
                               NULL);

    //Prüfen ob alles glatt ging
    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);

    }

        //Id des Child-Fensters
    #define ID_BEISPIELBUTTON 4001

    //Handle für den statischen Text
    HWND hButton;

    // Statischen Text als Child-Fenster erstellen
    hButton = CreateWindow (TEXT("BUTTON"),
                          TEXT("Beispieltext"),
                          BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                          90, 150,
                          95, 40,
                          hWnd,
                          (HMENU)ID_BEISPIELBUTTON,
                          hInst,
                          NULL);

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

}


//Callback-Funktion zur Nachrichtenverarbeitung
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
    //Messages auswerten
    switch (message)
    {
        //Fenster schließen? (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) );

}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »drakon« (29.05.2016, 17:21)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

29.05.2016, 17:22

@Clusame
Wir haben hier Code tags für Posts. Ich habe das jetzt mal für dich eingefügt. Sieht doch gleich viel übersichtlicher aus, nicht? ;)

5

29.05.2016, 17:41

Danke

Hey vielen Dank sieht sehr gut aus,
dass ist echt eine nützliche Funktion. Zudem bist du ja laut deinem Profil ein erfahrener Software developer, finde ich sehr interessant. Kennst du jedoch vielleicht eine Lösung für mein Code Problem?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

29.05.2016, 19:27

Als jemand der kaum praktische Erfahrung mit der WinAPI selbst hat, du gehst in deine Nachrichtenschleife in Zeile 73. Das ist die Schleife die während der Dauer deines Programms läuft und die Nachrichten verarbeitet. Aber erst danach erstellst du die Sachen für das Childwindow. Das wird aber erst ausgeführt wenn die Schleife verlassen wird. Das sollte dann erst passieren wenn dein Programm geschlossen wird.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

29.05.2016, 22:02

Im übrigen. Der Part über WinAPI ist meiner Meinung nach auch nicht besonders wichtig in dem Buch. Im Normalfall wirst du Code auf dieser Ebene nicht selbst schreiben müssen sondern nimmst Frameworks die dir das abnehmen. Das was du in dem Kapitel lernst ist halt auch nur für Windows. Bei Linux oder Mac müsstest du anderen Code schreiben um Fenster zu verwalten etc. Später im Buch geht es ja zum Beispiel um SDL. Das nimmt dir dann die Erzeugung eines Fensters ab. Ist sicherlich nett das mal gesehen zu haben, für das spätere Leben aber vermutlich eher unwichtig.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

8

30.05.2016, 05:55

Fensterkinder sollten auch in der WM_create Nachricht erstellt werden.

Werbeanzeige