This tutorial will start with a very simple application with a empty window, at the end we have created a complete drawing application.
First the base window, it does not do anything, but we will use it as base for other the applications.
First a function to create the window:
HWND CreateMainWindow() { WNDCLASS wc; memset(&wc, 0, sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; wc.lpfnWndProc = (WNDPROC )MainWndProc; wc.hInstance = InstanceHandle; wc.hbrBackground = (HBRUSH )(COLOR_WINDOW + 1); wc.lpszClassName = "SimpleWinWndClass"; wc.lpszMenuName = 0; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClass(&wc)) return 0; return CreateWindow("SimpleWinWndClass", "Simple-Window", WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_THICKFRAME, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, InstanceHandle, 0); }First we create the Windows class, the we create the window. We use CW_USEDEFAULT to create the window with the default size. "Simple-Window" is the title of the window, "SimpleWinWndClass" is the name of the Window-Class.
MainWndProc is the name of the WindowProc, the function which receives all messages for our window. It could look like this:
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return 0; }We let the default window proc handle most of the messages, we just makes sure that the applikation can be closed.
The WinMain must create the Window, and run the message-loop:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { InstanceHandle = hInstance; if((MainWindow = CreateMainWindow()) == (HWND )0) { MessageBox(0, "Failed to create MainWindow!", "Warning", MB_OK); return 0; } ShowWindow(MainWindow, SW_SHOW); MSG Msg; while(GetMessage(&Msg, 0, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }Now we just need two globale variables, and a include, and we are done:
#include <windows.h> HINSTANCE InstanceHandle; HWND MainWindow;The complete code for the application can be found here