Suche Tutorials (war: Eine Bitte....)



  • 😉 Hallo zusammen!

    Ich ahbe neulich mit C++ angefangen und würde gerne die grundlagen der programmierung mit WinMain erlernen. (Zur Zeit kann ich gut VB, bischen C++)
    Es wäre nett wenn jmd, einen Link oder ein Dokument posten könnte, mit dem ich das wesentliche zur verfügung hätte. Ihc kann mir vorstellen, dass das ganze für hier viel zu lange ist. deswegen wär ein externer link beser als ein kurzer satz..

    Nur so als idee: Ich denke ein Thread, der die Grundinfos enthält sollte der Admin für immer im Forum fixieren um für neueinsteiger das ganze zu vereinfachen, und zugleich das forum zu entlasten.

    ---------------------------------------------------------------------------
    🙄 Bin seit tagen im Web auf der Suche nach ner Page auf der steht, wie man OHNE MFC (etc.) richtige Windows Anwendungen erstellen kann. Ne echte Erleichterung dieses forum zu sehn muss ich sagen..
    Ich denke wenn man schon Programmiert, dann ein wenig mehr independence. Mehr selbstständigkeit...

    das wars auhc schon, MfG BreakerMaker ©

    edit: Bitte einen aussagekräftigen Titel verwenden.



  • Die WinAPI ist gut dokumentiert. Bei Fragen zu einzelnen Funktionen lohnt es sich immer zuerst, in der MSDN nachzuschauen. Einen Link dahin findest du über der Hauptseite zu diesem Forum hier. Wenn du keinen Bock hast, immer im INET rumzuhängen, rate ich dir, die Datei win32hlp.exe auf http://www.cs.virginia.edu/~lcc-win32/ unter Free Downloads runterzuladen.
    Hier ein kleines Beispielprogramm für dich, das ich mit vielen Kommentaren versehen habe:

    // Diese Datei wird immer inkludiert, wenn man mit der WinAPI arbeitet
    #include <windows.h>
    //---------------------------------------------------------------------------
    
    // Definitionen
    #define ID_BUTTON    1
    //---------------------------------------------------------------------------
    
    // Globale Variablen
    LPCTSTR    g_lpszAppTitle = TEXT("<AppTitle>");
    LPCTSTR    g_lpszAppClass = TEXT("<AppWindowClass>");
    HINSTANCE  g_hInstance;
    HWND       g_hAppWindow, g_hButton;
    
    // Zu den Typen:
    // LPCTSTR steht für Long Pointer Constant T(dazu sag ich gleich noch was) String.
    // Wenn UNICODE nicht definiert ist (#define UNICODE), dann ist das nichts
    // anderes als ein char*. Wenn Unicode definiert ist, dann ein wchar_t*.
    // Das Makro TEXT() macht nun char*s zu wchar_t*s oder lässt sie so, je
    // nachdem, ob UNICODE nun definiert ist oder nicht.
    // HINSTANCE ist ein Handle-Typ. Kümmer dich erstmal nicht drum.
    // HWND ist wichtig. Das ist auch ein Handle-Typ, und zwar ein Fenster-Handle-
    // Typ. Damit wird jedes Fenster, das in Windows existiert eindeutig gemacht.
    // Alle Funktionen in der WinAPI, mit denen man was an einem Fenster machen
    // kann, verlangen ein HWND als Parameter.
    //---------------------------------------------------------------------------
    
    // Funktions-Prototypen
    VOID              RegisterAppWindow();
    VOID              Create_GUI_Interface(HWND hwndParent);
    LRESULT CALLBACK  AppWndProc(HWND, UINT, WPARAM, LPARAM);
    VOID              ShowMessage(LPCTSTR);
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
    {
       MSG  msg;
    
       // Die Instanz zu unserem Programm, welche oft benötigt wird
       // bei Verwendung der WinAPI
       g_hInstance = hInstance;
    
       // Registriere Application Window
       RegisterAppWindow();
    
       // Erstelle Application Window
       g_hAppWindow = CreateWindow(g_lpszAppClass,// Der Fensterklassen-Name
                                   g_lpszAppTitle,// Der Text in der Titelleiste
                                   WS_VISIBLE|WS_MINIMIZEBOX|WS_SYSMENU,// Der Fenster-Stil
                                   100, 100, 300, 300,// Die Fenster-Abmessungen
                                   NULL,// Kein Mutterfenster
                                   NULL,// Kein Menu
                                   g_hInstance,// Die Programminstanz
                                   NULL);// Keine Extra-Daten
    
       // Message Loop
       // Diese wartet auf eingehende Nachrichten an das Fenster und verteilt diese
       // auf die WindowProcs, also an die Nachrichten-verarbeitenden Funktionen zu
       // jedem Fenster. Hier gibt es nur eine solche, nämlich AppWndProc.
       // Ist die Message-ID WM_QUIT, dann gibt GetMessage() FALSE zurück
       while( GetMessage(&msg, NULL, 0, 0) )
       {
          TranslateMessage(&msg);// Übersetzt die Eingaben (erstmal nicht so wichtig)
          DispatchMessage(&msg);// Verteilt die Messages an die WindowProcs
       }
    
       return msg.wParam ;
    }
    //---------------------------------------------------------------------------
    
    VOID RegisterAppWindow()
    {
       // Jedes Fenster ist von einer bestimmten Klasse
       // Jede neue Fensterklasse muss registriert werden
       WNDCLASSEX wndclass;
       wndclass.cbSize        = sizeof(WNDCLASSEX);
       wndclass.style         = 0;
       wndclass.lpfnWndProc   = AppWndProc;// Die Funktion, die Nachrichten an das Fenster bearbeitet
       wndclass.cbClsExtra    = 0;
       wndclass.cbWndExtra    = 0;
       wndclass.hInstance     = g_hInstance;// Die Programm-Instanz
       wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);// Ein Icon für das Fenster
       wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);// Ein Cursor für das Fenster
       wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);// Ein Brush (Pinsel) für das Fenster
       wndclass.lpszMenuName  = NULL;// Kein Menu
       wndclass.lpszClassName = g_lpszAppClass;// Der Klassenname (hier: "<AppWindowClass>")
       wndclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);// Noch ein Icon (klein)
    
       RegisterClassEx(&wndclass);
    }
    //---------------------------------------------------------------------------
    
    VOID Create_GUI_Interface(HWND hwndParent)
    {
       // Create button
       g_hButton = CreateWindow(TEXT("BUTTON"),// Die Fensterklasse ("BUTTON" wurde schon registriert von Windows)
                                TEXT("OK"),// Der Text auf dem Button
                                WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,// Der Fenster-Stil
                                205, 230, 75, 23,// Die Fenster-Koordinaten (left, top, width, height)
                                hwndParent,// Das Mutterfenster
                                (HMENU)ID_BUTTON,// Die ID (oben definiert)
                                g_hInstance,// Wieder die Programm-Instanz
                                NULL);
       // Dem Button eine ordentliche Schriftart geben
       SendMessage(g_hButton, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
    }
    //---------------------------------------------------------------------------
    
    // Diese Funktion wird gaaaanz oft aufgerufen, da sie alle Messages verarbeitet,
    // die an das Fenster verschickt werden. Jede Message hat eine ID, die sie
    // identifiziert. Diese ist in uiMsg gespeichert. In wParam und lParam werden
    // zusätzliche Informationen über die Message gespeichert.
    LRESULT CALLBACK AppWndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
       switch(uiMsg)
       {
          // WM_CREATE ist die erste Message an das Fenster nach dem Erstellen.
          // Sie wird schon gesendet, wenn CreateWindow() noch garnichts zurück-
          // gegeben hat.
          case WM_CREATE:
             Create_GUI_Interface(hwnd);
             return 0;
    
          // WM_COMMAND wird gesendet, wenn ein Control (z.B. ein Button) eine
          // Standard-Nachricht bekommen hat. Das Control schickt die Message
          // dann weiter an das Parent-Window mit einer sogenannten Notification-
          // Message-ID, die im oberen WORD von wParam gespeichert ist.
          case WM_COMMAND:
             switch( LOWORD(wParam) )// In LOWORD(wParam) steht die Control-ID
             {
                case ID_BUTTON:// Wenn die Control-ID ID_BUTTON ist...
                   if( HIWORD(wParam) == BN_CLICKED )// Wenn die Notification-Mesage-ID BN_CLICKED ist
                   {
                      ShowMessage("Das Programm wird jetzt beendet");// Eine Message ausgeben
                      SendMessage(hwnd, WM_CLOSE, 0, 0);// Das Programm beenden
                   }
                   break;
             }
             return 0;
    
          // WM_DESTROY wird an das Fenster gesendet, wenn es zerstört werden soll
          case WM_DESTROY:
             PostQuitMessage(0);// Beendet das Programm (sendet WM_QUIT an das Fenster)
             return 0;
       }
    
       // Wenn die Message nicht von dieser WindowProc verarbeitet wird, wird sie
       // an die DefWindowProc weitergeleitet, die die Message standardmäßig verar-
       // beitet. Zum Beispiel wird auf WM_CLOSE mit einer Sendung von WM_DESTROY
       // an das Fenster geantwortet. Fängst du oben WM_CLOSE ab und return'st 0,
       // so wird das Programm nicht beendet. Probier's mal...
       return DefWindowProc(hwnd, uiMsg, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    
    VOID ShowMessage(LPCTSTR str)
    {
       MessageBox(g_hAppWindow, str, g_lpszAppTitle,  MB_OK|MB_ICONINFORMATION);
    }
    //---------------------------------------------------------------------------
    


  • Also mit Google solltest du da eigentlich eine ganze Menge finden - C bzw. C++ solltest du aber schon ordentlich können

    - http://www.win-api.de/
    - http://www.germandevnet.de/tutorials/cpp-winapi/
    - http://www.winapi.net
    - http://www.henkessoft.de/api1.htm
    - http://www.henkessoft.de/WinAPI_7_GDI.htm



  • Vielen dank.. ich denke das wird mir weiterhelfen.



  • Ich hoffe, denn ich habe mir viel Mühe gegeben!



  • 🤡 🤡 🤡 🤡 🤡 🤡 🤡


Anmelden zum Antworten