1 
2 #include <windows.h>
3 #include <stdio.h>
4 
5 #include <tchar.h>
6 
7 LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
8 
9 const TCHAR* CLASS_NAME = _T("LineTestClass");
10 
11 int WINAPI
12 WinMain(HINSTANCE hInstance,
13 	HINSTANCE hPrevInstance,
14 	LPSTR lpszCmdLine,
15 	int nCmdShow)
16 {
17   WNDCLASS wc;
18   MSG msg;
19   HWND hWnd;
20 
21   wc.lpszClassName = CLASS_NAME;
22   wc.lpfnWndProc = MainWndProc;
23   wc.style = CS_VREDRAW | CS_HREDRAW;
24   wc.hInstance = hInstance;
25   wc.hIcon = LoadIcon(NULL, (LPCSTR)IDI_APPLICATION);
26   wc.hCursor = LoadCursor(NULL, (LPCSTR)IDC_ARROW);
27   wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
28   wc.lpszMenuName = NULL;
29   wc.cbClsExtra = 0;
30   wc.cbWndExtra = 0;
31   if (RegisterClass(&wc) == 0)
32     {
33       fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n",
34 	      GetLastError());
35       return(1);
36     }
37 
38   hWnd = CreateWindow(CLASS_NAME,
39 		      _T("Line drawing test"),
40 		      WS_OVERLAPPEDWINDOW,
41 		      0,
42 		      0,
43 		      CW_USEDEFAULT,
44 		      CW_USEDEFAULT,
45 		      NULL,
46 		      NULL,
47 		      hInstance,
48 		      NULL);
49   if (hWnd == NULL)
50     {
51       fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n",
52 	      GetLastError());
53       return(1);
54     }
55 
56   ShowWindow(hWnd, nCmdShow);
57 
58   while(GetMessage(&msg, NULL, 0, 0))
59   {
60     TranslateMessage(&msg);
61     DispatchMessage(&msg);
62   }
63 
64   return msg.wParam;
65 }
66 
67 #define red RGB(255,0,0)
68 #define grn RGB(0,255,0)
69 #define blu RGB(0,0,255)
70 #define blk RGB(0,0,0)
71 
72 static void
73 DrawLines(HDC hDC)
74 {
75   static struct
76     {
77     int fromx;
78     int fromy;
79     int tox;
80     int toy;
81     COLORREF clr;
82     }
83   points[ ] =
84     {
85       { 10, 10, 19, 10, red },
86       { 20, 10, 20, 19, grn },
87       { 20, 20, 11, 20, blu },
88       { 10, 20, 10, 11, blk },
89       { 12, 12, 15, 15, red },
90       { 18, 12, 15, 15, grn },
91       { 18, 18, 15, 15, blu },
92       { 12, 18, 15, 15, blk },
93 
94       { 35, 10, 39, 14, red },
95       { 40, 15, 36, 19, grn },
96       { 35, 20, 31, 16, blu },
97       { 30, 15, 34, 11, blk },
98 
99       { 2, 1, 5, 2, red },
100       { 6, 2, 5, 5, grn },
101       { 5, 6, 2, 5, blu },
102       { 1, 5, 2, 2, blk },
103 
104 	  { 50,  1, 51,  1, red },
105 	  { 50,  2, 52,  2, grn },
106 	  { 50,  3, 53,  3, blu },
107 	  { 50,  4, 54,  4, blk },
108 	  { 50,  5, 55,  5, red },
109 	  { 50,  6, 56,  6, grn },
110 	  { 50,  7, 57,  7, blu },
111 	  { 50,  8, 58,  8, blk },
112 	  { 50,  9, 59,  9, red },
113 	  { 50, 10, 60, 10, grn },
114 	  { 50, 11, 61, 11, blu },
115 	  { 50, 12, 62, 12, blk },
116 
117 	  { 50, 14, 62, 14, red },
118 	  { 51, 15, 62, 15, grn },
119 	  { 52, 16, 62, 16, blu },
120 	  { 53, 17, 62, 17, blk },
121 	  { 54, 18, 62, 18, red },
122 	  { 55, 19, 62, 19, grn },
123 	  { 56, 20, 62, 20, blu },
124 	  { 57, 21, 62, 21, blk },
125 	  { 58, 22, 62, 22, red },
126 	  { 59, 23, 62, 23, grn },
127 	  { 60, 24, 62, 24, blu },
128 	  { 61, 25, 62, 25, blk },
129 	};
130   int i;
131 
132   for (i = 0; i < sizeof(points) / sizeof(points[0]); i++)
133     {
134       HPEN hpen, hpenold;
135       hpen = CreatePen ( PS_SOLID, 0, points[i].clr );
136       hpenold = (HPEN)SelectObject ( hDC, hpen );
137       MoveToEx ( hDC, points[i].fromx, points[i].fromy, NULL );
138       LineTo ( hDC, points[i].tox, points[i].toy );
139       SelectObject ( hDC, hpenold );
140       DeleteObject ( hpen );
141     }
142 }
143 
144 LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
145 {
146   PAINTSTRUCT ps;
147   HDC hDC;
148   RECT clr;
149   HBRUSH hbr;
150 
151   switch(msg)
152   {
153   case WM_PAINT:
154     GetClientRect(hWnd, &clr);
155     //ClipRgn = CreateRectRgnIndirect(&clr);
156     hDC = BeginPaint(hWnd, &ps);
157     //Rect.left = 100;
158     //Rect.top = 100;
159     //Rect.right = 250;
160     //Rect.bottom = 150;
161     //FillRect(hDC, &Rect, CreateSolidBrush(RGB(0xFF, 0x00, 0x00)));
162     //ExcludeRgn = CreateRectRgnIndirect(&Rect);
163     //CombineRgn(ClipRgn, ClipRgn, ExcludeRgn, RGN_DIFF);
164     //DeleteObject(ExcludeRgn);
165     //Rect.left = 150;
166     //Rect.top = 150;
167     //Rect.right = 200;
168     //Rect.bottom = 250;
169     hbr = CreateSolidBrush(RGB(255, 255, 255));
170     FillRect ( hDC, &clr, hbr );
171     DeleteObject ( hbr );
172     DrawLines(hDC);
173     EndPaint(hWnd, &ps);
174     break;
175 
176   case WM_DESTROY:
177     PostQuitMessage(0);
178     break;
179 
180   default:
181     return DefWindowProc(hWnd, msg, wParam, lParam);
182   }
183   return 0;
184 }
185