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

09.03.2011, 22:37

Win32 Window Klasse

Hallo zusammen,

ich hab ne window klasse geschrieben aber die will nicht wie ich will

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
class CWindow
{
protected:

    HWND windowHandle;

public:

    static void RegisterWindowClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass = {
            sizeof(WNDCLASSEX),
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
            CWindow::MainWindowProc,
            0,
            0,
            hInstance,
            LoadIcon(NULL, IDI_WINLOGO),
            LoadCursor(0, IDC_ARROW),
            (HBRUSH)(COLOR_BTNFACE + 1),
            0,
            TEXT("DemoWindowClass"),
            LoadIcon(NULL, IDI_WINLOGO)
        };

        if(RegisterClassEx(&wndClass) == 0)
        {
            // throw
        }
    };

    CWindow(HINSTANCE hInstance)
    {
        this->windowHandle = CreateWindowEx(
            0,
            TEXT("DemoWindowClass"),
            TEXT("Demo Window"),
            WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX | WS_SYSMENU | WS_VISIBLE,
            0,
            0,
            800,
            600,
            NULL,
            NULL,
            hInstance,
            this);

        if(this->windowHandle == NULL)
        {
            // throw
        }
    };

    virtual ~CWindow(void) {};
    virtual LRESULT OwnWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
        case WM_CREATE:
            MessageBox(NULL, TEXT("CWindow WM_CREATE"), TEXT("Info"), MB_OK);
            return 0;

        case WM_CLOSE:
            MessageBox(NULL, TEXT("CWindow WM_CLOSE"), TEXT("Info"), MB_OK);
            PostQuitMessage(0);
            return 0;
        }

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

    static LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        CWindow* window = NULL;

        if(msg == WM_CREATE)
        {
            window = (CWindow*)LPCREATESTRUCT(lParam)->lpCreateParams;
            SetWindowLongPtr(hwnd, GWL_USERDATA, (LONG_PTR)window);
            
            return window->OwnWindowProc(hwnd, msg, wParam, lParam);
        }
        else
        {
            window = (CWindow*)GetWindowLong(hwnd, GWL_USERDATA);

            if(window != NULL)
            {
                return window->OwnWindowProc(hwnd, msg, wParam, lParam);
            }
        }

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


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
class CTestWindow : public CWindow
{
public:

    CTestWindow(HINSTANCE hInstance) : CWindow(hInstance) {};
    ~CTestWindow(void) {};

    LRESULT OwnWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
        case WM_CREATE:
            MessageBox(NULL, TEXT("CTestWindow WM_CREATE"), TEXT("Info"), MB_OK);
            return 0;

        case WM_CLOSE:
            MessageBox(NULL, TEXT("CTestWindow WM_CLOSE"), TEXT("Info"), MB_OK);
            PostQuitMessage(0);
            return 0;
        }

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


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    CWindow::RegisterWindowClass(hInstance);

    CTestWindow testWindow(hInstance);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) != 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}


irgentwie wird bei WM_CREATE die OwnWindowProc von der CWindow klasse ausgeführt anstatt die von CTestWindow. Bei WM_CLOSE wird die von CTestWindow ausgeführt.
Wenn ich OwnWindowProc bei CWindow pure virtual mache stürzt das Programm ab.

thanks!
mfg JasonB

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.03.2011, 11:57

irgentwie wird bei WM_CREATE die OwnWindowProc von der CWindow klasse ausgeführt anstatt die von CTestWindow.

Das liegt daran dass das CreateWindowEx() im Konstruktor von CWindow aufgerufen wird. Wenn ein neues CTestWindow erzeugt wird dann wird in dessen Konstruktor zuerst der Konstruktor der Basisklasse, also CWindow, aufgerufen. Zum Zeitpunkt da CreateWindowEx() augerufen wird ist das Objekt also noch kein fertig konstruiertes CTestWindow sondern erst nur ein CWindow und ein virtual Function Call wird die Methode von CWindow aufrufen und nicht die von CTestWindow (das wäre falsch da das CTestWindow Objekt zu dem Zeitpunkt noch gar nicht fertig konstruiert ist).

3

10.03.2011, 16:43

danke dot =) schon wieder was gelernt

also einfachste lösung wäre CWindow eine Create funktion zu geben und diese dan im konstruktor von CTestWindow auszuführen.. oder gibs bessere möglichkeiten?

mfg JasonB

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.03.2011, 18:18

Du könntest überhaupt die Windowclass vom Window trennen. Die Windowclass könnte dann als statisches Objekt repräsentiert sein sodass sie im Konstruktor autom. registriert wird usw.

5

10.03.2011, 19:46

aber dann wenn ich 2 fenster vom gleichen window brauch wird ja 2x mal das gleiche windowclass registriert.

Werbeanzeige