1 #include <windows.h>
2 #include <stdio.h>
3 
4 static UINT WindowCount;
5 LRESULT WINAPI MultiWndProc(HWND, UINT, WPARAM, LPARAM);
6 
7 int WINAPI
8 WinMain(HINSTANCE hInstance,
9 	HINSTANCE hPrevInstance,
10 	LPSTR lpszCmdLine,
11 	int nCmdShow)
12 {
13   WNDCLASS wc;
14   MSG msg;
15   HWND hWnd1;
16   HWND hWnd2;
17   HWND hWndChild;
18 
19   wc.lpszClassName = "MultiClass";
20   wc.lpfnWndProc = MultiWndProc;
21   wc.style = CS_VREDRAW | CS_HREDRAW;
22   wc.hInstance = hInstance;
23   wc.hIcon = LoadIcon(NULL, (LPCTSTR) IDI_APPLICATION);
24   wc.hCursor = LoadCursor(NULL, (LPCTSTR) IDC_ARROW);
25   wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
26   wc.lpszMenuName = NULL;
27   wc.cbClsExtra = 0;
28   wc.cbWndExtra = 0;
29   if (RegisterClass(&wc) == 0)
30     {
31       fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n",
32 	      GetLastError());
33       return(1);
34     }
35 
36   hWnd1 = CreateWindow("MultiClass",
37 		      "TopLevel1",
38 		      WS_OVERLAPPEDWINDOW,
39 		      0,
40 		      0,
41 		      320,
42 		      240,
43 		      NULL,
44 		      NULL,
45 		      hInstance,
46 		      NULL);
47 
48   hWndChild = CreateWindow("MultiClass",
49 		      "Child1 of TopLevel1",
50 		      WS_CHILD | WS_BORDER | WS_CAPTION | WS_VISIBLE | WS_SYSMENU,
51 		      20,
52 		      120,
53 		      200,
54 		      200,
55 		      hWnd1,
56 		      NULL,
57 		      hInstance,
58 		      NULL);
59 
60   hWnd2 = CreateWindow("MultiClass",
61 		      "TopLevel2",
62 		      WS_OVERLAPPEDWINDOW,
63 		      400,
64 		      0,
65 		      160,
66 		      490,
67 		      NULL,
68 		      NULL,
69 		      hInstance,
70 		      NULL);
71 
72   if (! hWnd1 || ! hWnd2 || ! hWndChild)
73     {
74       fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n",
75 	      GetLastError());
76       return(1);
77     }
78   WindowCount = 2;
79 
80   ShowWindow(hWnd1, SW_NORMAL);
81   ShowWindow(hWnd2, SW_NORMAL);
82 
83   while(GetMessage(&msg, NULL, 0, 0))
84   {
85     TranslateMessage(&msg);
86     DispatchMessage(&msg);
87   }
88   return msg.wParam;
89 }
90 
91 LRESULT CALLBACK MultiWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
92 {
93   PAINTSTRUCT ps;
94   HDC hDC;
95   LONG Style;
96   RECT Client;
97   HBRUSH Brush;
98   static COLORREF Colors[] =
99     {
100       RGB(0x00, 0x00, 0x00),
101       RGB(0x80, 0x00, 0x00),
102       RGB(0x00, 0x80, 0x00),
103       RGB(0x00, 0x00, 0x80),
104       RGB(0x80, 0x80, 0x00),
105       RGB(0x80, 0x00, 0x80),
106       RGB(0x00, 0x80, 0x80),
107       RGB(0x80, 0x80, 0x80),
108       RGB(0xff, 0x00, 0x00),
109       RGB(0x00, 0xff, 0x00),
110       RGB(0x00, 0x00, 0xff),
111       RGB(0xff, 0xff, 0x00),
112       RGB(0xff, 0x00, 0xff),
113       RGB(0x00, 0xff, 0xff),
114       RGB(0xff, 0xff, 0xff)
115     };
116   static unsigned CurrentColor = 0;
117 
118   switch(msg)
119     {
120       case WM_PAINT:
121 	hDC = BeginPaint(hWnd, &ps);
122 	GetClientRect(hWnd, &Client);
123 	Brush = CreateSolidBrush(Colors[CurrentColor]);
124 	FillRect(hDC, &Client, Brush);
125 	DeleteObject(Brush);
126 	CurrentColor++;
127 	if (sizeof(Colors) / sizeof(Colors[0]) <= CurrentColor)
128 	  {
129 	    CurrentColor = 0;
130 	  }
131 	EndPaint(hWnd, &ps);
132 	break;
133 
134       case WM_DESTROY:
135 	Style = GetWindowLong(hWnd, GWL_STYLE);
136 	if (0 == (Style & WS_CHILD) && 0 == --WindowCount)
137 	  {
138 	    PostQuitMessage(0);
139 	  }
140 	break;
141 
142       default:
143 	return DefWindowProc(hWnd, msg, wParam, lParam);
144     }
145 
146   return 0;
147 }
148