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

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

31.08.2008, 14:13

[Gelöst] Functor als WindowProc verwenden

Hallo

ich habe ein kleines problem mit meinem wrapper für die winapi,
und zwar möchte ich, dass ber benutzer für ein fenster eine
callbackfunktion angeben kann.
die klasse muss sich allerdings dazwischenschalten und einige
messages abzufangen.

deshalb überlade ich in der fensterklasse den () operator
und möchte den dann als wndproc angeben das klappt aber nicht
weil:

Quellcode

1
'LRESULT (__stdcall Window::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden


ist ja auch keine static funktion

hier 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
class Window
{
public:
    Window();
    // ...

    LRESULT CALLBACK operator () (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // mache was tolles

        return WndProc(hWnd, msg, wParam, lParam);
    }
};
// =============

Window::Window()
{
    // ...

    WNDCLASS wc;
    // ...

    wc.lpfnWndProc = this->operator ();    // <-- HIER

    // ...

}

an der stelle weiß ich nicht genau wie ich das schreiben muss,
damit er die klasse als functor verwendet

frage:
wie muss das aussehen, damit das so funktioniert ?

vielleicht muss ich da auf eine externe klasse ausweichen ?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

31.08.2008, 14:19

Das geht so nicht. Entweder du machst da was mit static, oder du gehts den Umweg und rufst einfach in einer ausenstehenden Funktion eine Funktion deiner Klasse auf. (Kommt etwa auf dasselbe hinaus, wie mit static).
Dann kannst du die Werte ganz einfach übergeben und auch wieder an die Callback zurückgeben.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

31.08.2008, 14:20

du kannst als WndProc nur eine static methode verwenden. alles andere geht nicht. eine einfache lösung für dein problem isses z.B., in der UserData (über Get/SetWindowLongPtr) des fensters einen zeiger auf die zugehörige instanz der klasse zu speichern und dann in der WndProc den operator () entsprechend aufzurufen...

4

31.08.2008, 14:25

forensuche ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

31.08.2008, 14:32

das mit dem static ist mir klar (deshalb habe ich danach nicht gesucht)
werds mal mit GetWindowLongPtr ausprobieren

@drakon

wie übergebe ich den der außenstehenden funktion den zeiger auf
die dazugehörenden klasse ? es gibt ja nicht nur ein fenster
und die funktion müsste ja für alle fenster funktionieren.
ohne infos im fenster abzuspeichern sehe ich da keinen weg

aber danke schonmal


;)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

31.08.2008, 14:38

Zitat von »"Gotbread"«


@drakon

wie übergebe ich den der außenstehenden funktion den zeiger auf
die dazugehörenden klasse ? es gibt ja nicht nur ein fenster
und die funktion müsste ja für alle fenster funktionieren.
ohne infos im fenster abzuspeichern sehe ich da keinen weg


Naja. Das ist aber ein anderes Problem. Du musst ja nur das zugehörige Objekt haben. Du kannst das über globals machen, Singletons, oder eine Liste, wo du die Windows speicherst und dann hald das passende (anhand HWND) raussuchst. (Wenn du mehrere Winows hast).

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

31.08.2008, 14:51

Habs gelöst und zwar über die fensterklasse, weil jedes fenster eine andere
klasse hat (SetClassLongPtr)

vielen dank leute es klappt so wie es sollte thx :D
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

31.08.2008, 15:18

eigentlich isses net der sinn von fensterklassen dass jedes fenster ne eigene hat. genau da käme mein vorschlag mit SetWindowLongPtr ins spiel. da kannste das gleiche tun, nur halt auf fensterebene...

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

9

31.08.2008, 22:03

Das dachte ich mir auch nur gibt es da ein problem:

wenn ich SetWindowLongPtr vor dem erzeugen des fensters einsetzte
geht es selbstverständlich schief (nullpointer)

wenn ich es aber danach mache, bekomme ich die WM_CREATE
nachricht nicht mehr. das geht natürlich auch nicht, weil ich nicht
weiß ob ich die irgentwann nochmal brauche (für andere programme,
das war nämlich eine lib)

und mehrere klassen machen schon ein bisschen sinn, weil
jede klasse nur ein icon, ein menü und so hat
sicher gibt es da tricks, aber lieber mal ne klasse zu viel, als das
design komplett ändern
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

31.08.2008, 22:36

CreateWindow(Ex) erlaubt es dir über den letzten parameter ebenfalls einen zeiger an die WndProc zu übergeben auf den du dann in WM_CREATE zugreifen kannst ;)
dann kannst du dort deine instanz reinpacken und im WM_NCCREATE das SetWindowLongPtr aufrufen...

als alternative zur userdata kannst du auch das window extra verwenden (cbWndExtra member der WNDCLASS(EX)). die userdata is nämlich eigentlich für die das fenster erstellende applikation gedacht...

Werbeanzeige