Welche GUI?



  • Ad aCTa schrieb:

    Wenn du Spiele bauen willst, solltest du dich mit DirectX beschäftigen. Dennoch kann dabei ein Wissen über die Windows-API nicht schaden. 😉

    Wieviele Spiele hast du schon programmiert?



  • Ab wann nennst du etwas "Spiel"? So ca. 6 kleine 3D Spiele.



  • Ad aCTa schrieb:

    So ca. 6 kleine 3D Spiele.

    welche?



  • Alsob du meine Spiele kennen würderst 😉 Ich habe die nie publiziert. Aber jetzt ist Schluss mit Rumtrollen, ja?



  • SchönsterCoder schrieb:

    PS: Wer ist Oda?

    oda = oder :p
    Ich schau mir WinApi heut mal an und schau ob ichs check 😃



  • Ad aCTa schrieb:

    Wenn du Spiele bauen willst, solltest du dich mit DirectX beschäftigen. Dennoch kann dabei ein Wissen über die Windows-API nicht schaden. 😉

    Wieso sollte man DirectX verwenden? Und weshalb WinAPI?

    Vielleicht möchte man sich ja auch auf höherem Abstraktionslevel bewegen und nicht an Windows binden.

    Als allererstes sollte man aber wirklich schauen, dass man Standard-C++ relativ gut kann. Anschliessend kann man sich zum Beispiel mit SMFL in die Spieleprogrammierung vorwagen. Dabei bleibt man auch schön plattformunabhängig und muss weniger mit C-Konstrukten rumfrickeln. Aber das ist natürlich jedem selbst überlassen und hängt auch von den genauen Ansprüchen ab.

    Ich finde es nur etwas gefährlich, wenn man selbst noch kein sauberes C++ beherrscht, und sich dann durch WinAPI oder DirectX einen "speziellen" Codestil angewöhnt.



  • Nexus schrieb:

    Wieso sollte man DirectX verwenden? Und weshalb WinAPI?

    WinApi ist gut, wenn man seine kleinen Programme schreibt, also nicht Spiele oder sowas, sondern wirklich programme, ich sag mal, die was bringen! :)(Dass es halt schöner aussieht)
    Und DirectX für Spiele(alternativ: OpenGL)...
    zumindest glaub ich das :p Irgendwie käm ich mir komisch vor, mit DirectX ein Fenster mit 2 Knöpfen zu programmieren^^



  • Dass man WinAPI für Windows-Programmierung einsetzen kann, glaube ich gern. Aber nur für GUI gibt es genügend Alternativen, dieser Thread handelt ja unter anderem von diesen. Im GUI-Unterforum sind auch noch einige zu sehen. Wie gesagt, es gibt auch Programme, die nicht nur unter Windows laufen sollen.

    Aber auch für Spiele gibt es nicht nur DirectX und OpenGL. Die beiden Frameworks sind relativ Low-Level (OpenGL noch viel mehr als DirectX) und können entsprechend abstrahiert werden. Eben zum Beispiel durch SFML.



  • > Wieso sollte man DirectX verwenden? Und weshalb WinAPI?

    Weil Windows nun mal das OS der Spiele ist. DirectX wird meistens zum Spiele bauen benutzt, OpenGL eher selten. Nichts gegen SFML, aber warum nicht gleich DirectX? Das speziellere kann er sich ja aneigenen, wenn er erst mal einen Fuß in der Tür hat.

    Und warum man WinAPI lernen soll? Na damit man mit dem Betriebssystem kommunizieren und programmieren kann. Ist nicht meine Schuld, dass die meistens in C geschrieben sind, unter Linux/Unix ist das nicht viel anders. 😉 Außerdem kann jeder "echte" C++-Programmierer auch C und weiß, wann man welche Semantik und Sprachtechnik benutzt.

    Das man externe Libs erst benutzt, wenn man C++ kann, ist ja wohl klar, oder? (Wer kann schon das ganze C++ perfekt? 😃 ) Und wenn schon, mal über den Tellerrand schauen hat noch nie geschadet, man merkt als Anfänger ja selber, dass es hackt, und kehrt freiwillig zum guten, alten ANSI-C++ zurück. 🤡

    Zum Abschluss: Ein Flamewar über das "beste" bringt's doch sowieso nicht. Aber da er ja eh ein Anfänger ist, ist plattformunabhängikeit oder modularität erst mal vollkommen irrelevant, hauptsache, er bekommt was vernüftiges zu stande. :p

    Wenn er merkt, dass es Mist ist, wird er es nächstes mal besser machen.



  • Ich würde sagen, wer interessiert an den Techniken und Low Level ist, der robbt so, oder so durch DirectX/OpenGL/WinAPI durch, weil es ihm Spass macht alles auf einer möglichst tiefen Ebene kennen zu lernen. Wer allerdings einfach produktiv etwas bauen will, der nimmt halt Abstraktionen.



  • Ad aCTa schrieb:

    Weil Windows nun mal das OS der Spiele ist. DirectX wird meistens zum Spiele bauen benutzt, OpenGL eher selten. (Hab mal gehört, CounterStrike benutzt OpenGL)

    Das ist ja kein Grund. Man muss deshalb nicht mit dem Strom schwimmen. Wenn man mit Spieleprogrammierung beginnt, kommt es auch nicht auf darauf an, wie verbreitet ein Framework ist oder wieviele Spiele damit geschrieben wurden. Gerade für 2D-Programmierung ist SFML eine wirklich sehr schöne Bibliothek, mit der man auf hohem Abstraktionslevel programmieren kann. Ich würde auch mal behaupten, einige Dinge sind da schöner umgesetzt als in DirectX (vielleicht auch, weil es direkt in C++ programmiert ist). Dafür hat man weniger Möglichkeiten, zum Beispiel, wenn es in den 3D-Bereich geht. Aber was sich nun in einem spezifischen Fall besser eignet, hängt ohnehin von den Anforderungen des Programmierers ab.

    Ad aCTa schrieb:

    man merkt als Anfänger ja selber, dass es hackt, und kehrt freiwillig zum guten, alten ANSI-C++ zurück. 🤡

    Nein, eben nicht. Man denkt als Anfänger, "das ist halt eben so", das "gute, alte ANSI-C++" ist einem nahezu unbekannt.

    Ad aCTa schrieb:

    Zum Abschluss: Ein Flamewar über das "beste" bringt's doch sowieso nicht.

    Ja, Flamewar bringt es wirklich nicht. Ich behaupte ja nicht, es gäbe das Einzig Wahre Framework™ oder sowas in die Richtung. Ich wollte nur zeigen, dass DirectX nicht die einzige Möglichkeit ist.

    Ad aCTa schrieb:

    Aber da er ja eh ein Anfänger ist, ist plattformunabhängikeit oder modularität erst mal vollkommen irrelevant, hauptsache, er bekommt was vernüftiges zu stande. :p

    Wenn er merkt, dass es Mist ist, wird er es nächstes mal besser machen.

    Eben. Und dieses vernünftige Zu-Stande-Bringen ist wohl einfacher, wenn man ein fertiges Framework verwendet, als direkt mit WinAPI herumzufrickeln. Zumal man da viel schneller Erfolgserlebnisse hat und entsprechend motivierter ist, weiter zu programmieren.

    Schau doch mal, wie viele Anfänger alleine an den Zeigern und manueller Speicherverwaltung verzweifeln. Da finde ich es wirklich keine gute Idee, gleich WinAPI zu empfehlen. Ausser für Leute, die an Low-Level-Dingen wirklich von Anfang an interessiert sind und auch die Bereitschaft mit sich bringen, entsprechend viel Zeit zu investieren. Dieser Teil der Leute entspricht meiner Meinung nach aber eher der Minderheit.



  • Wenn du spiele und nicht engines programmieren willst, dann nimm ne fertige engine



  • So also ich habs mir mal angeguckt!
    Einfach nur ein Windowsfenster erstellen hab ich einigermaßen gerafft 😉
    Jetzt hab ich aber noch einige Fragen:

    1. In dem Tut steht, dass man den Code fürs Windowsfenster nicht auswendig können muss, stimmt das oder sollte ich mir den trotzdem versucehn einzuprägen?

    2.Wie schreib ich einfach ins Fenster rein? Z.b. einfach in schwarzer Schrift "Hallo" schreiben.

    3.Wie erstelle ich Buttons? Also z.B. einen OK Button? Im tutorial hab ich auch gelernt, wie mans macht, dass wenn man ins Fenster klickt irgendetwas passiert...muss ich dann wenn ich den Button drücken will, ein Ereignis WM_LBUTTONDOWN machen und das mit den Koordinaten vom Button füttern? Oder geht das einfach über den Button?

    4.Wie mach ich als Hintergrund ein Bild?

    Danke schon mal für die Antworten 🙂



  • 1. Nö. Am besten du schreibst dir da selbst ein kleines Framewokr und du musst dich mit der initialisierung nie mehr rumplagen..

    2. Z.b mit der GDI:
    http://msdn.microsoft.com/en-us/library/dd145203(VS.85).aspx

    3. Schaue hier:
    http://msdn.microsoft.com/en-us/library/aa383743(VS.85).aspx

    4. Siehe Punkt 2.

    Wie du siehst findest du eigentlich alles in der Doku. Es lohnt sich schon diese zu Gemüte zu führen..



  • Das bei den beiden Links versteh ich net so ganz 😞 Kannste mir mal ein Codebeispiel für text mit Schwarzer Schrift und ein Beispiel für einen Button, den man anklicken kann zeigen? (Mit erklärung wenns geht 😉 'Kapieren, nicht kopieren!' 🙂





  • Also...das is mein Fenster:

    #include <windows.h>
    
    const char g_szClassName[] = "myWindowClass";
    
    // Step 4: the Window Procedure
    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;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASSEX wc;
        HWND hwnd;
        MSG Msg;
    
        //Step 1: Registering the Window Class
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = g_szClassName;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
        HWND hwndButton = CreateWindow( 
        L"BUTTON",   // Predefined class; Unicode assumed. 
        L"OK",       // Button text. 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles. 
        10,         // x position. 
        10,         // y position. 
        100,        // Button width.
        100,        // Button height.
        hDlg,       // Parent window.
        NULL,       // No menu.
        (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE), 
        NULL);      // Pointer not needed.
    
        if(!RegisterClassEx(&wc))
        {
            MessageBox(NULL, "Window Registration Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        // Step 2: Creating the Window
        hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            g_szClassName,
            "Title",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 500, 500,
            NULL, NULL, hInstance, NULL);
    
        if(hwnd == NULL)
        {
            MessageBox(NULL, "Window Creation Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
        // Step 3: The Message Loop
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        HWND hwndButton = CreateWindow( 
        L"BUTTON",   // Predefined class; Unicode assumed. 
        L"OK",       // Button text. 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles. 
        10,         // x position. 
        10,         // y position. 
        100,        // Button width.
        100,        // Button height.
        hDlg,       // Parent window.
        NULL,       // No menu.
        (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE), 
        NULL);      // Pointer not needed.
    
        return Msg.wParam;
    }
    

    an welcher Stelel muss dann der Code für den button z.B. rein?
    Ich hab an verschiedenen Stellen versucht, aber immer kommt der fehler in der Zeile für "HWND hwndButton = CreateWindow( " : hDlg was not declared

    Pls help 🙄



  • Du sollst nicht einfach nur kopieren, sondern den Code verstehen..

    Im übrigen ist ein Button nichts anderes, als ein Fenster (mit ein paar anderen Parametern) und da du in deinem Code ja bereits ein Fenster erzeugst (Zeile 64), sollte die Stelle klar sein..


  • Administrator

    Zudem, wenn ich noch anmerken darf:
    Du bist hier im falschen Forum mit WinAPI Fragen. Du würdest viel mehr Hilfe bekommen, wenn du einen neuen Thread pro Problem im richtigen Forum erstellen würdest.

    Die haben dann auch sicher gute Links und Tipps für Tutorials und Bücher.

    Grüssli



  • haha ich glaube das ist der code von Dev C++ Wizard (laugh).
    sieh dir tuts an, lese ein buch, oder fang mit was einfacherem an (z.b. console)


Anmelden zum Antworten