GDI+ Brushes werden als muster gemalt 0.o



  • Hey c++er,
    ich habe mir in letzder Zeit mal GDI+ angesehen, da das GDI ja nicht sehr schön in C++ reinpasst. Nun habe ich mir zur Übung ein Pong gebastelt, wo jedoch gleich mehrere Fehler auftreten.
    1. kann ich keinen Kreis malen, stattdessen arbeite ich im Moment mit einem Rechteck.
    2. Wenn ich den Smoothing mode auf highqualitiy stelle wird garnichtsmehr gemalt.
    3. (Mein Hauptproblem) Wenn ich eine vorher deklariertes Brush benutze kommt immer so ein komisches Muster (bei jeder Farbe anders, es ändert sich bei neuausführng nicht)
    Mein Code:
    main.cpp:

    #include "Main.h"
    #include <Windows.h>
    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma once;
    #pragma comment(lib, "gdiplus.lib")
    #pragma comment(lib, "user32.lib")
    HWND hWnd;
    int winH = 600;
    int winW = 1000;
    int ballH = 20;
    int ballW = 20;
    LRESULT CALLBACK WindowProc(HWND hWnd,
    							UINT message,
    							WPARAM wParam,
    							LPARAM lParam);
    
    DWORD WINAPI DrawFrame(HANDLE handle);
    DWORD WINAPI GameEngine(HANDLE handle);
    DWORD WINAPI PaddleEngine(HANDLE handle);
    //Create PONG object
    	static PONG MyGame(winW, winH, ballH, ballW);
    //END Create
    //Frame regulator
    	int FramesPerSec = 100;
    //End Frame
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    	WNDCLASSEX wc;
    	ZeroMemory(&wc, sizeof(WNDCLASSEX));
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = (WNDPROC)WindowProc;
    	wc.hInstance = hInstance;
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    	wc.lpszClassName = "WindowPong";
    	RegisterClassEx(&wc);
        hWnd = CreateWindowEx(NULL,
                              "WindowPong",    // window class
                              "Window Pong",// title
                              WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,    // window style
                              300,    // x
                              300,    // y
                              winW,    // width
                              winH,    // height
                              NULL,   // parent
                              NULL,   // menu
                              hInstance,    //instance
                              NULL); //Just NULL
    	ShowWindow(hWnd, nCmdShow);
    	MSG msg;
    	HANDLE GDIThread = CreateThread(NULL,
    									NULL,
    							(LPTHREAD_START_ROUTINE)&DrawFrame,
    									NULL,
    									NULL,
    									NULL);
    	HANDLE GameCore = CreateThread(NULL,
    									NULL,
    							(LPTHREAD_START_ROUTINE)&GameEngine,
    									NULL,
    									NULL,
    									NULL);
    	/*HANDLE PaddleMovement = CreateThread(NULL,
    									NULL,
    							(LPTHREAD_START_ROUTINE)&PaddleEngine,
    									NULL,
    									NULL,
    									NULL);*/
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    DWORD WINAPI DrawFrame(HANDLE handle)
    {
    	GdiplusStartupInput gdiplusStartupInput; 
        ULONG_PTR           gdiplusToken;   
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    	HDC hDC = GetDC(hWnd);
    	HDC hDCbuf = CreateCompatibleDC(hDC);
    	HBITMAP hBMP = CreateCompatibleBitmap(hDCbuf, winW, winH);
    	SelectObject(hDCbuf, hBMP);
    
    	int DelayToSleep = 1000 / FramesPerSec;
    	Graphics hGraphics(hDC);
    	Graphics hBuffer(hDCbuf);
    	hGraphics.SetSmoothingMode(SmoothingModeHighQuality);
    //COLORS
    	const Color cblack(255, 0, 0, 0);
    	const Color cwhite(255, 255, 255, 255);
    	const Color cgreen(255, 0, 255, 0);
    	const Color cblue(255, 0, 0, 255);
    	const Color cred(255, 255, 0, 0);
    //COLORS_END
    //PENS
    	const Pen pblack(cblack, 1);
    	const Pen pwhite(cwhite, 1);
    	const Pen pgreen(cgreen, 1);
    	const Pen pblue(cblue, 1);
    	const Pen pred(cred, 1);
    //PENS_END
    //BRUSHES
    	const SolidBrush bblack(cblack);
    	const SolidBrush bwhite(cwhite);
    	const SolidBrush bgreen(cgreen);
    	const SolidBrush bblue(cblue);
    	const SolidBrush bred(cred);
    //BRUSHES_END
    	//hBuffer.TranslateTransform(0, 0);
    	while (true)
    	{
    		hBuffer.Clear(cblack); //Clear Complete In Black
    		//StartGDIPlusScene
    		//DrawPlayer1
    		//hBuffer.FillRectangle(&bred, RectF(0, 0, winW, winH));
    		hBuffer.FillRectangle(&bred, 
    									5, 
    									MyGame.GetLeft(), 
    									10, 
    									100);
    		//DrawPlayer2
    		hBuffer.FillRectangle(&bwhite, 
    									winW-20, 
    									MyGame.GetRight(), 
    									10, 
    									100);
    		//DrawBall
    		hBuffer.FillRectangle(&bwhite, MyGame.GetBallX(),
    									MyGame.GetBallY(),
    									ballW,
    									ballH);
    
    		//EndGDIPlusScene
    		//MyGame.SetBall(MyGame.GetBallX()+1, MyGame.GetBallY()+10);
    		BitBlt(hDC, 0, 0, winW, winH, hDCbuf, 
    											0, 
    											0,
    											SRCCOPY);//Draw Frame
    		Sleep(DelayToSleep); //Frame Rate
    	}
    	GdiplusShutdown(gdiplusToken);
    }
    DWORD WINAPI PaddleEngine()
    {
    		if(GetAsyncKeyState(VK_UP)) MyGame.AddRightP(-10);
    		if(GetAsyncKeyState(VK_DOWN)) MyGame.AddRightP(10);
    		if(GetAsyncKeyState(0x57)) MyGame.AddLeftP(-10);
    		if(GetAsyncKeyState(0x53)) MyGame.AddLeftP(10);
    		return 0;
    }
    DWORD WINAPI GameEngine(HANDLE handle)
    {
    	int t;
    	char buf[255];
    	while(true)
    	{
    
    		t = MyGame.MoveBall();
    		if (t == 1){
    			/*MessageBoxA(NULL, 
    						"Links hat gewonnen",
    						"Gewonnen",
    						NULL);*/
    			Sleep(1000);
    			MyGame.Reset();	
    			sprintf(buf, "left  %d : %d  right", MyGame.GetLeftPoints(), MyGame.GetRightPoints());
    			SetWindowTextA(hWnd, buf);
    		}
    		else if (t == 2){
    			/*MessageBoxA(NULL, 
    						"Rechts hat gewonnen",
    						"Gewonnen",
    						NULL);*/
    			Sleep(1000);
    			MyGame.Reset();
    			sprintf(buf, "left  %d : %d  right", MyGame.GetLeftPoints(), MyGame.GetRightPoints());
    			SetWindowTextA(hWnd, buf);
    		}
    		//MyGame.increaseB();
    		PaddleEngine();
    
    		Sleep(1000/FramesPerSec);
    	}
    }
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        // sort through and find what code to run for the message given
        switch(message)
        {
            // this message is read when the window is closed
            case WM_DESTROY:
                {
                    // close the application entirely
                    PostQuitMessage(0);
                    return 0;
                } break;
        }
    
        // Handle any messages the switch statement didn't
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
    

    Main.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LEFT_PLAYER  0x01
    #define RIGHT_PLAYER  0x02
    class PONG
    {
    	private:
    		int left[2]; //y_pos + points
    		float right[2]; //y_pos + points
    		int ball[4]; // x_pos + y_pos + speed_x + speed_y
    		int table[4]; //The game Table(w+h+bw+bh)
    	public:
    		PONG(int width, int height, int bwidth, int bheight)
    		{
    			//Init game table
    			table[0] = width;
    			table[1] = height;
    			table[2] = bwidth;
    			table[3] = bheight;
    			//Init player
    			left[0] = table[1]/2 - 50;
    			right[0] = table[1]/2 - 50;
    			//Init ball
    			srand(time(NULL));
    			ball[0] = table[0]/2-table[2]/2;
    			ball[1] = table[1]/2-table[3]/2;
    			ball[2] = (int)(rand() % 5) - 5;
    			ball[3] = (int)(rand() % 5) - 5;
    			if (ball[2] <= ball[3])
    			{
    				int temp = ball[2];
    				ball[2] = ball[3];
    				ball[3] = temp;
    			}
    		}
    		void SetLeft(int y) {left[0] = y;}
    		void SetRight(int y){right[0] = y;}
    		int GetLeft() {return left[0];}
    		int GetRight() {return right[0];}
    		void SetBall(int x, int y)
    		{
    			ball[0] = x;
    			ball[1] = y;
    		}
    		void Reset()
    		{
    			//Init player
    			left[0] = table[1]/2 - 50;
    			right[0] = table[1]/2 - 50;
    			//Init ball
    			srand(time(NULL));
    			ball[0] = table[0]/2-table[2]/2;
    			ball[1] = table[1]/2-table[3]/2;
    			ball[2] = (int)(rand() % 5) - 5;
    			ball[3] = (int)(rand() % 5) - 5;
    			if (ball[2] <= ball[3])
    			{
    				int temp = ball[2];
    				ball[2] = ball[3];
    				ball[3] = temp;
    			}
    		}
    
    		int MoveBall()
    		{
    			ball[0] += ball[2];
    			ball[1] += ball[3];
    			if (ball[0] <= 0 || ball[0]+table[2] >= (table[0]))
    				ball[2] = -ball[2];
    			if (ball[1] <= 0 || ball[1]+table[3]*2 >= (table[1]))
    				ball[3] = -ball[3];
    			if (ball[0] <= 15)
    				if(ball[1] >= left[0] && ball[1] <= left[0]+100){
    					this->invertbX();
    					return 0;
    				}
    			if (ball[0] <= 0)
    				if(!ball[1] >= left[0] || !ball[1] <= left[0]+100){
    					right[1] += 1;
    					return 2;
    				}
    			if (ball[0]+table[2] >= table[0]-20)
    				if(ball[1] >= right[0] && ball[1] <= right[0]+100){
    					this->invertbX();
    					return 0;
    				}
    			if (ball[0]+table[2] >= table[0])
    				if(!ball[1] >= right[0] || !ball[1] <= right[0]+100){
    					left[1] += 1;
    					return 1;
    				}
    		}
    		void increaseB(){
    			ball[2] *= 1.000001;
    			ball[2] *= 1.000001;
    		}
    		void invertbX()	{ball[2] = -ball[2];}
    		void AddLeftP(int x) {
    			if(left[0] >= 0 && left[0] <= table[1]-100){
    				left[0] += x;
    			}
    			if(left[0] <= 0)
    				left[0] = 0;
    			if(left[0] >= table[1]-120)
    				left[0] = table[1]-120;
    		}
    		void AddRightP(int x){
    			if(right[0] >= 0 && right[0] <= table[1]-100){
    				right[0] += x;
    			}
    			if(right[0] <= 0)
    				right[0] = 0;
    			if(right[0] >= table[1]-120)
    				right[0] = table[1]-120;
    
    		}
    		int GetBallX() {return ball[0];}
    		int GetBallY() {return ball[1];}
    		int GetLeftPoints() {return left[1];}
    		int GetRightPoints() {return right[1];}
    };
    

    Wär schön wenn ihr die Fehler findet und mir nennt, anstatt sie nur zu korrigieren, ich will wissen was ich falsch mache, denn aus Fehlern lernt man ja...
    MfG,
    Xyron


Anmelden zum Antworten