/* api-ex.cc-- illustrates some basic Win32 API programming concepts */ /* Has a menu and icon; draws a circle; responds to mouse input */ #include <windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam); int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; /* the window's "handle" */ MSG msg; /* a message structure */ WNDCLASS wndclass; /* window class structure */ wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (hInstance, TEXT("MYICON")); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = TEXT("MYMENU"); wndclass.lpszClassName = TEXT("MyClass"); /* register the window class */ if (!RegisterClass (&wndclass)) return 0; /* create the window */ hWnd = CreateWindow (TEXT("MyClass"),TEXT("Second Window App"), WS_OVERLAPPEDWINDOW, 100, 50, 400, 200, NULL, NULL, hInstance, NULL); ShowWindow (hWnd, nCmdShow); /* display the window */ UpdateWindow (hWnd); /* update window's client area */ while (GetMessage (&msg, NULL, 0, 0)) /* message loop */ { TranslateMessage (&msg); /* translate keyboard messages */ DispatchMessage (&msg); /* send message to WndProc() */ } return ((int)msg.wParam); } LRESULT CALLBACK WndProc (HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam) { HDC hDC; /* the device context handle */ HPEN hPen, hOldPen; /* some drawing objects */ HBRUSH hBrush, hOldBrush; int nXpos, nYpos; /* mouse position */ switch (wMessage) /* process Windows messages */ { case WM_COMMAND: switch (LOWORD(wParam)) /* menu item selected */ { case ID_CIRCLE: /* draw a blue-bordered magenta-crosshatched circle */ hDC = GetDC(hWnd); /* get a DC for painting */ hPen = CreatePen (PS_SOLID, 3, RGB (0,0,255)); /* blue pen */ hBrush = CreateHatchBrush (HS_DIAGCROSS, RGB (255,0,255)); hOldPen = (HPEN)SelectObject (hDC,hPen); /* select into DC & */ hOldBrush = (HBRUSH)SelectObject (hDC, hBrush); /* save old object */ Ellipse (hDC, 100, 30, 180, 110); /* draw circle */ SelectObject (hDC, hOldBrush); /* displace brush */ DeleteObject (hBrush); /* delete brush */ SelectObject (hDC, hOldPen); /* same for pen */ DeleteObject (hPen); ReleaseDC (hWnd, hDC); /* release the DC to end painting */ break; case ID_QUIT: DestroyWindow (hWnd); /* destroy window, */ break; /* terminating application */ } break; case WM_LBUTTONDOWN: /* left mouse button depressed */ nXpos = LOWORD (lParam); /* in window's client area. */ nYpos = HIWORD (lParam); /* draw an L at spot */ hDC = GetDC (hWnd); TextOut (hDC, nXpos, nYpos, (LPCWSTR)"L", 1); ReleaseDC (hWnd, hDC); break; case WM_DESTROY: /* stop application */ PostQuitMessage (0); break; default: /* default Windows message processing */ return DefWindowProc (hWnd, wMessage, wParam, lParam); } return (0); }