SetWindowLongPtr Problem



  • Hallo,

    ich habe das Problem, wenn ich SetWindowLongPtr() in einer Funktion meiner Klasse aufrufe, dann kommt die Fehlermeldung:

    error C2440: 'type cast' : 'long (__stdcall CTextField::)(struct HWND__ *,unsigned int,unsigned int,long)' kann nicht in 'long' konvertiert werden
    *

    es ist vom Code her aber alles Richtig soweit..
    Muss man etwas beachten wenn die Callback Funktion mit zB. in er Klasse ist ?

    int CTextField::Create(   int x,int y,int width, int height, HWND hwnd, HINSTANCE hInstance)
    {
        hWndTxt = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | WS_BORDER  , x,y,width, height, hwnd, (HMENU)ID_TEXTFELD, hInstance, NULL);
    
        PrevWndProcTxtField = SetWindowLongPtr(hWndTxt, GWLP_WNDPROC, (LONG_PTR)txtWndProc);
    
        return 1;
    }
    
    LRESULT CALLBACK CTextField::txtWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      switch (message)
      {
            case WM_KEYDOWN:
                break;
      }
        return CallWindowProc ((WNDPROC) PrevWndProcTxtField, hwnd, message, wParam, lParam);
    }
    

    [ Dieser Beitrag wurde am 30.10.2002 um 09:44 Uhr von personenkult editiert. ]



  • Die Callback-Funktion muss static sein 😉



  • hmmmmm.. was static bedeutet ist mir klar, aber wieso muss man das hier Anwenden?

    und wieso sagt mein Compiler nun error LNK2001: Nichtaufgeloestes externes Symbol "private: static long CTextField::PrevWndProcTxtField" (?PrevWndProcTxtField@CTextField@@0JA)

    🙄



  • header:

    static LRESULT CALLBACK txtWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    

    cpp:

    LRESULT CALLBACK CMakeHexDlg::txtWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    


  • header:

    private:
        static LONG_PTR PrevWndProcTxtField;
    

    die Fehlermeldung sagt ja das mit PrevWndProcTxtField was nich stimmt..

    error LNK2001: Nichtaufgeloestes externes Symbol "private: static long CTextField::PrevWndProcTxtField" (?PrevWndProcTxtField@CTextField@@0JA)
    *



  • oh, da hab ich wohl etwas zu schnell gelesen... 😃
    Abhilfe für dein Problem ist folgende Zeile in der cpp-Datei:

    LONG_PTR CTextField::PrevWndProcTxtField ;
    

    schau dir noch mal das Kapitel zu statischen Variablen/Methoden in Klassen an, so ganz klar ist glaubich nocht net.. 😃 :p



  • ja da hast du wohl Recht mit 🙂 .. trotzdem Dankeschön!


Anmelden zum Antworten