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

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

1

26.12.2008, 17:53

Problem mit Win-API

Hallo,
ich habe mir heute einen ganz simplen Sourcecode geschrieben, um ein einfaches Fenster zu erzeugen. Leider kann ich das ausgeführte Script nur durch die Task-Leiste und durch Alt-F4 beenden.
Hier ist der 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
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
#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    char szClassName[] = "HelloWin";
    HWND hwnd;
    MSG msg;
    WNDCLASS wc;
    
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szClassName;
    
    if(!RegisterClass(&wc))
    {
            MessageBox(NULL, "FEHLER", "FEHLER!!!", MB_OK);
    }
    
    hwnd = CreateWindow (szClassName,
                         "HALLO WINDOWS!!!",
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         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 message, WPARAM wParam, LPARAM lParam)
{
        
        switch(message)
        {
               case WM_DESTROY:
                    {
                               PostQuitMessage(0);
                               return 0;
                    }
         }
         DefWindowProc(hwnd, message, wParam, lParam);
}

Was ist daran falsch? Ich habe auch schon im Internet gesucht aber nichts gefunden. Bitte helft mir!!! Schonmal DANKE im Voraus. :D
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

26.12.2008, 18:02

http://msdn.microsoft.com/en-us/library/ms632617(VS.85).aspx

Anonymous

unregistriert

3

26.12.2008, 18:15

Deine Fensterprozedur ist falsch. Du gibst nicht den Wert der Default-Fensterprozedur wieder. WM_CLOSE benötigt man nicht, da das die Default-Fensterprozedur regelt, was sie aber aktuell nicht tun kann, weil dein Code fehlerhaft ist.

p.s.: Nenne es nicht Script! Das kannste bei PHP aber nicht bei C++

p.p.s.: Dann was ich mich seit über einem Jahrzehnt frage ist, welcher Hornochse in dieser großen weiten Welt, kam auf die Idee bei Prototypen keine Variablennamen zu schreiben? Den sollte man auf die Straße werfen und erschießen.

Anonymous

unregistriert

4

26.12.2008, 18:23

Hier hast du mal einen anständigen Code um ein Fenster zu erzeugen:

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
// \file:       main.cpp

// ###########################################################################

// \created:    26.12.2008

// \author:     Patrick Ullmann

// \purpose:    Hauptdatei.

// ###########################################################################

// \changes:

//

//  1           26.12.2008/Patrick Ullmann

//      Datei erstellt.

// ###########################################################################


// I N C L U D E S ###########################################################

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>

// F U N K T I O N E N #######################################################


// ///////////////////////////////////////////////////////////////////////////

// LOCAL

//

// Implementierung der Fenster-Nachricht: WM_CREATE.

//

// \param hwnd: Handle auf das Fenster, dem diese Message zugewiesen ist.

// \param create_struct: Daten für die Erstellung des Fensters.

// \result: 'true' wenn alles in Ordnung war, ansonsten 'false'.

// ///////////////////////////////////////////////////////////////////////////

bool on_create (::HWND hwnd, CREATESTRUCT* create_struct)
{
    return (true);
}

// ///////////////////////////////////////////////////////////////////////////

// LOCAL

//

// Implementierung der Fenster-Nachricht: WM_DESTROY.

//

// \param hwnd: Handle auf das Fenster, dem diese Message zugewiesen ist.

// ///////////////////////////////////////////////////////////////////////////

void on_destroy (::HWND hwnd)
{
    ::PostQuitMessage (0);
}

// ///////////////////////////////////////////////////////////////////////////

// LOCAL

//

// Fenster-Prozedur.

//

// \param hwnd: Handle auf das Fenster, dem diese Prozedur zugewiesen ist.

// \param message: Message die Verarbeitet werden muss.

// \param wParam: wParam der Nachricht.

// \param lParam: lParam der Nachricht.

// \result: Status-Code der Fensterprozedur.

// ///////////////////////////////////////////////////////////////////////////

::LRESULT CALLBACK window_procedure (::HWND hwnd, ::UINT message, ::WPARAM wParam, ::LPARAM lParam)
{
    switch (message)
    {
    HANDLE_MSG (hwnd, WM_CREATE,    on_create);
    HANDLE_MSG (hwnd, WM_DESTROY,   on_destroy);
    }

    return (::DefWindowProc (hwnd, message, wParam, lParam));
}

// ///////////////////////////////////////////////////////////////////////////

// LOCAL

//

// Programmeinsprungspunkt.

//

// \param instance: Instanz des Programms.

// \param prev_instance: Vorherige Programminstanz (wird nicht mehr benutzt.)

// \param argument: Übergabeargumente an das Programm.

// \param show: SW_-Code des Programms.

// \result: Exit-Code.

// ///////////////////////////////////////////////////////////////////////////

int WINAPI _tWinMain (::HINSTANCE instance, ::HINSTANCE prev_instance, ::TCHAR* argument, int show)
{
    const ::TCHAR* name = _T ("test-fenster");

    ::WNDCLASSEX window_class;
    ::ZeroMemory (&window_class, sizeof (window_class));

    window_class.cbSize         = sizeof (window_class);
    window_class.style          = CS_VREDRAW | CS_HREDRAW;
    window_class.lpfnWndProc    = window_procedure;
    window_class.hInstance      = instance;
    window_class.hIcon          = ::LoadIcon (NULL, MAKEINTRESOURCE (IDI_APPLICATION));
    window_class.hCursor        = ::LoadCursor (NULL, IDC_ARROW);
    window_class.hbrBackground  = reinterpret_cast<::HBRUSH>(::GetStockObject (WHITE_BRUSH));
    window_class.lpszClassName  = name;

    if (!::RegisterClassEx (&window_class))
        return 0;

    ::HWND hwnd = NULL;
    if (!::IsWindow (hwnd = ::CreateWindowEx (0,
                                              name, name,
                                              WS_OVERLAPPEDWINDOW,
                                              CW_USEDEFAULT, CW_USEDEFAULT,
                                              CW_USEDEFAULT, CW_USEDEFAULT,
                                              NULL, NULL,
                                              instance,
                                              NULL)))
        return 0;

    ::ShowWindow (hwnd, show);
    ::UpdateWindow (hwnd);

    ::MSG message;
    while (::GetMessage (&message, NULL, 0, 0))
    {
        ::TranslateMessage (&message);
        ::DispatchMessage (&message);
    }

    return (message.wParam);
}


Ich empfehle dir auch, dich in die <windowsx.h> einzuarbeiten, damit deine Fenster-Prozedur nicht mehr genau so wirr aussieht, wie 95% der Anderen.

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

5

26.12.2008, 18:47

Oh, ja. Das kleine Wörtchen "return" muss ich wohl irgendwie vergessen haben :roll: . Jetzt funktioniert es. Trotzdem danke.
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

Anonymous

unregistriert

6

26.12.2008, 18:48

hat der compiler das nicht angemozt, dass nicht alle fälle ein return wiedergeben? bei mir macht er das nämlich mit einer großen dicken fetten warnung.

die sieht übrigends so aus und solltest du auch gehabt haben:
main.cpp(63) : warning C4715: 'WndProc' : not all control paths return a value

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

7

30.12.2008, 12:21

ich habs mit dev-c++ compiliert und da steht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
Compiler: Default compiler
Building Makefile: "C:\Dev-Cpp\Makefile.win"
Führt  make clean aus
rm -f Unbenannt1.o  Projekt1.exe

g++.exe -D__DEBUG__ -c Unbenannt1.cpp -o Unbenannt1.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"    -g3

g++.exe -D__DEBUG__ Unbenannt1.o  -o "Projekt1.exe" -L"C:/Dev-Cpp/lib" -mwindows  -g3 

Ausführung beendet
Kompilierung erfolgreich

Ach ja und

Quellcode

1
Fehler insgesamt: 0

PS: welchen compiler benutzt du?
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

Anonymous

unregistriert

8

30.12.2008, 12:27

Visual C++ 2008 Express Editions und Code::Blocks mit nem aktuellen GCC.

Auf jedenfall keinen DevC++ der seit 2005 (oder sogar weit früher) de facto als Tot bezeichnet werden kann, da das Projekt gescheitert ist. Schnapp dir einen anständigen Compiler und keinen Müll!

Never use DevC++ ;)

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

9

30.12.2008, 13:06

Siehe https://www.spieleprogrammierer.de/phpBB…pic.php?t=10486. Fehler immer noch nicht behoben.

Was gibts nach deiner Meinung noch so für gute Compiler :?:
Ich guck mir auch mal Code::Blocks an.
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

10

30.12.2008, 16:35

Zitat von »"Phil239"«

Was gibts nach deiner Meinung noch so für gute Compiler :?:
Ich guck mir auch mal Code::Blocks an.

Code::Blocks ist allerdings kein Compiler, sondern ne Entwicklungsumgebung ;)

Werbeanzeige