Code aus Lehrbuch -> Fehler



  • Dieser Code ist aus einem Lehrbuch zur Windowsprogrammierung mit C++ und der compiliert sich erstmal nicht

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
    					 HINSTANCE hPrevInstance,
    					 LPSTR lpCmdLine,
    					 int nCmdShow)
    
    {
    	WNDCLASS WndClass;
    	WndClass.style =0;
        WndClass.cbClsExtra =0;
        WndClass.cbWndExtra =0;
        WndClass.lpfnWndProc = WndProc;
        WndClass.hInstance = hInstance;
    	WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    	WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
    	WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    	WndClass.lpszMenuName =0;
    	WndClass.lpszClassName = "GDIProc1";
    
    	RegisterClass(&WndClass);
    
    	HWND hWindow;
    	hWindow = CreateWindow("Fenster1","Fenster",
    		                    WS_OVERLAPPEDWINDOW,
    							0,0,600,460,NULL,NULL,
    							hInstance,NULL);
    
    	ShowWindow (hWindow, nCmdShow);
    
    	UpdateWindow (hWindow);
    
    	MSG Message;
    	while (GetMessage(&Message,NULL,0,0))
    	{
    		DispatchMessage(&Message);
    	}
    	return (Message.wParam);
    }
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage,
    						 WPARAM wParam,LPARAM lParam)
    {
    	switch(uiMessage)
    	{
    	case WM_PAINT:
    		HPEN hPen;
    		HPEN hPenalt;
    		HBRUSH hBrush;
    		HBRUSH hBrushalt;
    		hBrush = CreateSolidBrush (RGB(255,100,0));
    		hPen = CreatePen (PS_SOLID,2,RGB(0,255,255));
    		HDC hdc;
    		PAINTSTRUCT ps;
    		hdc = BeginPaint (hWnd, &ps);
            		hBrush = SelectObject(hdc,hBrush);
    		hPen = SelectObject (hdc,hPen);
    		MoveToEx (hdc,20,20,NULL);
    		LineTo (hdc,100,100);
    		Rectangle (hdc,120,20,240,140);
    		RoundRect (hdc,260,20,420,140,20,20);
    		RECT rect;
    		SetRect (&rect,20,260,240,420);
    		FrameRect (hdc,&rect,hBrush);
    		SetRect (&rect,260,260,420,420);
    		FillRect (hdc,&rect,hBrush);
    		Ellipse (hdc,440,260,480,420);
    		SelectObject (hdc,hBrushalt);
    		SelectObject (hdc,hPenalt);
    		DeleteObject (hPen);
    		DeleteObject (hBrush);
    		EndPaint (hWnd, &ps);
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	default:
    		return DefWindowProc (hWnd, uiMessage,
    								wParam, lParam);
    	}
    }
    

    Dann habe ich den code so verändert, daß kein Compilerfehler mehr kommt

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
    					 HINSTANCE hPrevInstance,
    					 LPSTR lpCmdLine,
    					 int nCmdShow)
    
    {
    	WNDCLASS WndClass;
    	WndClass.style =0;
        WndClass.cbClsExtra =0;
        WndClass.cbWndExtra =0;
        WndClass.lpfnWndProc = WndProc;
        WndClass.hInstance = hInstance;
    	WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    	WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
    	WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    	WndClass.lpszMenuName =0;
    	WndClass.lpszClassName = "GDIProc1";
    
    	RegisterClass(&WndClass);
    
    	HWND hWindow;
    	hWindow = CreateWindow("Fenster1","Fenster",
    		                    WS_OVERLAPPEDWINDOW,
    							0,0,600,460,NULL,NULL,
    							hInstance,NULL);
    
    	ShowWindow (hWindow, nCmdShow);
    
    	UpdateWindow (hWindow);
    
    	MSG Message;
    	while (GetMessage(&Message,NULL,0,0))
    	{
    		DispatchMessage(&Message);
    	}
    	return (Message.wParam);
    }
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage,
    						 WPARAM wParam,LPARAM lParam)
    {
    	switch(uiMessage)
    	{
    	case WM_PAINT:
    		HPEN hPen;
    		HPEN hPenalt;
    		HBRUSH hBrush;
    		HBRUSH hBrushalt;
    		hBrush = CreateSolidBrush (RGB(255,100,0));
    		hPen = CreatePen (PS_SOLID,2,RGB(0,255,255));
    		HDC hdc;
    		PAINTSTRUCT ps;
    		hdc = BeginPaint (hWnd, &ps);
              hBrush   = static_cast<HBRUSH>(SelectObject(hdc, hBrush));
    		//hBrush = SelectObject(hdc,hBrush);
    		hPen = static_cast<HPEN>(SelectObject(hdc, hPen));
    		//hPen = SelectObject (hdc,hPen);
    		MoveToEx (hdc,20,20,NULL);
    		LineTo (hdc,100,100);
    		Rectangle (hdc,120,20,240,140);
    		RoundRect (hdc,260,20,420,140,20,20);
    		RECT rect;
    		SetRect (&rect,20,260,240,420);
    		FrameRect (hdc,&rect,hBrush);
    		SetRect (&rect,260,260,420,420);
    		FillRect (hdc,&rect,hBrush);
    		Ellipse (hdc,440,260,480,420);
    		SelectObject (hdc,hBrushalt);
    		SelectObject (hdc,hPenalt);
    		DeleteObject (hPen);
    		DeleteObject (hBrush);
    		EndPaint (hWnd, &ps);
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	default:
    		return DefWindowProc (hWnd, uiMessage,
    								wParam, lParam);
    	}
    }
    

    Jetzt gibt es zwar keinen Fehler beim erstellen mehr, aber das Programm macht nicht das, was es soll. Startet zwar, zeigt aber nicht das Fenster an.

    Was ist da nicht richtig? Zumal der Code aus einem Lehrbuch ist ( das ist übrigens ganz am Anfang der Buches ) Da verliert man doch die Lust beim lernen.

    Bitte um Hilfe

    Gruß



  • evil-peter schrieb:

    Zumal der Code aus einem Lehrbuch ist

    Das muss nichts heißen.

    evil-peter schrieb:

    Da verliert man doch die Lust beim lernen.

    Besorg dir am besten ein vernünftiges Lehrbuch. Ausserdem gehört deine Frage nicht in dieses Forum.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bei CreateWindow muss der vorher registrierte Klassenname angegeben werden. Bei dir wäre das "GDIProc1", das geliche wie bei WndClass.lpszClassName der Aufruf sollte also so aussehen:

    hWindow = CreateWindow("GDIProc1","Fenster",
                                WS_OVERLAPPEDWINDOW,
                                0,0,600,460,NULL,NULL,
                                hInstance,NULL);
    

    Wenns so immer noch nich geht guck ich gern nochmal drüber, ob mir nochwas auffällt.
    Das mit dem Brush und Pen hast du so übrigens richtig gelöst, alternativ hättest du auch hBrushAlt und hPenAlt vom Typ HGDIOBJ machen können, dann sparst du dir den Typecast, kannst du aber auch so lassen, ich machs auch fast immer mit nem Typecast.

    Zu dem Buch nochmal:
    Die WinMain ist schon recht reduziert, also auch nicht zu viel für den Anfang. Ich hätte zwar WndClass mit 0 initialisiert unbd nur die wirklich benötigten Attribute noch sinnvoll egfüllt, aber so schlecht wird das Buch schon nicht sein, nur wegen dem einen Schusslichkeitsfehlerchen. Wie heißt es denn? Von Charles Petzold is es ja nich oder der hatte glaub einen etwas andern Stil?



  • Hat sich erledigt Habe den Fehler mit dem Programm-Namen dann auch entdeckt.
    Ja und das andere war ja so in Ordnung. Jetzt geht es natürlich auch!!

    Sorry noch mal für das falsche Posting, aber ich bin ja noch neu auf der Seite.
    Beim nächsten Posting, werde ich besser schauen!

    Danke noch mal!!!

    Das Buch ist übrigens von Henning Hansen


Anmelden zum Antworten