| | |
Bouncing Ball (Dev C++ GUI code)
Please support our C++ advertiser: Intel Parallel Studio Home
What "Hello World" is to the console, the "Bouncing Ball" is to the Graphical User Interface. Nothing fancy, the ball is created via a call to the API function ellipse() and then bounced within the confines of the windows form. For the DEV C++ crowd: Let me know if you find these snippets somewhat helpful in your learning process in the comments section at the end.
// BCX Bounce by Kevin Diggins adopted from Charles Petzold // BCX generated C code modified for the free Dev-C++ system // from http://www.bloodshed.net/ // or http://sourceforge.net/projects/dev-cpp/ // (actually Dev-C++ is the IDE for the GNU GCC/G++ compiler) // a Dev-C++ tested Windows Application by vegaseat 21nov2004 #include <windows.h> #define Show(Window) RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW); #define AppName "BouncingBall1" #define Caption "Bouncing 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(WHITE_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); Rectangle(hdcMem,-1,-1,cxTotal+1,cyTotal+1); hBrush = CreateHatchBrush(HS_DIAGCROSS,0); SelectObject(hdcMem,hBrush); SetBkColor(hdcMem,RGB(0,127,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; 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); }
0
•
•
•
•
Strange, I just did a cut and paste into Dev-C++ (V4.9.9.1) and it compiled fine! Make sure you are compiling with GCC/G++ and not mingw32 directly! Check Tools>Compiler Options>Programs. That's the setting with the newest install.
0
•
•
•
•
sorry, but it`s giving several link errors with bloodshed dev c++.one of the errors is
[Linker error] undefined reference to `GetStockObject@4'
[Linker error] undefined reference to `GetStockObject@4'
0
•
•
•
•
Looks like some hand holding is in order:
In DevCpp go FILE then NEW then Project, select Windows Application, give it a name (eg. Ball) click OK, the make a directory somewhere and save. DevCpp comes up with a template, delete that and cut and paste this code into the editor page. Then compile and run.
In DevCpp go FILE then NEW then Project, select Windows Application, give it a name (eg. Ball) click OK, the make a directory somewhere and save. DevCpp comes up with a template, delete that and cut and paste this code into the editor page. Then compile and run.
0
•
•
•
•
BCX is working well but seems to be complicating the code somewhat. a lot of the BCX code seems at first glance a bit unnessecary... an example came with DevC++ which is a bit shorter but uses a bitmap...
0
•
•
•
•
Loading a bitmap and its mask from a resource would be much simpler code, but then it is difficult to post such a thing here.
0
•
•
•
•
do you mean because of OS dependancy? you already said it is windows app so the dev-c++ posting shouldnt be a problem? If you mean because of the resource cant you paste each file in code tags with the filename at the top? 

Similar Threads
- bouncing ball project (C)
- Breakout Ball bouncing physics (Game Development)
- Bouncing ball Program (Java)
- RE:" THE BOUNCING BALL in C++" (C++)
- bouncing ball? (C#)
| Thread Tools | Search this Thread |
api array based binary c++ c/c++ calculator char char* class classes code coding compile console conversion count database delete deploy desktop developer directshow dll download dynamic dynamiccharacterarray email encryption error file forms fstream function functions game givemetehcodez google graph gui homeworkhelp iamthwee ifstream input int integer java lib linkedlist linker linux list loop looping loops map math matrix memory multiple news number numbertoword output parameter pointer problem program programming project python random read recursion recursive reference return rpg sorting string strings struct temperature template templates test text text-file tree unix url variable vector video visualstudio win32 windows winsock wordfrequency wxwidgets



