I am new c++ programmer.

I 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!

Recommended Answers

All 7 Replies

Please post the code of what you've already come up with.

#include<windows.h>
#include<iostream.h>

#define Show(Window) RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW); 

#define AppName "BouncingBall1"
#define Caption "Likezo's 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;

//Handle the form 
static HANDLE  Form1;
double  MIN (double,double);
double  MAX (double,double);

//main of win32 Applications
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,175*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  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)/16;
		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);

		//Draws the rectangle
		Rectangle(hdcMem,-1,-1,cxTotal+1,cyTotal+1);
		hBrush = CreateSolidBrush(RGB(255,255,0));
		SelectObject(hdcMem,hBrush);

		//sets background for the ball
		//SetBkColor(hdcMem,RGB(255,255,0));
		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;
		//yCenter += cyMove;
		if (xCenter+cxRadius>=cxClient||xCenter-cxRadius<=0)
		{
			cxMove = -cxMove;
		}
		//if (yCenter+cyRadius >= cyClient || yCenter-cyRadius <= 0)
		//{ 
		//	cyMove = -cyMove;
		//}
		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);
}

Please post the code of what you've already come up with.

here is the code

#include<windows.h>
#include<iostream.h>

#define Show(Window) RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW); 

#define AppName "BouncingBall1"
#define Caption "Likezo's 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;

//Handle the form 
static HANDLE  Form1;
double  MIN (double,double);
double  MAX (double,double);

//main of win32 Applications
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,175*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  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)/16;
		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);

		//Draws the rectangle
		Rectangle(hdcMem,-1,-1,cxTotal+1,cyTotal+1);
		hBrush = CreateSolidBrush(RGB(255,255,0));
		SelectObject(hdcMem,hBrush);

		//sets background for the ball
		//SetBkColor(hdcMem,RGB(255,255,0));
		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;
		//yCenter += cyMove;
		if (xCenter+cxRadius>=cxClient||xCenter-cxRadius<=0)
		{
			cxMove = -cxMove;
		}
		//if (yCenter+cyRadius >= cyClient || yCenter-cyRadius <= 0)
		//{ 
		//	cyMove = -cyMove;
		//}
		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);
}

>>Please help the new programmer

Well, if you are really new then you need to start at the beginning, not with some really difficult program. Read the Read Me threads at the top of this board and you will get lots of help and places to look.

I am new to c++, and even that seems ridiculous for a new program...

If you are new to c++ you need to start with hello world

Win32 programming is extremely complicated, you need to understand the basics of c++ before you try anything with Win32
And using graphics also just makes everything more complicated

For learning purposes, you should at least start with the console

commented: Agreed - keep it simple to start with. +11

If you are new to c++ you need to start with hello world

Win32 programming is extremely complicated, you need to understand the basics of c++ before you try anything with Win32
And using graphics also just makes everything more complicated

For learning purposes, you should at least start with the console

I have done much o console applications but not windows applications so no wonder i was asking for help

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.