Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » WndProc in einer Klasse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.04.2005, 18:31 Uhr
xXx
Devil


Na gut, mein Problem:

Ich wollte eine Klassenhirachie anlegen...
Jetzt das Problem, das zwar schon mal hier besprochen wurde, ich aber nicht schlau daraus werde...
Also, bei der Funktion
wc.lpfnWndProc = WindProc;

Meckert der, weil meine WindProc zu der Klasse gehört und darasu die Fehlermeldung folgt:

Zitat:

cannot convert from 'long (__stdcall CKlasse::*)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' There is no context in which this conversion is possible.



Über all steht, das man die WindProc einfach auf static setzten soll, das funzt aber net...
Also, wollte ich es machen, in dem ich 1x

WinAPI:

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    CKlasse * m_Klasse;
    
    return m_Klasse->WindProc( hwnd, message, wParam, lParam );
}


Und dann kann die WindProc ja weiterhin zur CKlasse gehören, das wäre dann kein Problem, aber dann meldet der:


Zitat:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/Programm.exe : fatal error LNK1120: 1 unresolved externals



Habt ihr ne Idee wie man das wegbekommt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.04.2005, 18:43 Uhr
Spacelord
Hoffnungsloser Fall


Indem du den richtigen Projekttyp wählst.

Du weisst schon dass dieser Code dein Programm abschmieren lässt,oder?


C++:
    CKlasse * m_Klasse;
    
    return m_Klasse->WindProc( hwnd, message, wParam, lParam );




m_Klasse zeigt irgendwo hin aber nicht auf ein CKlasse Objekt......

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.04.2005, 18:58 Uhr
xXx
Devil


jaja, das hab ich auch schon geändert...

auf:

WinAPI:

CKlasse m_Klasse;
return m_Klasse.WindProc( hwnd, message, wParam, lParam );



das ist richtig! Aber dann kommen ja immer noch die Fhelr mit der WinMain@16.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.04.2005, 19:02 Uhr
Spacelord
Hoffnungsloser Fall


Was für nen Projekttyp hast du gewählt?
Hast du ne WinMain oder ne main()?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.04.2005, 19:12 Uhr
xXx
Devil


WinMain, es funzt auch, wenn ich nur eine WndProc habe, aber dann keine Klassen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.04.2005, 15:42 Uhr
Spacelord
Hoffnungsloser Fall


Schau mal in deine LinkerOptionen.
Steht da /subsystem:windows oder /subsystem:console ?

Wüsste momentan nicht was der Einstiegspunkt mit deiner Klasse zu tun haben sollte...

Und was verstehst du darunter dass es nicht klappt die Methode statisch zu machen?Es wäre nämlich der erste Schritt das in den Griff zu kriegen.
Die Lösung mit dem temporären Objekt ist,in Anbetracht der Tatsache dass die WndProc der Dreh und Angelpunkt der Anwendung ist, ein Albtraum.
Anstatt die Nachricht direkt zu verarbeiten springst du in die Stubmethode und diese ruft den Konstruktor von CKlasse auf.Dann führst du die Methode WndProc aus und anschliessend erledigt noch der Destruktor sein Werk.Diese ganzen überflüssigen Schritte in einer,für die Leistung der Anwendung,derart wichtigen Funktion sind Müll.
Da erstellst du mal ratzi fatzi nen paar Millionen Objekte um sie gleich wieder zu zerstören.
Jetzt könnte man das Objekt zwar auch statisch machen aber besser ist es gleich die Methode statisch zu machen weil du dir dann auch den überflüssigen Sprung in deine Dummy-Wndproc sparst.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.04.2005, 18:25 Uhr
xXx
Devil


also, wenn ich vor die Funktion nen static setzt, klappt es nicht, wenn ich die Funktion im Header mache auch nicht...

bzw. das mit Static funzt, aber dann kann ich da keine Anderen Funktionen mehr aufrufen..
bsp:

WinAPI:

LRESULT CALLBACK CKlasse::WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
            CKlasse This;
    switch (message)
    {
    case WM_CREATE:
        {
            This.RichEdit = CreateWindowEx(WS_EX_RIGHTSCROLLBAR, "RichEdit", "", NULL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
            return 0;
        }

    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    case WM_PAINT:
        {
            
            
            This.Render();
            ValidateRect( hwnd, NULL );
            return 0;
        }

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



So funzt es, nur das halt noch das mit der WinMain kommt, wenn ich das ganze mit den Klasse weglasse, kommt dieser Fehler aber nicht... sondern es funzt! Aber ich brauch Klassen. Das mit subsystem: ist windows.

Sonnst noch ne Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.04.2005, 18:36 Uhr
Spacelord
Hoffnungsloser Fall


Das ist mir zu verwirrend...
Du legst in ner Methode deiner Klasse ein lokales Objekt derselben an(This ) und weißt einem Attribut des temporären Objekts ein HWND zu??????

Ne also da muss ich passen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.04.2005, 21:28 Uhr
xXx
Devil


Also, pass auf, weil die WindProc ja jetzt static ist, meldet der Fehler, wenn ich das Richeditctrl erstelle, also, hab ich nen lokales Objekt angelegt, womit ich dann wieder auf die funktionen zugreifen kann. Denn RichEdit ist in der CKlasse als HWND gesetzt, und über This.RichEdit, greif ich darauf zurück...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
29.04.2005, 21:59 Uhr
Spacelord
Hoffnungsloser Fall


Ich weiß was da passiert.
Die Frage ist ob du weißt dass das ziemlicher Käse ist!?
Dein HWND geht am Ende der Funktion verloren weil das lokale Objekt abgebaut wird!

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: