WinApi - OOP



  • Da "done" ebenfalls nicht initialisiert ist, wird das Fenster vermutlich nur kurz eingeblendet.
    Und durch PeekMessage hat dein Programm ständig maximale Auslastung.



  • ja das mit "done" hab ich selbst schon bemerkt und breakpoints hab ich benutzt so konnte ich den Fehler auf die Klassen registrierung und die CreateWindow funktion beschrenken. Aber von Watch-Window hab ich noch nie was gehört. was ist das denn?



  • @Th69 und ich weiß das es sowas schon gibt. ich möchte es aber selber machen.
    und ich will versuchen awesomium zu implementieren falls das hier jemand kennt.



  • kennt hier denn jemand awesomium?



  • darman96 schrieb:

    [...] ich habe mal versucht mir eine Klasse zu schreiben um es zu vereinfachen ein WinApi Fenster zu erstellen. [...]

    Th69 schrieb:

    Deinen Ansatz gibt es schon und nennt sich MFC.

    btw: Application developers should not write frameworks and toolkits

    darman96 schrieb:

    [...] ich will versuchen awesomium zu implementieren [...]

    Brauchst nicht - das machen schon die Typen auf http://awesomium.com

    darman96 schrieb:

    [...] breakpoints hab ich benutzt so konnte ich den Fehler auf [...] die CreateWindow funktion beschränken. [...]

    . o O ( Rückgabewerte zu prüfen scheint total out zu sein 😕 )

    darman96 schrieb:

    [...] Aber von Watch-Window hab ich noch nie was gehört. was ist das denn?

    1. Breakpoint setzten
    2. Programm mit [F5] debuggen
    3. Menü Debug -> Windows -> Watch -> ...
    4. ?
    5. Profit!


  • @Swordfish:

    Ich mach das mit der klasse auch nur zum spaß und um was zu lernen.
    Außerdem bin ich noch in der Schule und muss für niemanden irgendwelche anwendungen schreiben also hab ich genug zeit sowas mal auszuprobieren 😃

    zu Awesomium:
    ich will das SDK von Awesomium.com benutzen um die GUI für meine Programme zu machen.

    zu Watch-Windows:
    Ich werds mal ausprobieren danke.

    Gruß darman96



  • hat jemand Vorschläge wie ich die Klasse noch verbessern könnte?

    Gruß darman96



  • Ja, löschen und neu schreiben. Ernsthaft. Guck dir mal RAII an. Insbesondere Konstruktoren und Destruktoren. Eine Methode Init() weist so gut wie immer darauf hin, dass man das Prinzip nicht verstanden hat. Eine Methode die man vor Init aufrufen muss noch mehr. Nutze Initialisierungslisten. Höre auf auf Membervariablen mit this-> zuzugreifen wenn es nicht unbedingt nötig ist. Nimm Abstand von der ungarischen Notation. (Außer bei windowseigenen Typen vll.)
    WNDCLASS ist kein Member eines Fensterobjekts. msg, title, Größe etc. musst du auch nicht speichern, das macht die WinAPI doch schon. Der einzige Member den du brauchst ist das Handle. (HWND) Was zum Henker macht isDone()? auf const correctness achten. int ist nicht der richtige Typ für Bildschirmkoordinaten oder Größenangaben, oder hast du da schon mal negative Werte gesehen? (std::uint16_t wäre der richtige Typ.)
    Warum heißt deine Klasse überhaupt Application? Das ist so ziemlich der am wenigsten aussagekräftige Name den man sich vorstellen kann. Das ist eine Fensterklasse verdammt, nenn sie window oder so. Und so kannst du auch nicht mehrere Fenster erstellen. Guck dir mal den Beitrag von Shade Of Mine hier an.



  • darman96 schrieb:

    hat jemand Vorschläge wie ich die Klasse noch verbessern könnte?

    • Auf C-Präfix und generell auf UN verzichten (bei hWnd kann man noch darüber streiten, aber "i" und "n" vor Integers ist fragwürdig)
    • Leere Parameterlisten ohne void
    • Konstruktor-Initialisierungsliste verwenden
    • Const-Correctness bei Get-Methoden beachten
    • Keine leeren Destruktoren definieren
    • Init() privat machen und direkt im Konstruktor aufrufen
    • Konsistente Namenskonvention ( isDone vs. SetTitle )
    • Konsistente Namen ("Befehle" wie HandleMessages statt MessageHandling )
    • static_cast statt C-Casts verwenden
    • Sich überlegen, nach welchem Kriterium Funktionen inline sind (oder gleich alles in der .cpp-Datei definieren)


  • cooky451 schrieb:

    ... int ist nicht der richtige Typ für Bildschirmkoordinaten oder Größenangaben, oder hast du da schon mal negative Werte gesehen? (std::uint16_t wäre der richtige Typ.)

    Für Bildschirmangaben schon oder welchen Wert hat bei dir Top und Left, wenn du ein Fenster links bzw. oben teilweise außerhalb des sichtbaren Bereichs schiebst?



  • Th69 schrieb:

    cooky451 schrieb:

    ... int ist nicht der richtige Typ für Bildschirmkoordinaten oder Größenangaben, oder hast du da schon mal negative Werte gesehen? (std::uint16_t wäre der richtige Typ.)

    Für Bildschirmangaben schon oder welchen Wert hat bei dir Top und Left, wenn du ein Fenster links bzw. oben teilweise außerhalb des sichtbaren Bereichs schiebst?

    Dabei auch nicht zu vergessen: Multimonitorsysteme...



  • Könnte mir denn jemand mal ein Beispiel für so eine Klasse geben?



  • Zum Beispiel sf::Window von SFML, da ist WinAPI komplett weggekapselt. Kommt halt drauf an, was du genau machen willst... Wofür brauchst du das Fenster?



  • Ich hatte mir gedacht damit opengl Anwendungen zu machen und für die GUI awesowmium zu benutzen.

    Edit: Wo in den SFML dateien ist denn die WinMain funktion

    Edit 2: Habs gefunden.



  • So ein neuer Versuch:

    main.cpp:

    #include "stdafx.h"
    
    int WINAPI WinMain(HWND Handle, HINSTANCE Instance, HINSTANCE PrevInstance, LPCSTR CmdLine, int CmdShow) 
    {
    
    	Window window(Handle, Instance, "Test");
    
    }
    

    Window.h:

    #pragma once
    #pragma once
    
    #include "stdafx.h"
    
    class Window
    {
    public:
    	Window();
    	Window(HWND Handle, HINSTANCE hInstance, std::string title);
    	~Window();
    private:
    	HWND Handle;
    	HINSTANCE hInstance;
    
    	void RegisterWindowClass();
    	static LRESULT CALLBACK WndProc(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam);
    };
    

    Window.cpp:

    #include "Window.h"
    
    // static members
    const char* className = "MyClass";
    
    Window::Window(HWND Handle, HINSTANCE Instance, std::string title) : Handle(Handle), Instance(Instance)
    {
    
    	RegisterWindowClass();
    
    	Handle = CreateWindow(className, title.c_str(), WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, Instance, NULL);
    
    	ShowWindow(Handle, SW_NORMAL);
    	UpdateWindow(Handle);
    
    }
    
    Window::~Window(void)
    {
    }
    
    void Window::RegisterWindowClass() 
    {
    	WNDCLASSEX wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    	wcex.style = CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc = WndProc;
    	wcex.cbClsExtra = 0;
    	wcex.cbWndExtra = 0;
    	wcex.hInstance = Instance;
    	wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wcex.lpszMenuName = NULL;
    	wcex.lpszClassName = className;
    	wcex.hIconSm = NULL;
    
    	RegisterClassEx(&wcex);
    }
    
    LRESULT CALLBACK Window::WndProc(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam)
    {
    
    	if(Message == WM_CREATE) 
    	{
    		long This = reinterpret_cast<long>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);
    		SetWindowLongPtr(Handle, GWLP_USERDATA, This);
    	}
    
    	Window* window = reinterpret_cast<Window*>(GetWindowLongPtr(Handle, GWLP_USERDATA));
    
    	return DefWindowProc(Handle, Message, wParam, lParam);
    
    }
    

    Jetzt bekomm ich aber immer diese fehlermeldung:

    Fehler	1	error C2731: 'WinMain': Überladen der Funktion nicht möglich
    

    PS: ich weiß das da noch einiges fehlt vor allem was message handling angeht aber ich will das jetzt erst mal so ans laufen kriegen 😉



  • Das liegt daran, dass die Parameterliste deiner WinMain Mist ist...



  • Oh stimmt habs grad gesehen o.o sorry.



  • Btw: Ich kann nur sehr empfehlen, die englische Version von Visual Studio zu benutzen, allein schon weil google dir für deutsche Compilerfehler wesentlich weniger ausspucken wird...



  • Ich hab grad vs 2012 getestet und das war auf deutsch. die 2010er version hab ich auf englisch und mal sehen obs die 2012 auch in englisch gibt.

    Kann mir jemand nen Tipp geben wie ich das Message Handling machen könnte ?



  • Woran genau scheitert's?


Anmelden zum Antworten