C-WinAPI-Funktionen einkapseln



  • Mit der WinAPI kenne ich mich bereits in vielen Bereichen aus- Fenstererstellung, Controlserstellung usw. Deshalb habe ich gerade versucht, einen kleinen Wrapper zu basteln, allerdings in C ohne OOP. Es werden zwar schon Fenster erstellt und auch Controls(Buttons, Labels), aber mit denen gibt es einige Probleme.

    Das ist mein Versuch, einen Button ohne viel Aufwand zu erstellen.

    void Button(HWND hButton, HWND hwnd, char *Caption, int x, int y, int Width, int Height) {
    	hButton = CreateWindow("button",
    		Caption,
    		WS_CHILD | WS_VISIBLE, x, y, Width, Height, hwnd, NULL,
    		0, NULL);
    }
    

    Wenn ich es jetzt unter WM_CREATE aufrufe, dann wird zwar der Button erstellt, aber sobald ich ein WM_COMMAND-Event für diesen Button hinzufüge, schließt sich das Programm einfach.

    LRESULT CALLBACK Messages(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam) {
    	switch(umsg) {
    	case WM_CREATE: {
    			Button(button1, hWnd, "Button1", 50, 50, 100, 100);
    			return 0;
    		}
    	case WM_COMMAND: {
    			if (lParam == (LPARAM)button1) {
    				if (HIWORD(wParam) == BN_CLICKED)
    					SetCaption(hWnd, "Test");
    				return 0;
    			}
    		}
    	case WM_DESTROY: {
    			PostQuitMessage(0);
    			return 0;
    		}
    	}
    	return DefWindowProc(hWnd, umsg, wParam, lParam);
    }
    

    P.S.: Mit SetCaption ändert man den Titel eines bestimmten Controls. - getestet und erfolgreich



  • du solltest auch einen Zeiger auf button1 übergeben, und nicht den Inhalt von button1 (uninitalisierten).



  • ein

    break;
    

    vor

    case WM_DESTROY:
    

    wäre auch hilfreich.



  • Hat es einen bestimmten Grund dass du das in "C-ohne-plus-plus" machst? Mit C++ machen solche Wrapper viel mehr Freude, weil man viel elegantere Wrapper basteln kann 😉



  • Ich werde erstmal die Funktionen für C schreiben. Wenn das wirklich gut funktioniert, kann ich ja noch die OOP für C++ ergänzen.



  • Die WinApi-Schnittstelle ist ohnehin reines C, also kannst du zunächst dabei bleiben. Belli hat aber das wesentliche gesagt: in switch-Anweisungen ist ein break erforderlich oder das Programm läuft in den nächsten case.



  • Na gut. Ihr habt Recht. So schwer ist es mit OOP garnicht. Es ist zwar etwas umfangreicher gestaltet, doch im Prinzip kann man sich besser reinfinden als bei der funktionalen Programmierung, wenn man sich gut in den Anfang reingefädelt hat.





  • So nen Wrapper ist relativ einfach.

    Mach eine globale WindowProc Funktion, die die Argumente empfängt. Über SetWindowLongPtr kannst Du dem Fenster BenutzerDaten zuweisen. Hier einfach einen Zeiger auf die Klasse einsetzen, die das Fenster besitzt.
    In der globalen Funktion holst du dir einfach den Zeiger mit GetWindowsLongPtr() und übergibst dann der echten WindowProc die Argumente.
    Hier ist ein guter Artikel dazu:
    http://www.codeproject.com/KB/winsdk/win32windowwrapperclass.aspx

    edit:
    Mist, OHNE OOP :p. Sorry, hab mich verlesen :D.



  • Es ist schon richtig. Ich habe meinen Wrapper z.Z. auf OOP umstrukturiert und teste es gerade in C++ Builder 2010. Im Gegensatz zur MFC habe ich bei meinem Wrapper Eigenschaften ähnlich der VCL eingeführt, die ein visuelles Arbeiten mit Objekten ermöglichen. Für die WndProc-Methode werde ich mir in nächster Zeit den Wrapper von CodeProject ansehen.



  • Später kann man ja noch die WndProc etwas mehr einkapseln, sodass man z.B. eine Art Response Table definiert und dort die ganzen Events hinzufügt.


Anmelden zum Antworten