Windows API Hello World Example in C

This code listing uses many symbols defined in windows.h. Most of these symbols map to the long or int data types so don't be too confused by them. HINSTANCE is just a void *. The important parts of this code are the RegisterClassEx() and the message loop at GetMessage() which basically sits in a loop waiting for input from the user be it mouse movement, mouse clicking, key pressing or other event. Once an event occurs it is dispatched to the Window Procedure WndProc() which the system knows to use because it was passed as a parameter in RegisterClassEx(). Because of this, Windows API programming is very C friendly, not C++ friendly. There is no way to assign a class function to the wndclass.lpfnWndProc function pointer (due to the this pointer being passed on the stack as a hidden function parameter), but there is a way to assign a pointer to an object to each window.

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	 static TCHAR szAppName[] = _T("HelloWin");
	 HWND hwnd;
	 MSG msg;
	 WNDCLASSEX wndclass;

	 wndclass.cbSize = sizeof (wndclass);
	 wndclass.style = CS_HREDRAW | CS_VREDRAW;
	 wndclass.lpfnWndProc = WndProc;
	 wndclass.cbClsExtra = 0;
	 wndclass.cbWndExtra = 0;
	 wndclass.hInstance = hInstance;
	 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
	 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
	 wndclass.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
	 wndclass.lpszMenuName = NULL;
	 wndclass.lpszClassName = szAppName;
	 wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

	 RegisterClassEx (&wndclass);

	 hwnd = CreateWindow (szAppName,		 // window class name
					_T("Hello World"),		 // window caption
					WS_OVERLAPPEDWINDOW,	 // window style
					CW_USEDEFAULT,			 // initial x position
					CW_USEDEFAULT,			 // initial y position
					CW_USEDEFAULT,			 // initial x size
					CW_USEDEFAULT,			 // initial y size
					NULL,					// parent window handle
					NULL,					// window menu handle
					hInstance,				 // program instance handle
					NULL);					 // creation parameters

	ShowWindow (hwnd, iCmdShow);
	UpdateWindow (hwnd);

	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage (&msg);
		DispatchMessage (&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	 HDC hdc;
	 PAINTSTRUCT ps;
	 RECT rect;

	 switch (iMsg)
			{
			case WM_PAINT :
				 hdc = BeginPaint (hwnd, &ps);

				 GetClientRect (hwnd, &rect);
				 SetBkMode(hdc, TRANSPARENT);

				 DrawText (hdc, _T("Hello World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
				 EndPaint (hwnd, &ps);
				 return 0;

			case WM_DESTROY :
				 PostQuitMessage (0);
				 return 0;
			}

	 return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
Windows API Hello World!