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

10.08.2007, 16:10

Logikproblem beim kapseln der CALLBACK Funktion [C++ Win32]

Hi,

ich hab ein kleines Logikproblem, beim überarbeiten (bzw. neuschreiben) meines Frameworks für die Win32API.
Ich hatte die Idee die Callback wie folgt zu kapseln:

Ich habe einen globalen Vector, der so definiert ist:

C-/C++-Quelltext

1
std::vector<HWND> fensterliste;

Der ist aber nur dafür gedacht dass er Windowsfenster aufnimmt, also keine Buttons oder andere Steuerelemente!
Und einen weiteren Vector der die Nachrichtenklassen für die Fenster aufnimmt, in denen der Benutzer das Fenster verwaltet also sozusagen die OO Variante der CALLBACK.
Definiert ist der Vector so:

C-/C++-Quelltext

1
std::vector<MsgLoop*>  nachrichtenschleifen;

Die Klasse MsgLoop hat je eine Methode für eine bestimmte Windows Message daher muss die betreffende Klasse davon abgeleitet sein.
Die Idee ist dass
fensterliste -> nachrichtenschleifen[i] zugeordnet ist.

In dem Konstruktor meiner Fensterklasse wird eben ein Windowsfenster erzeugt, der Pointer auf der dem Konstruktor übergebenen Nachrichtenschleife und das Fenster wird in dem betreffenden Vector eingereiht. Als Callback wird immer eine StandardCallback übergeben, die das ihr übergebene Handle mit der Fensterliste abgleicht und die Nachrichten an die entsprechende Klasse weiterleitet. Das funktioniert an sich auch ganz toll, aber die Message WM_CREATE wird in der CreateWindow Funktion abgeschickt bevor der Rückgabewert abgeschickt wird. Das Problem ist dass dann in der Fensterliste das HWND noch nicht eingereiht ist da es ja erst durch den Rückgabewert von CreateWindow übergeben wird.
Dann hab ich das Fenster nicht in der Liste und die Callback hat keine Ahnung wohin die Nachrichten hingeleitet werden sollen.
Also muss das HANDLE in die Liste eingereiht werden, bevor(!) WM_CREATE abgeschickt wird. Mir fällt nichts ein wie ich das realisieren soll und hab schon eine Zeit lang drüber gebrütet aber mir ist nichts eingefallen. Es kann gut sein dass die Lösung total einfach ist und ich einfach zu blöd bin um drauf zu kommen.
Ich bitte um eure Hilfe und bin auch für jegliche dankbar
»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

2

10.08.2007, 16:15

Zitat

globalen Vector
Möp. Viel weiter les ich erst garnicht ... ist vollkommen unnötig sowas zu haben ... es ist rel. einfach die WinAPI zu kapseln ... ohne auf irgendwelche Manager odg. zurück zu greifen ... TIPP: GWL_USERDATA ...
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

3

10.08.2007, 16:51

Zitat

Möp. Viel weiter les ich erst garnicht ... ist vollkommen unnötig sowas zu haben ... es ist rel. einfach die WinAPI zu kapseln ... ohne auf irgendwelche Manager odg. zurück zu greifen ... TIPP: GWL_USERDATA

Ich kommentiere das erst gar nicht. Es ist relativ einfach einen sinnvollen Beitrag zu verfassen. Siehe 95% aller Beiträge in diesem Forum -.-'

Aber vielen Dank für deine Hilfe!
( Falls noch jemand ne Idee hat bin ich auch demjenigen dankbar! )

EDIT: Meine Lösung ist relativ einfach und übrigens benutzt David_pb (hier aus dem Froum) einen ähnlichen Ansatz. Ich habe nur 1Problem. Wenn dich das global stört kann ich natürlich auch das Schlüsselwort static benutzen um global zu umgehen.
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

10.08.2007, 17:18

Dann musst du WM_CREATE evtl gesondert behandeln:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    if ( uMsg == WM_CREATE )
    {
        fensterliste.push_back( hWnd );
        nachrichtenschleife.push_back( dienachricht );

        return dienachricht( hWnd, uMsg, wParam, lParam );
    }

    // wie bisher

}


Außerdem würde ich das ganze etwas mehr kapseln, also keine zwei Vektoren sondern nur einer mit einem entsprechenden Objekt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct wnd_info
{
    HWND hWnd;
    WNDPROC proc;

    // c'tor, vergleichsoperator usw...

};

std::vector< std::auto_ptr< wnd_info > > fensterliste;


So in der Art.
@D13_Dreinig

5

10.08.2007, 17:34

Nja ...

Zitat

Ich kommentiere das erst gar nicht. Es ist relativ einfach einen sinnvollen Beitrag zu verfassen. Siehe 95% aller Beiträge in diesem Forum -.-'
Solltest du auch nicht! Könnte stark ins Auge gehen! GWL_USERDATA ist sehr gut geeignet für sowas ... aber wenn du meinst das du nicht nötig hast, dich damit näher zu beschäftigen ... ok! :roll:
Sinnvolle Beiträge des Forums würde ich auf max. 75% schätzen :badgrin:
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

Werbeanzeige