C++ Hilfe beim Code =)

Gotenks666

Ensign
Registriert
Mai 2009
Beiträge
165
Hy Leute,
da ich ein totaler anfänger in c++ bin hoffe ich das ihr mir helfen könnt =)
Ich möchte gerne wissen wie ich bei dem code ein Button einfügen kann oder ein text
Und wo und wie der Code ist =)

Code:
    #define STRICT    //Benötigt man..

    #include <windows.h> //Benötigt man..

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  //Zum Epfangen der Eingaben des Benutzers

    const char szAppName[] = "Ein eigenes Fenster";  //Fensterklassen-Name

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,   //Sub Beginn
                       PSTR szCmdLine, int iCmdShow)
    {

          HWND       hWnd;  //hwnd deklarieren
       MSG        msg;             //msg deklarieren (wird zum übergeben von eingaben benötigt)
       WNDCLASS   wc;          //Windows Klasse "wc" deklarieren

    //Jetzt wird die Windows Klasse "wc" mit Informationen gefüllt. Das ist praktisch das Fenster..:

          wc.style         =  CS_HREDRAW | CS_VREDRAW;  //Style
       wc.lpfnWndProc   =  WndProc;

          wc.cbClsExtra    =  0;
       wc.cbWndExtra    =  0;



          wc.hInstance     =  hInstance;
       wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);  //Curosor
       wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);  //Icon
       wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH); //Background Farbe (in dem Fall weiß)

          wc.lpszClassName =  szAppName;  //Fensterklasse
       wc.lpszMenuName  =  NULL;  //Kein Menü (NULL)

          RegisterClass(&wc);  //Das ganze registreiren

            hWnd = CreateWindow(szAppName,  //Das ganze Fenster mit dem deklarierten hwnd handle erstellen (CreateWindow)
                           "Emulation /C++ By Gotenks666",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Fensterbreite              */
                           CW_USEDEFAULT,          /* Fensterhoehe               */
                           NULL,
                           NULL,
                           hInstance,
                           NULL);

              ShowWindow(hWnd, iCmdShow);  //Das Fenster anzeigen
       UpdateWindow(hWnd);  //und Updaten

    //Soo..nun wird das Fenster angezeigt & der Benutzer kann es steuern.

         while (GetMessage(&msg, NULL, 0, 0))           //Wenn eine Message reingeht (z.b. wenn der Nutzer "Schliessen" gedrückt hat
       {

                 TranslateMessage(&msg);          //Wird die Nachricht übersetzt
          DispatchMessage(&msg);                           
       }

           return msg.wParam;                          //Nun wird die Nachricht returnt..
    }

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  //Hier werten wir die msg aus
    {

          switch (message)  //Wir wählen jetzt aus , was passeiren soll wenn der benutzer was gemacht hat.
       {

             
       case WM_DESTROY:     //Wenn er SCHLIESEN gedrückt hat ,
          {
             PostQuitMessage(0);   //Wird das Fenster geschlossen
             return 0;
          }
       }
       return DefWindowProc(hWnd, message, wParam, lParam); //Dann noch returnen
    }

    //Ende
 
hi,

ohne viele Worte:
Code:
  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HWND hButton;
        RECT rect;
        PAINTSTRUCT ps;
        // HINSTANCE hInst;
         
        switch (message)
        {
        //  WM_CREATE: das Fenster wurde erstellt, ist aber noch nicht sichtbar
        case WM_CREATE:
            // erstelle Button an Pos. x=0,y=0 (linke obere Ecke des client area) und der größe 100x20Pixel
            hButton = CreateWindow("button","Some Button",WS_CHILD+WS_VISIBLE,0,0,100,20,hWnd,0,hInst,0);
            break;

        // Wann immer es gilt etwas (neu/wieder) zu Zeichenen wird WM_PAINT gesendet (bezieht sich nur auf das client area)    
        case WM_PAINT: 
            // siehe msdn...
            BeginPaint(hWnd,&ps);
            
            // aktuelle größe des client area ermitteln
            GetClientRect(hWnd,&rect);
            // gib einen Text in der Mitte des client area aus
            DrawText(ps.hdc,&szAppName,sizeof(szAppName),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
            
            // siehe msdn
            EndPaint(hWnd,&ps);
            break;          
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
die Verwendeten Funktionen kannst du bei msdn nach schlagen...
 
hButton sollte in der WndProc unbedingt als static deklariert werden, sonst geht das Fensterhandle beim Verlassen der Funktion flöten.
 
Danköööö
Ergänzung ()

Ähm ja... hier nochmal der Code mit dem Button aber hier wied ein fehler angezeigt!
hButton = CreateWindow("button","Some Button",WS_CHILD+WS_VISIBLE,0,0,100,20,hWnd,0,hInst,0);

Code:
#define STRICT    //Benötigt man..

    #include <windows.h> //Benötigt man..

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  //Zum Epfangen der Eingaben des Benutzers

    const char szAppName[] = "Ein eigenes Fenster";  //Fensterklassen-Name

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,   //Sub Beginn
                       PSTR szCmdLine, int iCmdShow)
    {

          HWND       hWnd;  //hwnd deklarieren
       MSG        msg;             //msg deklarieren (wird zum übergeben von eingaben benötigt)
       WNDCLASS   wc;          //Windows Klasse "wc" deklarieren

    //Jetzt wird die Windows Klasse "wc" mit Informationen gefüllt. Das ist praktisch das Fenster..:

          wc.style         =  CS_HREDRAW | CS_VREDRAW;  //Style
       wc.lpfnWndProc   =  WndProc;

          wc.cbClsExtra    =  0;
       wc.cbWndExtra    =  0;



          wc.hInstance     =  hInstance;
       wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);  //Curosor
       wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);  //Icon
       wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH); //Background Farbe (in dem Fall weiß)

          wc.lpszClassName =  szAppName;  //Fensterklasse
       wc.lpszMenuName  =  NULL;  //Kein Menü (NULL)

          RegisterClass(&wc);  //Das ganze registreiren

            hWnd = CreateWindow(szAppName,  //Das ganze Fenster mit dem deklarierten hwnd handle erstellen (CreateWindow)
                           "Emulation /C++ By Gotenks666",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Fensterbreite              */
                           CW_USEDEFAULT,          /* Fensterhoehe               */
                           NULL,
                           NULL,
                           hInstance,
                           NULL);

              ShowWindow(hWnd, iCmdShow);  //Das Fenster anzeigen
       UpdateWindow(hWnd);  //und Updaten

    //Soo..nun wird das Fenster angezeigt & der Benutzer kann es steuern.

         while (GetMessage(&msg, NULL, 0, 0))           //Wenn eine Message reingeht (z.b. wenn der Nutzer "Schliessen" gedrückt hat
       {

                 TranslateMessage(&msg);          //Wird die Nachricht übersetzt
          DispatchMessage(&msg);                           
       }

           return msg.wParam;                          //Nun wird die Nachricht returnt..
    }

  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HWND hButton;
        RECT rect;
        PAINTSTRUCT ps;
        // HINSTANCE hInst;
         
        switch (message)
        {
        //  WM_CREATE: das Fenster wurde erstellt, ist aber noch nicht sichtbar
        case WM_CREATE:
            // erstelle Button an Pos. x=0,y=0 (linke obere Ecke des client area) und der größe 100x20Pixel
            hButton = CreateWindow("button","Some Button",WS_CHILD+WS_VISIBLE,0,0,100,20,hWnd,0,hInst,0);
            break;

        // Wann immer es gilt etwas (neu/wieder) zu Zeichenen wird WM_PAINT gesendet (bezieht sich nur auf das client area)    
        case WM_PAINT: 
            // siehe msdn...
            BeginPaint(hWnd,&ps);
            
            // aktuelle größe des client area ermitteln
            GetClientRect(hWnd,&rect);
            // gib einen Text in der Mitte des client area aus
            DrawText(ps.hdc,&szAppName,sizeof(szAppName),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
            
            // siehe msdn
            EndPaint(hWnd,&ps);
            break;          
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
 
Versuch's mal so:

Code:
hButton = CreateWindow(TEXT("button"), TEXT("some button"), WS_CHILD | WS_VISIBLE, 0, 0, 100, 20, hWnd, (HMENU) 101, hInst, NULL);
 
ne auch en fehler...
Ergänzung ()

vll kannste mir ein fetigen code schreiben ^^
 
Na gut, weil bald Weihnachten ist :stock: :D

Code:
#define STRICT    //Benötigt man..

#include <windows.h> //Benötigt man..

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  //Zum Epfangen der Eingaben des Benutzers

const TCHAR szAppName[] = TEXT("Ein eigenes Fenster");  //Fensterklassen-Name

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,   //Sub Beginn
				   PSTR szCmdLine, int iCmdShow)
{

	HWND       hWnd;  //hwnd deklarieren
	MSG        msg;             //msg deklarieren (wird zum übergeben von eingaben benötigt)
	WNDCLASS   wc;          //Windows Klasse "wc" deklarieren

	//Jetzt wird die Windows Klasse "wc" mit Informationen gefüllt. Das ist praktisch das Fenster..:

	wc.style         =  CS_HREDRAW | CS_VREDRAW;  //Style
	wc.lpfnWndProc   =  WndProc;

	wc.cbClsExtra    =  0;
	wc.cbWndExtra    =  0;



	wc.hInstance     =  hInstance;
	wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);  //Curosor
	wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);  //Icon
	wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH); //Background Farbe (in dem Fall weiß)

	wc.lpszClassName =  szAppName;  //Fensterklasse
	wc.lpszMenuName  =  NULL;  //Kein Menü (NULL)

	RegisterClass(&wc);  //Das ganze registreiren

	hWnd = CreateWindow(szAppName,  //Das ganze Fenster mit dem deklarierten hwnd handle erstellen (CreateWindow)
		TEXT("Emulation /C++ By Gotenks666"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,          /* X-Position auf dem Monitor */
		CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
		CW_USEDEFAULT,          /* Fensterbreite              */
		CW_USEDEFAULT,          /* Fensterhoehe               */
		NULL,
		NULL,
		hInstance,
		NULL);

	ShowWindow(hWnd, iCmdShow);  //Das Fenster anzeigen
	UpdateWindow(hWnd);  //und Updaten

	//Soo..nun wird das Fenster angezeigt & der Benutzer kann es steuern.

	while (GetMessage(&msg, NULL, 0, 0))           //Wenn eine Message reingeht (z.b. wenn der Nutzer "Schliessen" gedrückt hat
	{

		TranslateMessage(&msg);          //Wird die Nachricht übersetzt
		DispatchMessage(&msg);                           
	}

	return msg.wParam;                          //Nun wird die Nachricht returnt..
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND hButton, hButton2;
	RECT rect;
	PAINTSTRUCT ps;
	static HINSTANCE hInst;

	switch (message)
	{
		//  WM_CREATE: das Fenster wurde erstellt, ist aber noch nicht sichtbar
	case WM_CREATE:
		// erstelle Button an Pos. x=0,y=0 (linke obere Ecke des client area) und der größe 100x20Pixel
		hInst = GetModuleHandle(NULL);
		hButton = CreateWindow(TEXT("button"),TEXT("Some Button"),WS_CHILD | WS_VISIBLE,0,0,100,20,hWnd,(HMENU) 101,hInst,0);
		hButton2 = CreateWindow(TEXT("button"),TEXT("Some other Button"),WS_CHILD | WS_VISIBLE,150,0,140,20,hWnd,(HMENU) 102,hInst,0);
		break;

		// Wann immer es gilt etwas (neu/wieder) zu Zeichenen wird WM_PAINT gesendet (bezieht sich nur auf das client area)    
	case WM_PAINT: 
		// siehe msdn...
		BeginPaint(hWnd,&ps);

		// aktuelle größe des client area ermitteln
		GetClientRect(hWnd,&rect);
		// gib einen Text in der Mitte des client area aus
		DrawText(ps.hdc,szAppName,sizeof(szAppName),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); 

		// siehe msdn
		EndPaint(hWnd,&ps);
		break;          
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
 
Zuletzt bearbeitet: (Siehe unten)
xD Danke schön =)
Ergänzung ()

Wie kann ich jetzt einen 2ten Button nebendran machen? ^^
 
Um hier nicht noch so ein riesen Listing reinzuposten, habe ich das obige editiert. Bevor du jetzt aber immer weiterfragst - und das ist jetzt nicht böse gemeint - solltest du dich erstmal bemühen, den bisherigen Code zu verstehen. Deine Frage nach dem zweiten Button zeigt mir nämlich dass du es noch nicht verstanden hast. Der Petzold ist hier der Beste Weg, das zu lernen (aber dein bisheriger Code sieht eh schon recht Petzoldig aus, kann das sein?). Alternativ solltest du dir mal Windows Forms und C# angucken, da ist alles einfacher als mit der angestaubten Win32 API.
 
Ich hab dasselbe gemacht wie du und ich verstehe ihn auch bloß ich depp hab die 2vergessen :D
 
Alles klar, dann habe ich nichts gesagt =) Tipp für die Zukunft: Wenn ein Fehler beim Kompilieren auftritt, die Fehlermeldung hier zitieren.

Hausaufgabe zum nächsten Mal: Anzeigen von MessageBoxen beim Klicken auf die Buttons (natürlich verschiedene Texte) :-P
 
ahhh... danke =)
Ergänzung ()

Code:
hButton2 = CreateWindow(TEXT("button"),TEXT("Close"),WS_CHILD | WS_VISIBLE,810,500,140,20,hWnd,(HMENU) 102,hInst,0);
Boah sry das ich nochmal frage xDDD aber das soll ein Close Button werden ^^ blos weis ich den code nich mehr dazu und in google finde ich auch nix mehr ÖÖ
 
Also Kommando-Aktionen wie das Klicken eines Buttons oder das Betätigen eines Menüeintrages veranlassen Windows dazu, eine Nachricht vom TYP WM_COMMAND an die WndProc zu senden. Was die Aktion veranlasst hat, also welcher Button in deinem Fall, übergibt Windows in wParam:

wID

Value of the low-order word of wParam. Specifies the identifier of the menu item, control, or accelerator.

Das ist genau der Wert, den du als neunten Parameter von CreateWindow angegeben hast, also bei deinem Close Button 102. Als Reaktion auf einen Klick auf "Close" würde ich dir CloseWindow empfehlen ;)
In der WndProc schreibst du also in der switch-Anweisung:

Code:
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case 102:
			CloseWindow(hWnd);
			break;
		}

		break;
 
Zuletzt bearbeitet: (Fehlendes break nachgereicht)
äh ja.. das teil wird aber minimiert xDDD nicht geschlossen

Und das mit dem 2ten Textfeld als das sich wen ich auf Start Game clicke ein neues fenster öffnent raff ich auch iwie nicht ÖÖ Am besten du bringtst mir alles bei :D
 
Ah sorry, bin selber ein bissl eingerostet. Zum schließen nimmt man DestroyWindow.

Was du mit dem zweiten Textfeld, Start Game und dem neuen Fenster meinst, müsstest du bitte nochmal etwas weiter ausführen.
 
Ich klicke jetzt z.B auf weiter wie bei einer Instalation... dan kommt ein anderen fenster oder sogar eine neue exe datei wird aufgerufen...

Da muss ich glaub ich auch eine neue datei anlgen oder?

(haste icq oder msn ?)
 
Zurück
Oben