Welche GUI?
-
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).aspx3. Schaue hier:
http://msdn.microsoft.com/en-us/library/aa383743(VS.85).aspx4. 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!' 
-
Hier hat es ein Beispiel für das schreiben:
http://msdn.microsoft.com/en-us/library/dd145133(VS.85).aspxUnd hier für den Button:
http://msdn.microsoft.com/en-us/library/bb775949(VS.85).aspx
-
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 declaredPls 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..
-
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)
-
"Kapieren, nicht kopieren" is mein Spruch :p
@Tim06TR:
Das ist der Code aus einem Tutorial...und Console hab ich schon drauf!
Also muss ich ja dann den Button erzeugen, nachdem das Fenster erzeugt wurde, oder`?
Also:#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); 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, "The title of my window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); 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. // Step 3: The Message Loop while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }
Aber da kommt ein Fehler in Zeile 69: hDlg was not declared in this scope
Ich raffs nicht...Ja hast recht falsches Forum, aber ich will nich doppelt posten...ansonsten muss halt ein Admin verschieben! Hatte das nur in C++ am Anfang gemacht, weil ich ja nicht wusste ob es WinApi oder sonst was is...
-
Finn schrieb:
"Kapieren, nicht kopieren" is mein Spruch :p
[...]
Aber da kommt ein Fehler in Zeile 69: hDlg was not declared in this scope
Ich raffs nicht...Ah ja...
Du solltest zu allererst mal versuchen, zu verstehen, was du machst - und dann kannst du es auch sehr einfach erweitern...
ich würde ja mal raten, dass du hDlg durch hwnd ersetzen musst...
ansonsten: such dir doch bitte ein winapi tut, wo das erklärt wird - vom kopieren und sagen lassen, was du ändern musst, wirst du auf jeden fall weniger kapieren, als sonst - außerdem ists doch auch scheiße, wenn man jedes mal nur paar zeilen tippen kann und dann nen fehler bekommt und dann erst ma paar stunden warten muss, bis sich jmd erbarmt, dir zu sagen, was du falsch gemacht hast...bb
-
Hast du ein gutes Tutorial für mich? Ich hab nur eins auf Englisch, bei dem zwar im ersten Kapitel das Fenster an sich gut erklärt wird, aber weder gezeigt wird, wie man Knöpfle bastelt, noch wie man einfach ins Fenster was reinschreibt...
-
das hier sieht doch ganz gut aus: www.win-api.de
und das hier sah beim überfliegen auch gar nich schlecht aus:
http://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api2.htmauch http://www.pronix.de/pronix-1023.html kann so falsch nicht sein
das diese punkte nicht als allererstes im tut kommen, sollte ja wohl klar sein - es ist nun mal nicht ganz trivial - und das erzeugen alleine bringt dir ja wohl gar nichts, wenn du dann nicht weiter weist - also brauchst du auch das ganze msg-zeugs, was meist nach dem fenster erstellen behandelt wird - und erst danach kannst du sinnvoll buttons etc erzeugen - und dann kannst du auch auf nen klick o.ä. reagieren...
bb
-
http://www.tutorials.de/forum/c-c/136154-c-win-api-gutes-tutorial-mit-quellcode.html
Keine Ahnung ob die Tips gut sind, aber ich hab das ganz schnell gefunden (google: "deutsches WinAPI-Tutorial")
-
Danke für die Tut Links! Sieht echt net schlecht aus, vorallem sind die jetzt auf Deutsch

Also damit werde ich mich jetzt befassen und wenn ich nochmal Fragen hab, mach ich einen neuen Thread im WinApi forum
Danke an alle