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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

11.12.2015, 18:40

[C++ | WINAPI] Fehler beim Erstellen eines Childfensters

Hallo Leute,

@SlyGamer72HD und ich programmieren gerade ein Programm, wo man alle DirectX 11 Befehle eintragen kann (und wieder anzeigen). Außerdem soll die Beschreibung auch angegeben werden. Wir stehen am Anfang, also wir haben einen Button, der ein Childfenster erstellen lassen soll, in dem der Befehl und die Beschreibung angegeben werden kann. Hier der entsprechende 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
    //Create the Child window
    HWND_CHILD_New = CreateWindow(NULL,
        TEXT("TEST"),
        WS_VISIBLE | WS_CHILD | WS_BORDER,
        50, 50,
        500, 500,
        hwnd,
        (HMENU)ID_CHILD_NEW,
        G_hInstance,
        NULL);

    if (HWND_CHILD_New) //Nur zum Test
    {
        //Create the Editbox
        HWND_BUTTON_Add = CreateWindow(TEXT("EDIT"),
            TEXT("Bitte neuen Befehl eingeben"),
            WS_VISIBLE | WS_CHILD | WS_BORDER,
            150, 150,
            300, 20,
            HWND_CHILD_New,
            (HMENU)ID_BTN_ADD,
            G_hInstance,
            NULL);
    }


Leider wird das Childfenster nicht erstellt. Was habe ich falsch gemacht?
Danke im Voraus :)

2

11.12.2015, 19:01

Aus welcher Fensterklasse wird es denn erstellt?

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

3

11.12.2015, 19:05

Aus welcher Fensterklasse wird es denn erstellt?

Das ist eine Funktion, welche einen Paramterter names HWND erwartet:

C-/C++-Quelltext

1
void CreateChildWindow_New(HWND hwnd){...}


Aufgerufen wird es in der CALLBACK und dort wird das HWND übergeben. Meintest du das?

EDIT: So haben wir das geändert: (Es klappt immernoch nicht, da die MessageBox erscheint)

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
        WNDCLASS wc;

    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = G_hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = G_AppName;

    //Register the ChildWindow
    if (!RegisterClass(&wc))
    {
        int result = MessageBox(NULL, TEXT("Could not register the ChildWindow_New"), TEXT("Error"), MB_OK | MB_ICONERROR);
        if (result == IDOK)
        {
            PostQuitMessage(0);
        }
    }

    //Create the Child window
    HWND_CHILD_New = CreateWindow(TEXT("Test"),
                                TEXT("TEST"),
                                WS_VISIBLE | WS_CHILD | WS_BORDER | WS_OVERLAPPEDWINDOW,
                                50, 50,
                                500, 500,
                                hwnd,
                                (HMENU)ID_CHILD_NEW,
                                G_hInstance,
                                NULL);

    //Create the Editbox
    HWND_BUTTON_Add = CreateWindow(TEXT("EDIT"),
                                TEXT("Bitte neuen Befehl eingeben"),
                                WS_VISIBLE | WS_CHILD | WS_BORDER,
                                150, 150,
                                300, 20,
                                HWND_CHILD_New,
                                (HMENU)ID_BTN_ADD,
                                G_hInstance,
                                NULL);

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »cojo2015« (11.12.2015, 19:47)


4

11.12.2015, 20:46

Du musst halt darauf achten dass Argument 1 von CreateWindow derselbe ist wie der Name der Fensterklasse... G_AppName müsste also "Test" sein.

5

11.12.2015, 20:57

Du musst halt darauf achten dass Argument 1 von CreateWindow derselbe ist wie der Name der Fensterklasse... G_AppName müsste also "Test" sein.

Hab es gerade ausprobiert aber klappt immernoch nicht. Er kriegt den Fehler nicht beim ChildWindow sondern beim Registrieren der WNDCLASS

Hier ruft er die MessageBox auf, weil etwas nicht geklappt hat.

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
WNDCLASS wc;

    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = G_hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = G_AppName;

    //Register the ChildWindow
    if (!RegisterClass(&wc))
    {
        int result = MessageBox(NULL, TEXT("Could not register the ChildWindow_New"), TEXT("Error"), MB_OK | MB_ICONERROR);
        if (result == IDOK)
        {
            PostQuitMessage(0);
        }
    }

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

11.12.2015, 21:00

Was sagt GetLastError()?

7

11.12.2015, 21:13

Was sagt GetLastError()?

Wie sollte ich das am besten hineinfügen?
Gleich vor der Fehlerstelle?

Und wo sehe ich die Ausgabe?

8

11.12.2015, 21:17

GetLastError liefert dir einen erweiterten Fehlercode der letzten WinAPI-funktion zurück. Unter VisualStudio kannst du auch nach der Anweisung einen Breakpoint setzen und im Debugmodus, wenn dieser erreicht wurde, schreibst du in das Watch-Window für Variablen den Pseudonamen @err,hr hinein, was zum Code und zugehöriger Fehlerbeschreibung von GetLastError evaluiert.

9

11.12.2015, 21:19

Habe es mal in die If Schleife eingebaut.

C-/C++-Quelltext

1
2
3
4
5
if (result == IDOK)
        {
            MessageBox(hwnd, (LPCWSTR)GetLastError(), TEXT("Error"), MB_OK);
            PostQuitMessage(0);
        }


Bekommen aber in der MessageBox keine Ausgabe.
Liegt es daran, dass ich GetLastError() in ein LPCWSTR umwandeln muss?

PS: Ohne das LPCWSTR würde es nicht funktionieren, weil es ein DWORD ist

10

11.12.2015, 21:21

:crazy: Na klar, einfach mal nen zahlenwert in einen Zeiger auf nen string casten.
Btw http://www.if-schleife.de/

Werbeanzeige