WndProc-Problem



  • Hallo zusammen

    Ich habe mich dazu entschlossen, aus der Konsole "auszubrechen" und mich mit der WinAPI zu versuchen.

    Nun komme ich jedoch schon beim erstellen eines Fensters nicht mehr weiter.

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <windows.h>
    #include <stdlib.h>
    #include <tchar.h>
    #include <time.h>
    #include <conio.h>
    
    using namespace std;
    
    #define FEHLER(msg){MessageBox(NULL, msg, "FEHLER", MB_OK);}
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lparam);
    
    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
     HWND hWnd;
     MSG msg;
     WNDCLASS WndClass;
     string szAppName = "test";
    
     WndClass.style = CS_HREDRAW | CS_VREDRAW;
     WndClass.lpfnWndProc = WndProc;
    
     return 0;
    }
    

    Beim Compilieren mit dem g++ mit folgendem Befehl:

    g++ test.cpp -o test -mwindows
    

    ...gibt es folgende Fehlermeldung:

    C:\Users\Ich\AppData\Local\Temp\cc67tcfg.o:test.cpp:(.text+0x41):
    undefined reference to `WndProc(HWND__*, unsigned int, unsigned int, long)@16'collect2: ld returned 1 exit status
    

    Ich verstehe nicht wirklich, warum die Referenz zu WndProc fehlt (ist doch in Zeile 15 definiert).

    Da ich über googlen nicht wirklich eine verständliche Lösung gefunden habe, wende ich mich nun selbst an euch.

    Vielen Dank für eure Hilfe.

    Gruss
    Tim



  • Die Funktion ist deklariert aber nicht definiert.... Sicher dass du schon das Zeug dazu hast?



  • Da ich nicht einen funktionierenden Code als Antwort erwarte, sondern es verstehen/erlernen möchte, frage ich dich, mit welchem Thema muss ich mich noch befassen muss.

    Wenn die Lösung des Problems ich wissen sollte, werde ich es dann erfahren, wenn ich soweit bin 😉

    Meine Kentnisse habe ich aus einem Buch, wo C eingeführt wird. Inhaltlich verstehe ich alles, aber so wie es aussieht fehlt mir nun noch vertiefstes Wissen.



  • sttim schrieb:

    und mich mit der WinAPI zu versuchen.

    Und dann noch nicht mal ein WinAPI-Tutorial gelesen?
    Mal abgesehen davon, dass der Fehler hier nicht bei fehlenden Kenntnissen der WinAPI liegt, wohin auch roflos Anmerkung abzielt.



  • Da fehlt ja auch die Hälfte XD



  • Es wurde ja bereits angemerkt, das mehr als die hälfte des Codes fehlt.

    Das Hinzufügen von

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch(msg)
      {
      case WM_CLOSE:
         DestroyWindow(hwnd);
         break;
      case WM_DESTROY:
         PostQuitMessage(0);
         break;
      default:
         return DefWindowProc(hwnd, msg, wParam, lParam);
      }
    return 0;
    }
    

    würde das Programm nicht deutlich verbessern, auch wenn sich der Compiler nicht mehr
    beschweren sollte ...

    Besser erstmal ein (oder ein paar) Win32-API-Tutorials lesen.

    Vorschlag:
    http://www.winprog.org/tutorial/



  • Gehört als Minimalbeispiel nicht auch noch

    MSG msg;
    BOOL bRet;
    
    while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
         if(bRet == -1)
         {
             // Handle Error
         }
         else
         {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }
    }
    return msg.wParam;
    

    dazu.

    merano schrieb:

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch(msg)
      {
      case WM_CLOSE:
         DestroyWindow(hwnd);
         break;
      case WM_DESTROY:
         PostQuitMessage(0);
         break;
      default:
         return DefWindowProc(hwnd, msg, wParam, lParam);
      }
    return 0;
    }
    



Anmelden zum Antworten