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

ChrisJ

Alter Hase

  • »ChrisJ« ist der Autor dieses Themas

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

1

13.07.2007, 17:16

WndProc als privater Member

hi.

ich habe eine klasse, die eine nachrichtenfunktion beinhaltet:

C-/C++-Quelltext

1
2
3
4
5
class CClient
{
private:
   ::LRESULT __stdcall WndProc(::HWND, ::UINT, ::WPARAM, ::LPARAM);
};


jetzt erstelle ich in einer anderen funktion eine WNDCLASS struktur, und möchte der dann diese nachrichtenfunktion zuweisen.

C-/C++-Quelltext

1
2
3
4
5
void Foo(CClient* pClient)
{
  // [...]

  wndclass.lpfnWndProc = pClient->WndProc;
}


dabei erhalte ich dann folgende fehlermeldung:

Quellcode

1
2
3
[Pfad] : error C3867: "CClient::WndProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CClient::WndProc", um einen Zeiger auf den Member zu erstellen.
[Pfad]: error C2440: '=': 'LRESULT (__stdcall CClient::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden
        Es gibt keinen Kontext, in dem diese Konvertierung möglich ist


Ich weiss nicht, wie ich das Problem lösen kann :(
Bitte helft mir!
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

13.07.2007, 17:31

Du kannst keine Memberfunktions Zeiger verwenden. Die Funktion muss global oder statisch sein.
@D13_Dreinig

ChrisJ

Alter Hase

  • »ChrisJ« ist der Autor dieses Themas

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

3

13.07.2007, 17:41

ja, wenn ich die funktion statisch mache, klappt es.
aber dann kann ich leider nicht mehr auf andere member der klasse in der funktion zugreifen :/
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

13.07.2007, 17:42

Richtig! Ist ja auch korrekt so. Ich weiß allerdings nicht genau was du mit verschiedenen Windows Prozeduren bezwecken willst.
@D13_Dreinig

ChrisJ

Alter Hase

  • »ChrisJ« ist der Autor dieses Themas

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

5

13.07.2007, 17:44

im moment weiss ich es auch nicht genau ^^
okay, danke für die hilfe... ich schau dann mal, was sich da machen lässt.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

13.07.2007, 17:47

Ich hatte mal ein ähnliches Problem, das lief dann so ab:

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
class Window
{
        virtual LRESULT HandleControlNotifications( UINT uMsg, WPARAM wParam, LPARAM lParam );
        // ...

       static LRESULT APIENTRY WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
};

// ...


LRESULT Window::HandleNotifications( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    try
    {
        if ( uMsg == WM_CLOSE )
        {
            // bla

        }
        else if ( uMsg == WM_DESTROY )
        {
            // blubb

        }
        else if ( uMsg == WM_COMMAND )
        {
            // Menu, Accel oder Controlnachricht verarbeiten bzw

            // weiterleiten

        }

        return CallDefaultWindowProc( uMsg, wParam, lParam );
    }
    catch ( ... )
    {
        return 0;
    }
}

LRESULT APIENTRY Window::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    WindowList::iterator it = std::find_if( windows.begin(), windows.end(), std::bind2nd( WindowComparer(), hWnd ) );

    if ( it != windows.end() )
    {
        return ( *it )->HandleNotifications( uMsg, wParam, lParam );
    }
    else
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
@D13_Dreinig

ChrisJ

Alter Hase

  • »ChrisJ« ist der Autor dieses Themas

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

7

13.07.2007, 17:52

ja, sowas hab ich gesucht. ty!
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Werbeanzeige