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

07.11.2005, 17:13

Mehrere Fenster hintereinander

Tag Leute,
hab schon die Suchen-Funktion benutzt, aber nichts gefunden.
Also, ichhab vor:
- Ein Fenster erzeugen (kein Problem)
-Dadrauf einen "Volk auswählen-Button erstellen (Auch kein Problem)
-Jetzt kommts: Wenn man auf den Button klickt, soll ein neues Fenster aufgehen, mit 2 Buttons z. B. "Römer" oder "Barbaren".
Soll ich dann die Fenster und Buttons in der Callbackfunktion erstellen, oder was? Doch wohl kaum.
Ich hoffe, ihr könnt mir weiterhelfen.
Wenn der Knecht vom Dache pieselt,
denkt der Bauer: Oh, es rieselt

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

07.11.2005, 17:42

z.b. wäre ein Dialog möglich ansonsten in der Calback und zwar der WM_CREATE Message.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

07.11.2005, 18:56

Was genau meinst du denn mit Dialog?
In der Callback-Funktion hab ich immer so nen scheis fehler.
wenn ichs mittels CreateWindowEx mache. Muss ich da was mit hWnd anstellen?
Kennt ihr vielleicht ein gutes Tut oder Beispielquellcode? ???
Wenn der Knecht vom Dache pieselt,
denkt der Bauer: Oh, es rieselt

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

07.11.2005, 19:21

Wegen Dialog: schau besser ins Inet oder schnapp dir nen Buch.
Wegen der Callback-Funktion der Fehler liegt wohl auf deiner Seite, aber wir können dir gerne helfen, du muss uns nur den Codeauschnitt zeigen.
Wegen Tuts schau mal ins FAQ
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

07.11.2005, 20:02

Hier ist ein Dialog Anwendung.

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
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
#include <windows.h>
#include "resource.h"

// Weitere Resourcen Definition

#define ID_BUTTON1 2001

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL    CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

// Hauptfunktion

//-----------------------------------------------------

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
            LPSTR lpCommandLine, int iCmdShow)
{
    
    HWND        hWnd;
    MSG         msg;
    WNDCLASS    wndclass;

    // Fensterklasse erstellen, dazu UniCode benutzen */


    wndclass.style =            CS_VREDRAW | CS_HREDRAW;            // Style

    wndclass.lpszMenuName =     NULL;                               // Kein Menü

    wndclass.lpszClassName =    TEXT("Testprogramm");               // ProzessName

    wndclass.cbClsExtra =       0;                                  // Keine Extras

    wndclass.cbWndExtra =       0;
    wndclass.hbrBackground =    (HBRUSH)GetStockObject(LTGRAY_BRUSH);// Grauer Hintergrund

    wndclass.hCursor =          LoadCursor(hInstance, IDC_ARROW);   // Standart Cursor

    wndclass.hIcon =            NULL;                               // Kein Icon

    wndclass.hInstance =        hInstance;                          // Die Instanz

    wndclass.lpfnWndProc =      WndProc;                            // An diese Funktion werden unsere

                                                                    // Nachrichten geschickt

    
    // Das ganze nun Registrieren

    if(!RegisterClass(&wndclass))
    {
        // Die einzig vernünftige Fehlermgl. kann nur UniCode sein

        MessageBox(NULL, "Bitte benutzen Sie eine Windows Version ab NT.", "Fatal Error", MB_OK);
    }

    // Nun erstellen wir ein Fenster, dort ist im Moment nichts weiter als ein Rechteck

    // mit Symbolleiste. Das ist im Moment aber nur eine INTERE Datenstruktur

    hWnd = CreateWindow(TEXT("Testprogramm"),
                        TEXT("TestProgramm"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, 
                        NULL, 
                        hInstance,
                        NULL);

    // die wir hiermit anzeigen ;)

    ShowWindow(hWnd, iCmdShow);

    // Diese Nachricht schickt u.a. eine WM_PAINT Nachricht. Damit werden Elemente,

    // die wir vllt. noch in WM_PAINT benutzen gemalt.

    UpdateWindow(hWnd);

    // die Nachrichtenwarteschlange

    while(GetMessage(&msg, NULL, 0, 0))
    {
        // Dient zur Umsetzung von einige Tastaturbefehlen, nicht 

        // unbedingt notwenig jetzt

        TranslateMessage(&msg);

        // Verteilung der Nachrichten

        DispatchMessage(&msg);
    }
}

// Windows Prozedur

//-----------------------------------------------------------------------

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hButton;
    static HINSTANCE hInstance;
    
    switch(message)
    {
    case WM_CREATE:
        // Die Instanz ermittel, die brauchen wir, so können

        // wir globale Variablen sparen

        hInstance = ((LPCREATESTRUCT)lParam)->hInstance;

        // Eine Schaltfläche erstellen

        hButton = CreateWindow( TEXT("button"),
                                TEXT("Eine sehr schöne Schaltfläche"),
                                BS_FLAT | WS_CHILD | WS_VISIBLE,
                                10, 10, 
                                250, 23,
                                hWnd,
                                (HMENU)ID_BUTTON1,
                                hInstance,
                                NULL);
        break;
    case WM_COMMAND:
        // Die Nachrichten Abfangen die einzelne Steuerelemente uns schicken

        // Oder auch Maus oder Tastatur

        switch(LOWORD(wParam))
        {
        case ID_BUTTON1:
            // So nun hier einen Dialog starten

            // da gibt es zwei Möglichkeiten, ich benutz hier die gebrääuchlichere

            // Das man einen Resourceneditor benutzt und dort die Dialoge sich "zusammen-

            // klickt". Natürlich ist das ganze dann auch wieder Text, daraus folgt das 

            // man das ganze auch selber schreiben kann, was sehr selten auch nützlich 

            // ist.

            // Visual Studio hhat einen sehr guten Editor mit dabei, dieser erzeugt rc 

            // Dateien, man kann diese mit einem Texteditor öffnen, in diesem Fall

            // kommt dies bei raus

            /*
            IDD_DIALOG DIALOGEX 0, 0, 246, 70
            STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | 
                WS_CAPTION | WS_SYSMENU
            CAPTION "Ein schnell zusammengeklickter Dialog"
            FONT 8, "MS Shell Dlg", 400, 0, 0x1
            BEGIN
                DEFPUSHBUTTON   "OK",IDOK,7,49,50,14
                PUSHBUTTON      "Abbrechen",IDCANCEL,189,49,50,14
            END
            */
            // Den anderen Müll braucht man nicht unbedingt und ist zu großem Teil nur 

            // für den Editor an sich da.

            //

            // WEITERES zu DIALOGEN

            // Es gibt zwei Arten: 

            // -> Modullose Dialoge

            // -> Modulare Dialoge

            // Modullose Dialoge können weitere Dialoge öffnen, im Gegensatz zu den

            // modullaren. Moduallare erstellt man mit DialogBox und Modullose mit 

            // Create Dialog.


            DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hWnd, DlgProc);
            break;
        };

        break;
    case WM_CLOSE:
        // Wir wollen das Fenster schließen

        // Dazu schicken wir eine Nachricht

        SendMessage(hWnd, WM_DESTROY, 0, 0);
        break;
    case WM_DESTROY:
        // Programm beenden

        PostQuitMessage(0);
        break;
    };

    // Bearbeitung aller Nachrichten um die wir uns nicht kümmern wollen

    return DefWindowProc(hWnd, message, wParam, lParam);
}

// Dialog Prozedur

//-----------------------------------------------------------------------

BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDOK:
            // Nur bei DialogBox!

            EndDialog(hWnd, 0);
        break;
        };
        break;
    };
    return FALSE;
}


Nutz CreateDialog(...) statt dialog Box und lies dir den Text über DialogBox mal durch.

6

08.11.2005, 16:01

Danke für die guten und schnellen Antworten allerseits.
Wenn der Knecht vom Dache pieselt,
denkt der Bauer: Oh, es rieselt

Werbeanzeige