Ein eigenes Fenster



  • hi ich habe eine frage zu diesem code...
    was soll das mit diesen nachrichten? und wo genau beginnt da der eigentlich programm code? und geht das nicht auch kürzer?

    /*
     * Tutorial Code zu: Tutorial 2 "Ein eigenes Fenster"
     *
     * http://www.Loggy.de.st/
     *
     * Henno Buschmann (Loggy.mail@gmx.de)
     */
    
    #define STRICT
    
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	/* Prototyp: WndProc bearbeitet Nachrichten */
    
    const char szAppName[]	= "Ein eigenes Fenster";		/* Programmname */
    
    /* Funktion: WinMain
     *
     *		Einstiegspunkt eines Windows Programms. Erzeugt Fenster und ruft Nachrichten ab.
     * Parameter:
     *		HINSTANCE hInstance		: Programm ID; identifiziert die Programminstanz
     *		HINSTANCE hPrevInstance	: Ist in Win32 immer Null
     *		PSTR szCmdLine			: Commandozeilen Parameter, als C-String
     *		int iCmdShow			: Speichert, wie das eventuelle Fenster angezeigt werden soll
     * Rückgabe:
     *		int						: Null für keinen Fehler
     */
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	MSG			msg;									/* Struktur speichert Nachrichten */
    	HWND		hWnd;									/* Handle auf unser Hauptfenster */
    	WNDCLASS	wc;										/* Struktur zum Fensterklassen bescheiben */
    
    	wc.style				= CS_HREDRAW | CS_VREDRAW;	/* Repaint bei Fenstergößenänderung */
    	wc.lpfnWndProc			= WndProc;					/* Nachrichtenbearbeitungs Funktion */
    	wc.cbClsExtra			= 0;
    	wc.cbWndExtra			= 0;
    	wc.hInstance			= hInstance;				/* Programm ID (Parameter von WinMain)*/
    	wc.hCursor				= LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon				= LoadIcon(NULL, IDI_APPLICATION);
    	wc.hbrBackground		= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wc.lpszClassName		= szAppName;				/* Klassenname (bei uns = Programmname) */
    	wc.lpszMenuName			= NULL;
    
    	RegisterClass(&wc);									/* Fensterklasse anmelden */
    
    	hWnd = CreateWindow(	szAppName,					/* Fenster erstellen */
    							"Titelleiste",
    							WS_OVERLAPPEDWINDOW,		/* Fensterstil */
    							CW_USEDEFAULT,				/* X-Position */
    							CW_USEDEFAULT,				/* Y-Position */
    							CW_USEDEFAULT,				/* Breite */
    							CW_USEDEFAULT,				/* Höhe */
    							NULL,
    							NULL,
    							hInstance,					/* Programm ID */
    							NULL);
    
    	ShowWindow(hWnd, iCmdShow);							/* Fenster anzeigen */
    	UpdateWindow(hWnd);									/* Und ein Repaint */
    
    	while (GetMessage(&msg, NULL, 0, 0))				/* Nachrichten abrufen... */
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);							/* ... und bearbeiten */
    	}
    
    	return msg.wParam;									/* Rückgabewert nicht vergessen */
    }
    
    /*
     * Funktion WndProc
     *		Bearbeitet alle Nachrichten eines Fensters.
     * Parameter:
     *		HWND hWnd		: Handle für das Fenster
     *		UINT message	: Welche Nachricht? Als Konstanten aus windows.h
     *		WPARAM wParam	: Zusätzliche Informationen zu der Nachricht
     *		LPARAM lParam	: Zusätzliche Informationen zu der Nachricht
     */
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)									/* Welche Nachricht? */
    	{
    	case WM_DESTROY:									/* Fenster wird zerstört */
    		{
    			PostQuitMessage(0);							/* dann Programm mit Null beenden */
    			return 0;
    		}
    	}
    	return DefWindowProc(hWnd, message, wParam, lParam);/* Bearbeitet alle restlichen Nachrichten*/
    }
    


  • also ich würd mal sagen, dass des net kürzer geht, aber dafür kannstes ja fast immer so verwenden.

    Die Nachrichten sind des was Windows an dein Prog schickt, und was bei welchen Nachrichten passieren soll, legst du eben in deiner WndProc Funktion fest.
    Also z.B. in WM_CREATE was ganz am Anfang geschehen soll und so.

    Und wo jetzt der eigentliche Programmcode is? Naja, deine hauptfunktion baut dir halt dein fenster zusammen, und in deine nachrichtenfunktion machst du dann halt des rein, was im prog passieren soll. hängt eben davon ab, wann was passsieren soll, wo du des zeug hinschreibst.

    Weiß nich ob ich dir helfen konnte, habs aber mal versucht



  • Der Code beginnt mit der WinMain Funktion. Nachrichten sind, wie das Wort bereits verrät, Nachrichten :p oder Events die ausgelöst werden wenn dein Fenster erstellt, zerstört, in der Größe angepaßt, bewegt usw. wird. Kürzer gehts wenn du die ganzen Kommentare entfernst 🙄 Ansonsten sind es grundlegende Funktionsaufrufe die beim Erstellen eines Fensters notwending sind.



  • war doch mei rede



  • hm bin schon weiter...
    aber ich meinte, wo nun eben der eigentliche programm code hinkommt, der, solange das fenster geöffnet ist, ausgeführt wird...

    und was gibt es alles für messages?



  • ja, du kannst ja z.B. des was von anfang an auf dem bildschirm sein soll in WM_CREATE schreiben. was dann zur laufzeit hinzukommt, das musst du dann halt an entsprechende stelle hinpatzen, z.B. in WM_KEYDOWN oder ähnliches. Is alles davon abhängig, wann des in der Laufzeit pasieren soll.

    Du hast doch bestimmt a MSDN Sammlung. Dann geb mal im Index WM ein. Da kommen dann a ganzer Haufen mögliche Messages, da mangelts nich dran. Oder mussst halt auf Microsoft im Net suchen



  • Wo der Code hin kommt hängt ganz davon ab, was er machen soll, wann genau er ausgeführt werden soll und wie umfangreich er ist 😉

    Die Messages findest du alle in der MSDN-Library - z.B. hier (etwas weiter unten) die von normalen Fenstern 🙂



  • smash schrieb:

    aber ich meinte, wo nun eben der eigentliche programm code hinkommt, der, solange das fenster geöffnet ist, ausgeführt wird...

    zu sagen. zb in WM_CREATE wird in de regel alles für das fenster erstellt wie toolbars, statusbar, button usw usw.
    in WM_COMMAND werden dann die ereignisse ausgeführt. wie click auf button dann mach das, menü punkt ausgewählt dann mach das usw usw

    smash schrieb:

    und was gibt es alles für messages?

    viele je nach ctrl.
    zb fenster messages
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows.asp



  • ich würde mir ein buch kaufen und mir das durchlesen, dann versteht man des alles



  • kein geld um noch bücher zu kaufen!
    die softwares sind schon genug teuer!

    werde mich mal ein bisschen weiterarbeiten und mich allenfalls wieder melden...



  • kann ich ein fenster mit eigentlichem c code erstellen und dann im eigentlichen programm c++ code, bzw. directx verwenden?
    oder kommt das bei der fenster erstellung so oder so aufs gleiche raus?



  • Das kannst du eigentlich ohne große Probleme alles miteinander kombinieren 😉



  • wennst kein geld für bücher hast, dann hol dir ein tutorial ausm Netz, außer dir sind die Internetkosten zu hoch *g*. Die tuns auch fürn Anfang.
    Am besten wär aber "Windows-Programmierung" vom Petzold. Da checkst es am besten, allerdings happige 60 TEUROS. Programmieren is halt nich immer billig.
    Aber eine gute Investition, also auf geht's.



  • naja, ich will ja nicht hauptsächlich winapi programmieren...
    das ist halt ne kleine nebenerscheinung von dx programmierung...



  • ach, so hab ich auch angefangen, wollt directx ausprobieren und dann kamen so WINAPI Zeux rein, wovon ich keinen plan hatte. Deswegen fang ich mal ganz mit winapi von vorne an, um des von grund auf zu verstehen. DirectX kommt danach


Anmelden zum Antworten