RE:" THE BOUNCING BALL in C++"

Discussion in 'C++' started by lucamarcus, Oct 21, 2007.

  1. lucamarcus

    lucamarcus New Member

    Joined:
    Oct 21, 2007
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    Having looked at the code for the "bouncing ball" which was said to be "hello world" of Win 32.

    I have been trying to do the following:

    1. Make the this ball move in a predefined rectangle (one ALREADY drawn) even before the ball starts moving

    2. I also would like to make this ball to change color temporarily as it hits either ends of the rectangle for a few seconds and then change back to the original color. As it hits the other end of the rectangle again the ball should change color temporarily and then back again to the original color and keep doing this.

    Please help the new programmer.

    Thank you!

    Below is what i have done so far



    Code:
    #include<windows.h>
    
    #define Show(Window) RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW); 
    
    #define AppName "Moving Ball"
    #define Caption "Moving Ball ..."
    
    char BCX_STR [1024*1024];
    
    static int     BCX_GetDiaUnit;
    static int     BCX_cxBaseUnit;
    static int     BCX_cyBaseUnit;
    static int     BCX_ScaleX;
    static int     BCX_ScaleY;
    static		   HANDLE  Form1;
    double		   MIN (double,double);
    double		   MAX (double,double);
    
    int     WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int);
    void    FormLoad (HANDLE);LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 
    double MAX (double a, double b)
    {  
    	if (a > b)  
    		{   
    			return a;
    		  } 
    			return b;
    }
    
    double MIN (double a, double b)
    {  
    	if (a < b)
    	{
    		return a;
    	
    	  }  
    	
    		return b;
    } 
    
    // standard main for Windows GUI
    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR CmdLine, int CmdShow)
    {  
    	static  WNDCLASS  Wc; 
    	memset(&Wc,0,sizeof(Wc)); 
    	static  MSG  Msg; 
    	memset(&Msg,0,sizeof(Msg));
    	Wc.style=CS_HREDRAW | CS_VREDRAW;
    	Wc.lpfnWndProc=WndProc; 
    	Wc.cbClsExtra=0; 
    	Wc.cbWndExtra=0;  
    	Wc.hInstance=hInst; 
    	Wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);
    	Wc.hCursor=LoadCursor(NULL,IDC_ARROW); 
    	Wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); 
    	Wc.lpszMenuName=NULL; 
    	Wc.lpszClassName=AppName; 
    	RegisterClass(&Wc); 
    	FormLoad(hInst);
    	// 50ms here, lower value gives higher speed
    	SetTimer((HWND)Form1,1,50,NULL);  
    	// ye olde event message loop
    while(GetMessage(&Msg,NULL,0,0)) 
     {
        if (!IsWindow((HWND)Form1)||!IsDialogMessage((HWND)Form1,&Msg))
    		{
    			TranslateMessage(&Msg);
    			DispatchMessage(&Msg);
    	    } 
     }  return Msg.wParam;
    }
    
     // create the form and show it (somewhat older style)
    
    void FormLoad (HANDLE hInst)
    {
    	// get the scale factors  
    	BCX_GetDiaUnit = GetDialogBaseUnits();
    	BCX_cxBaseUnit = LOWORD(BCX_GetDiaUnit);
    	BCX_cyBaseUnit = HIWORD(BCX_GetDiaUnit);
    	BCX_ScaleX = BCX_cxBaseUnit/4;
    	BCX_ScaleY = BCX_cyBaseUnit/8;
    	// now the form
    	Form1=CreateWindow(AppName,Caption,
    		DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU,
    	10*BCX_ScaleX,20*BCX_ScaleY,250*BCX_ScaleX,180*BCX_ScaleY,NULL,
    		(HMENU)NULL,(HINSTANCE)hInst,NULL);  Show((HWND)Form1);
    }
    
    // event message handler
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	static  HANDLE  hBitmap;
    	static  HBRUSH  hBrush;
    	static  HBRUSH  rBrush;
    	static  HDC  hdc; 
    	static  HDC  hdcMem; 
    	static int cxClient; 
    	static int cyClient;
    	static int xCenter;
    	static int yCenter;
    	static int cxTotal;
    	static int cyTotal; 
    	static int cxRadius;  
    	static int cyRadius;  
    	static int cxMove;
    	static int cyMove;
    	static int xPixel;
    	static int yPixel;
    	static int nScale;
    	
    while(1) 
     {
        if (Msg == WM_CREATE)
        {      
    		hdc = GetDC(hWnd);
    		xPixel = GetDeviceCaps(hdc,ASPECTX);
    		yPixel = GetDeviceCaps(hdc,ASPECTY);
    		ReleaseDC(hWnd,hdc);
    		return 0;
    		break;
        }
        // draw the ball
        if (Msg == WM_SIZE)
        {
    		xCenter = (cxClient=LOWORD(lParam))/2;
    		yCenter = (cyClient=HIWORD(lParam))/2;
    		nScale = (int)MIN(cxClient*xPixel,cyClient*yPixel)/8;
    		cxRadius = nScale/xPixel;
    		cyRadius = nScale/yPixel;
    		cxMove = (int)MAX(1,cxRadius/4);
    		cyMove = (int)MAX(1,cyRadius/4);
    		cxTotal = 2*(cxRadius+cxMove);
    		cyTotal = 2*(cyRadius+cyMove);
    	
    		if (hBitmap)
    		{
    			DeleteObject(hBitmap); 
    		}
    		hdc = GetDC(hWnd);
    		hdcMem = CreateCompatibleDC(hdc);
    		hBitmap = CreateCompatibleBitmap(hdc,cxTotal,cyTotal);
    		ReleaseDC(hWnd,hdc);
    		SelectObject(hdcMem,hBitmap);
    
    		rBrush = CreateSolidBrush(RGB(95,158,160));
    		SelectObject(hdcMem,rBrush);
    
    
    		Rectangle (hdcMem, -100, -100, 250, 250);
    		DeleteObject(rBrush);
    		
    		hBrush = CreateSolidBrush(RGB(255, 255, 0));
    		SelectObject(hdcMem,hBrush);
    		SetBkColor(hdcMem,RGB(255,255,255));
    		Ellipse(hdcMem,cxMove,cyMove,cxTotal-cxMove,cyTotal-cyMove);
    		DeleteDC(hdcMem);
    		DeleteObject(hBrush);
    		return 0;
    		break;
        }
        // move the ball
        if (Msg == WM_TIMER)
        {
    		if (!hBitmap)
    		{
    			break;
    		}
    		hdc = GetDC(hWnd);
    		hdcMem = CreateCompatibleDC(hdc);
    		SelectObject(hdcMem,hBitmap);
    		BitBlt(hdc,xCenter-cxTotal/2,yCenter-cyTotal/2,cxTotal,cyTotal,hdcMem,0,0,SRCCOPY);
    		ReleaseDC(hWnd,hdc);
    		DeleteDC(hdcMem);
    		xCenter += cxMove;
    	
    		if (xCenter+cxRadius>=cxClient||xCenter-cxRadius<=0)
    		{
    			cxMove = -cxMove;
    		}
    		
    		return 0;
    		break;
        }
      // clean up and exit program
    
    if (Msg == WM_DESTROY)
        {
    	if (hBitmap)
    	{
            DeleteObject(hBitmap);
          }
    	KillTimer((HWND)Form1,1);
    	PostQuitMessage(0);
    	return 0;
        }
        break;
      }
      return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice