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

CW_Kovok

Alter Hase

  • »CW_Kovok« ist der Autor dieses Themas

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

1

02.10.2005, 12:14

Warum schließt der Prozess nicht?

Ich habe hier ein ganz simples Fenster:

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

const char pcAppName[] = "Testapplication";

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInst,
                   HINSTANCE hPrevInst,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    HWND        hWnd;
    MSG         msg;
    WNDCLASSEX  wc;

    wc.cbClsExtra       = 0;
    wc.cbSize           = sizeof(WNDCLASSEX);
    wc.cbWndExtra       = 0;
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor          = LoadCursor(hInst, IDC_ARROW);
    wc.hIcon            = LoadIcon(hInst, IDI_APPLICATION);
    wc.hIconSm          = LoadIcon(hInst, IDI_APPLICATION);
    wc.hInstance        = hInst;
    wc.lpfnWndProc      = WndProc;
    wc.lpszClassName    = pcAppName;
    wc.lpszMenuName     = NULL;
    wc.style            = CS_HREDRAW | CS_VREDRAW;

    if(!(RegisterClassEx(&wc)))
    {
        MessageBox(0, "Konnte Fensterklasse nicht initialisieren", pcAppName, MB_OK | MB_ICONASTERISK);
        return 0;
    }

    if(!(hWnd = CreateWindow(pcAppName,
                             pcAppName,
                             WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             0,
                             0,
                             hInst,
                             0)))
    {
        MessageBox(0, "Konnte Fenster nicht erstellen", pcAppName, MB_OK | MB_ICONASTERISK);
        return 0;
    }

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, hWnd, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
        {
            return 0;
        }

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

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


wieso schließt bei Programmende der zugehörige Prozess nicht(macht er bei meinen anderen Programmen auch nich mehr, aber da dachte ich auch noch ich hätte andere Fehler). Habe vor kurzem Computer und Betriebsystem gewechselt, aber daran kann es nich liegen, oder?

CW_Kovok

Alter Hase

  • »CW_Kovok« ist der Autor dieses Themas

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

2

02.10.2005, 19:17

Danke, danke scheint zu funktionieren, kannst du mir sagen warum meine Version nich klappt?

//EDIT
häh wieso ist denn deine Antwort verschwunden?

Danny

Frischling

Beiträge: 40

Wohnort: Hamburg

  • Private Nachricht senden

3

02.10.2005, 19:23

Wessen Antwort?!?!?!? ???
Google ist dein Freund und Helfer!

CW_Kovok

Alter Hase

  • »CW_Kovok« ist der Autor dieses Themas

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

4

02.10.2005, 20:00

ich weiß nich mehr, ich hatte glücklich über eine antwort die dinge umgesetzt und beim zurückkehren ins forum war die antwort dann weg

jedenfalls sagt dieser jenige, dass ich WM_DESTROY in WM_Close ändern sollte und das DefWindowProc in den default zweig der switch anweisung, was dann ja auch funktioniert hat, also wer immer das war danke

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

02.10.2005, 20:19

1.) Die Antworten sind richtig

weil

1.a) Wenn man auf das X klickt eine WM_CLOSE Mesage augewurfen wird, nicht WM_DESTROY
1.b.) Es muss in den default Zweig weil sonst alle Nachrichten von Windows behandelt werden, auch wenn du sie handelst.

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

6

02.10.2005, 20:43

C-/C++-Quelltext

1
2
3
4
5
        case WM_DESTROY: 
        { 
            PostQuitMessage(0); 
            return 0; 
        }


überall das return 0; weg! ersetz es wenn durch break. Sonst kann DefWindowProc nicht ausgeführt werden bei WM_DESTROY um den Prozess zu beenden.

CW_Kovok

Alter Hase

  • »CW_Kovok« ist der Autor dieses Themas

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

7

02.10.2005, 20:52

habs geändert in

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
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
        {
            break;
        }

        case WM_PAINT:
        {
            break;
        }

        case WM_CLOSE:
        {
            PostQuitMessage(0);
            break;
        }
        
        default:
        {
            return DefWindowProc(hWnd, msg, wParam, lParam);
        }
    }
}


ist das besser so?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

02.10.2005, 22:28

wenn du wm_Create und Paint nicht bahndelst, lass se wech

9

04.10.2005, 16:24

Zitat von »"CW_Kovok"«

häh wieso ist denn deine Antwort verschwunden?
Sorry, war meine. Ich hab das nochmal ausprobiert und einige Punkte hatten sich da glaub ich eruebrigt. Aber ich hatte in etwa folgendes:
- PostQuitMessage(0) in WM_CLOSE aufrufen, statt in WM_DESTROY
- DefWindowProc in den Default-Zweig setzen
- hinter jeden case-Zweig ein break setzen
Mein Projekt: Rise of the Sylvan

Werbeanzeige