A short example of how to started with Windows programming in non-Visual Studio environments.
In this example, we use the MinGW (Minimalist GNU for Windows) compiler within the Code::Blocks integrated development environment.
MinGW can be obtained via the following link:
First select File > New > Project… and opt to create a new empty project:
And then name and create the project:
And then click Finish.
Create a new main.cpp file for the project and use the example code to exercise Windows functionality:
#include <windows.h> #include <set> #define WIN32_LEAN_AND_MEAN const unsigned radius = 3; int xPos = 0; int yPos = 0; typedef std::pair<int, int> coordinate; typedef std::set<coordinate>::const_iterator coord_iter; // Step 4: Process any message sent to the Window LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT paintStruct; HDC hDC; HBRUSH hOldBrush, hNewBrush; static std::set<coordinate> coords; switch( message ) { case WM_CREATE: return 0; break; case WM_CLOSE: PostQuitMessage(0); return 0; break; case WM_PAINT: // Paint the set of circles hDC = BeginPaint( hwnd, &paintStruct ); hNewBrush = CreateSolidBrush(RGB(255, 255, 0)); hOldBrush = (HBRUSH) SelectObject(hDC, hNewBrush); for ( coord_iter it = coords.begin(); it != coords.end(); ++it ) { const int x = (*it).first; const int y = (*it).second; Ellipse( hDC, x - radius, y + radius, x + radius, y - radius ); } SelectObject(hDC, hOldBrush); DeleteObject(hNewBrush); EndPaint(hwnd, &paintStruct); return 0; break; case WM_MOUSEMOVE: // Store the mouse cursor position at every movement xPos = LOWORD(lParam); yPos = HIWORD(lParam); break; case WM_LBUTTONDOWN: // Store unique set of mouse coordinates and redraw coords.insert( std::make_pair( xPos, yPos ) ); InvalidateRect(hwnd, NULL, TRUE); break; default: break; } return DefWindowProc( hwnd, message, wParam, lParam ); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX windowClass; // window class HWND hwnd; // window handle MSG msg; // message // Step 1: Create the Windows class, exit if unsuccessful windowClass.cbSize = sizeof( WNDCLASSEX ); windowClass.style = CS_HREDRAW | CS_VREDRAW; windowClass.lpfnWndProc = WndProc; windowClass.cbClsExtra = 0; windowClass.cbWndExtra = 0; windowClass.hInstance = hInstance; windowClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); windowClass.hCursor = LoadCursor( NULL, IDC_ARROW ); windowClass.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH ); windowClass.lpszMenuName = NULL; windowClass.lpszClassName = "MyClass"; windowClass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); // Step 2: Register the window, exit if unsuccessful if ( !RegisterClassEx(&windowClass) ) return 0; // Step 3: Create the window, exit if unsuccessful if ( !CreateWindowEx( NULL, // extended style "MyClass", // class name "My First Window", // app name WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU, // window style 50, // x coordinate 50, // y coordinate 250, // width 250, // height NULL, // handle to parent NULL, // handle to menu hInstance, // application instance NULL ) ) return 0; // no extra parameter's // Step 4: Enter the main message loop and event handling while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
Right-click the project folder and select Build Options.
Select the Search Directories tab, followed by the Compiler tab. Click Add to set the location of the MinGW include directory:
Then select the Linker tab and set the location of the MinGW libraries:
Now select the Linker Setting tab. Use this dialog set the names of the MinGW libraries we will want to use. For this simple example we will need to add the gdi32 library:
The should be the only steps necessary to enable this example to compile and run.
Now run it to generate our very first Windows example within Code::Blocks: