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

Korowai

unregistriert

1

05.12.2015, 02:42

WINAPI- Buttons

Hi, ich habe folgendes Problem.

Ich arbeite gerade Petzold durch und habe ein Programm erstelllt, bei dem Buttons weitere Buttons erscheinen lassen.
Durch das Anwählen eines Buttons kehrt man wieder zu den anfänglichen Buttons zurück. Das funktioniert allerdings nur einmal.
Beim zweiten Durchlauf verschwindet die zweite Buttonspalte nicht mehr.

Was habe ich da vergessen?

Hier der Code:

Quellcode

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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int Menuident=0;

#define IDM_FILE_NEW 1
#define IDM_FILE_OPEN 2
#define IDM_FILE_SAVE_AS 3
#define IDM_FILE_QUIT 4

#define ID_FUHRPARK 5
#define ID_BASIS 6
#define ID_MARKT 7
#define ID_ARSENAL 8
#define ID_APPLIKATION 9
#define ID_KRIEG 10
#define ID_SCHUERF 11
#define ID_INFO 12
#define ID_RUNDENENDE 13

#define ID_MOBILSICHT 14
#define ID_MOBILNEU 15
#define ID_MOBILVERKAUF 16
#define ID_MOBILMODI 17
#define ID_MOBILWECHSEL 18
#define ID_MOBILFABRIKPRODUKT 19
#define ID_MOBILMENUVERLASSEN 20

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
    {
        srand(time(0));
       static TCHAR szAppName[]=TEXT ("EXO 1.2");
        HWND hwnd;
        MSG msg;
        WNDCLASS wndclass;

        wndclass.style=CS_HREDRAW|CS_VREDRAW;
        wndclass.lpfnWndProc=WndProc;
        wndclass.cbClsExtra=0;
        wndclass.cbWndExtra=0;
        wndclass.hInstance=hInstance;
        wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor= LoadCursor (NULL, IDC_ARROW);
        wndclass.hbrBackground=(HBRUSH) GetStockObject (BLACK_BRUSH);
        wndclass.lpszMenuName="Root";
        wndclass.lpszClassName=szAppName;

        if (!RegisterClass (&wndclass))
        {
            MessageBox(NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
                       szAppName, MB_ICONERROR);
                       return 0;
        };

       // hMenu=LoadMenu(hInstance, "Root");

        hwnd=CreateWindow (szAppName,
                           TEXT ("EXO Version 1.2"),
                           WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                           0,
                           0,
                           1400,
                           800,
                           NULL,
                           NULL,
                           hInstance,
                           NULL);

        ShowWindow (hwnd, iCmdShow);
        UpdateWindow (hwnd);

        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        rect.right=220;
            rect.left=20;
            rect.top=20;
            rect.bottom=380;

   switch (msg)
        {
    case WM_CREATE:
       {
        Hauptmenue(hwnd);
        CreateWindow(TEXT("button"),"Fuhrpark",WS_CHILD|WS_VISIBLE,
                    20, 20, 200, 40, hwnd, (HMENU) ID_FUHRPARK, NULL,NULL);
        CreateWindow(TEXT("button"),"Basis",WS_CHILD|WS_VISIBLE,
                     20,80,200,40,hwnd,(HMENU) ID_BASIS,NULL,NULL);
        CreateWindow(TEXT("button"),"Markt",WS_CHILD|WS_VISIBLE,
                     20,140,200,40,hwnd,(HMENU) ID_MARKT,NULL,NULL);
        CreateWindow(TEXT("button"),"Arsenal",WS_CHILD|WS_VISIBLE,
                     20,200,200,40,hwnd,(HMENU) ID_ARSENAL,NULL,NULL);
        CreateWindow(TEXT("button"),"Applikation",WS_CHILD|WS_VISIBLE,
                     20,260,200,40,hwnd,(HMENU) ID_APPLIKATION,NULL,NULL);
        CreateWindow(TEXT("button"),"Kriegsaktion",WS_CHILD|WS_VISIBLE,
                     20,320,200,40,hwnd,(HMENU) ID_KRIEG,NULL,NULL);
        CreateWindow(TEXT("button"),"Schürfaktion",WS_CHILD|WS_VISIBLE,
                     20,380,200,40,hwnd,(HMENU) ID_SCHUERF,NULL,NULL);
        CreateWindow(TEXT("button"),"Info",WS_CHILD|WS_VISIBLE,
                     20,440,200,40,hwnd,(HMENU) ID_INFO,NULL,NULL);
        CreateWindow(TEXT("button"),"Runde",WS_CHILD|WS_VISIBLE,
                     20,500,200,40,hwnd,(HMENU) ID_RUNDENENDE,NULL,NULL);

        UpdateWindow(hwnd);
             ShowWindow(hwnd,1);
            EnableWindow(hwnd,TRUE);


       }
        break;
case WM_COMMAND:
            //hMenu=GetMenu(hwnd);
            switch (LOWORD(wParam))
            {
            case IDM_FILE_NEW:
                {
                    Spielstart(hwnd);
                    Basismenu(hwnd);
                };
                break;
            case IDM_FILE_OPEN:
                Spielladen(hwnd);
                break;
            case IDM_FILE_SAVE_AS:
                Spielspeichern(hwnd);
                break;
            case IDM_FILE_QUIT:
                SendMessage(hwnd, WM_CLOSE,0,0);
                return 0;
            case ID_FUHRPARK:
                {


        EnableWindow(GetDlgItem(hwnd, ID_FUHRPARK), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_BASIS), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MARKT), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_ARSENAL), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_APPLIKATION), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_KRIEG), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_SCHUERF), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_INFO), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_RUNDENENDE), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_BASIS), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MARKT), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_ARSENAL), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_APPLIKATION), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_KRIEG), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_SCHUERF), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_INFO), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_RUNDENENDE), FALSE);
        CreateWindow(TEXT("button"),"Mobil Übersicht",WS_CHILD|WS_VISIBLE,
                    20, 20, 200, 40, hwnd, (HMENU) ID_MOBILSICHT, NULL,NULL);
        CreateWindow(TEXT("button"),"Neues Mobil",WS_CHILD|WS_VISIBLE,
                    20, 80, 200, 40, hwnd, (HMENU) ID_MOBILNEU, NULL,NULL);
        CreateWindow(TEXT("button"),"Mobil verkaufen",WS_CHILD|WS_VISIBLE,
                    20, 140, 200, 40, hwnd, (HMENU) ID_MOBILVERKAUF, NULL,NULL);
        CreateWindow(TEXT("button"),"Mobil Marktmodifikation",WS_CHILD|WS_VISIBLE,
                    20, 200, 200, 40, hwnd, (HMENU) ID_MOBILMODI, NULL,NULL);
        CreateWindow(TEXT("button"),"Mobil verlagern",WS_CHILD|WS_VISIBLE,
                    20, 260, 200, 40, hwnd, (HMENU) ID_MOBILWECHSEL, NULL,NULL);
        CreateWindow(TEXT("button"),"Mobil Fabrikmodifikation",WS_CHILD|WS_VISIBLE,
                    20, 320, 200, 40, hwnd, (HMENU) ID_MOBILFABRIKPRODUKT, NULL,NULL);
        CreateWindow(TEXT("button"),"Mobilmenü verlassen",WS_CHILD|WS_VISIBLE,
                    20, 380, 200, 40, hwnd, (HMENU) ID_MOBILMENUVERLASSEN, NULL,NULL);

                }
                break;
case ID_MOBILMENUVERLASSEN:
          //  Basismenu (hwnd);



        EnableWindow(GetDlgItem(hwnd, ID_MOBILSICHT), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MOBILNEU), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MOBILVERKAUF), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MOBILMODI), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MOBILWECHSEL), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MOBILFABRIKPRODUKT), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_MOBILMENUVERLASSEN), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILSICHT), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILNEU), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILVERKAUF), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILMODI), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILWECHSEL), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILFABRIKPRODUKT), FALSE);
        ShowWindow(GetDlgItem(hwnd, ID_MOBILMENUVERLASSEN), FALSE);
        EnableWindow(GetDlgItem(hwnd, ID_FUHRPARK), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_BASIS), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_MARKT), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_ARSENAL), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_APPLIKATION), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_KRIEG), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_SCHUERF), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_INFO), TRUE);
        EnableWindow(GetDlgItem(hwnd, ID_RUNDENENDE), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_BASIS), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_MARKT), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_ARSENAL), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_APPLIKATION), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_KRIEG), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_SCHUERF), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_INFO), TRUE);
        ShowWindow(GetDlgItem(hwnd, ID_RUNDENENDE), TRUE);
        UpdateWindow(hwnd);
            break;
       }
            break;


        case WM_PAINT:


            UpdateWindow(hwnd);
            ShowWindow(hwnd,1);

            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }

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


Kann mir da jemand weiter helfen? Es muss da noch etwas geben, dass ich in Petzolds Buch übersehen habe oder falsch verstanden habe.

Danke

Korowai

unregistriert

2

05.12.2015, 12:11

Hi,

ich habe die Lösung gefunden.

Ich habe irrtümlicherweise die Child- Windows nicht in WM_CREATE erstellt.

Wenn man den Code umstellt, und in der switch VErzweigung mit ShowWindow und EnableWindow arbeitet, geht es.