📄 demo5_5.c
字号:
1 /****************************************************************/
2 /* Demo5_5 --- Simple Paint V.2 */
3 /****************************************************************/
4
5 #include <windows.h>
6 #include <math.h>
7 #include "demo5_5.h"
8
9
10 int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);
11 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
12 long FAR PASCAL ChooseCtrlProc(HWND, unsigned, WORD, LONG);
13 long FAR PASCAL LineWSCtrlProc(HWND, unsigned, WORD, LONG);
14 BOOL FAR PASCAL PenDlgProc(HWND, unsigned, WORD, LONG);
15 BOOL FAR PASCAL BrushDlgProc(HWND, unsigned, WORD, LONG);
16
17 void DrawGraph(HDC, HMENU, BOOL);
18 void DrawPencil(HDC, HMENU);
19 void DrawLine(HDC, HMENU, BOOL);
20 void DrawRect(HDC, HMENU, BOOL);
21 void DrawEllip(HDC, HMENU, BOOL);
22 void DrawCircle(HDC, HMENU, BOOL);
23 void DrawRoundRect(HDC, HMENU, BOOL);
24
25 FARPROC lpPenDlgProc;
26 FARPROC lpBrushDlgProc;
27
28 HANDLE hInst;
29
30 int ToolID = IDM_PENCIL;
31
32 int nPenColor = 1;
33 int nPenStyle = PS_SOLID;
34 int nPenWidth = 1;
35
36 int nBrushColor = 1;
37 int nHatch = -1;
38
39 typedef struct tagCOLORSTRUCT {
40 int cR;
41 int cG;
42 int cB;
43 } COLORSTRUCT;
44
45 #define MKCOLOR(A) (RGB(A.cR, A.cG, A.cB))
46
47 extern COLORSTRUCT crDefColor[28];
48 extern COLORSTRUCT crPCurColor[28];
49 extern COLORSTRUCT crBCurColor[28];
50
51 POINT OrgPoint;
52 POINT PrePoint;
53 POINT CurPoint;
54
55 BOOL CanUndo = FALSE;
56 HBITMAP hBitmap;
57 HDC hMemDC;
58
59 /****************************************************************/
60 /* WinMain() */
61 /****************************************************************/
62
63 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
64 LPSTR lpszCmdLine, int nCmdShow)
65 {
66 WNDCLASS wclass;
67 MSG msg;
68 HWND hWnd;
69 char szName[] = "Demo5_5";
70
71 if (!hPrevInstance)
72 {
73 wclass.style = CS_HREDRAW | CS_VREDRAW;
74 wclass.lpfnWndProc = MainWndProc;
75 wclass.cbClsExtra = 0;
76 wclass.cbWndExtra = 0;
77 wclass.hInstance = hInstance;
78 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
79 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
80 wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
81 wclass.lpszMenuName = szName;
82 wclass.lpszClassName = szName;
83
84 if (!RegisterClass (&wclass))
85 return (FALSE);
86
87 wclass.style = CS_HREDRAW | CS_VREDRAW;
88 wclass.lpfnWndProc = ChooseCtrlProc;
89 wclass.cbClsExtra = 0;
90 wclass.cbWndExtra = 0;
91 wclass.hInstance = hInstance;
92 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
93 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
94 wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
95 wclass.lpszMenuName = NULL;
96 wclass.lpszClassName = "Choose";
97
98 if (!RegisterClass (&wclass))
99 return (FALSE);
100
101 wclass.style = CS_HREDRAW | CS_VREDRAW;
102 wclass.lpfnWndProc = LineWSCtrlProc;
103 wclass.cbClsExtra = 0;
104 wclass.cbWndExtra = 0;
105 wclass.hInstance = hInstance;
106 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
107 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
108 wclass.hbrBackground = COLOR_WINDOW + 1;
109 wclass.lpszMenuName = NULL;
110 wclass.lpszClassName = "LineWS";
111
112 if (!RegisterClass (&wclass))
113 return (FALSE);
114 }
115
116 hWnd = CreateWindow(
117 szName,
118 "Simple Paint V.2" ,
119 WS_OVERLAPPEDWINDOW,
120 CW_USEDEFAULT,
121 CW_USEDEFAULT,
122 CW_USEDEFAULT,
123 CW_USEDEFAULT,
124 NULL,
125 NULL,
126 hInstance,
127 NULL );
128
129 if (!hWnd)
130 return (FALSE);
131
132 ShowWindow(hWnd, nCmdShow);
133 UpdateWindow(hWnd);
134
135 while (GetMessage(&msg, NULL, NULL,NULL))
136 {
137 TranslateMessage(&msg);
138 DispatchMessage(&msg);
139 }
140 return (msg.wParam);
141 }
142
143
144 /****************************************************************/
145 /* MainWndProc() */
146 /****************************************************************/
147
148 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
149 WORD wParam, LONG lParam)
150 {
151 HDC hDC;
152 HMENU hMenu;
153 PAINTSTRUCT ps;
154 static BOOL bLBDown;
155 static int CX, CY;
156 static int MemX=800, MemY=600;
157
158 switch (message)
159 {
160 case WM_CREATE :
161 hMenu = GetMenu(hWnd);
162 CheckMenuItem(hMenu, IDM_PENCIL, MF_CHECKED);
163 EnableMenuItem(hMenu, IDM_UNDO, MF_GRAYED);
164
165 memcpy(crPCurColor, crDefColor,
166 sizeof(crDefColor));
167 memcpy(crBCurColor, crDefColor,
168 sizeof(crDefColor));
169
170 hDC = GetDC(hWnd);
171 hMemDC = CreateCompatibleDC(hDC);
172 hBitmap = CreateCompatibleBitmap(hDC,
173 MemX, MemY);
174 SelectObject(hMemDC, hBitmap);
175 PatBlt(hMemDC, 0, 0, 800, 600, WHITENESS);
176 ReleaseDC(hWnd, hDC);
177
178 hInst = ((LPCREATESTRUCT) lParam)->hInstance;
179 return (0);
180
181 case WM_COMMAND :
182 hMenu = GetMenu(hWnd);
183 switch (wParam)
184 {
185 case IDM_PENCIL :
186 case IDM_LINE :
187 case IDM_RECT_F :
188 case IDM_RECT :
189 case IDM_ELLIP_F :
190 case IDM_ELLIP :
191 case IDM_CIRCLE_F :
192 case IDM_CIRCLE :
193 case IDM_ROUNDRECT_F:
194 case IDM_ROUNDRECT :
195
196 if (ToolID == wParam)
197 return (0);
198
199 CheckMenuItem(hMenu, ToolID,
200 MF_UNCHECKED);
201 ToolID = wParam;
202 CheckMenuItem(hMenu, ToolID,
203 MF_CHECKED);
204
205 hDC = GetDC(hWnd);
206 BitBlt(hMemDC, 0, 0, CX, CY,
207 hDC, 0, 0, SRCCOPY);
208 ReleaseDC(hWnd, hDC);
209
210 hMenu = GetMenu(hWnd);
211 EnableMenuItem(hMenu, IDM_UNDO,
212 MF_GRAYED);
213 CanUndo = FALSE;
214
215 break;
216
217 case IDM_CHOOSEPEN :
218
219 lpPenDlgProc = MakeProcInstance(
220 (FARPROC) PenDlgProc, hInst);
221
222 DialogBox(hInst, "PENDLG", hWnd,
223 lpPenDlgProc);
224
225 FreeProcInstance(lpPenDlgProc);
226 break;
227
228 case IDM_CHOOSEBRUSH :
229
230 lpBrushDlgProc = MakeProcInstance(
231 (FARPROC) BrushDlgProc, hInst);
232
233 DialogBox(hInst, "BRUSHDLG", hWnd,
234 lpBrushDlgProc);
235
236 FreeProcInstance(lpBrushDlgProc);
237 break;
238
239 case IDM_UNDO :
240 InvalidateRect(hWnd, NULL, FALSE);
241 EnableMenuItem(hMenu, IDM_UNDO,
242 MF_GRAYED);
243 CanUndo = FALSE;
244 break;
245
246 case IDM_CLEAR :
247 PatBlt(hMemDC, 0, 0, MemX, MemY,
248 PATCOPY);
249 InvalidateRect(hWnd, NULL, TRUE);
250 break;
251
252 case IDM_QUIT :
253 DestroyWindow(hWnd);
254 break;
255 }
256 return (0);
257
258 case WM_LBUTTONDOWN :
259 SetCapture(hWnd);
260 bLBDown = TRUE;
261
262 OrgPoint = MAKEPOINT(lParam);
263 CurPoint = PrePoint = OrgPoint;
264
265 return (0);
266
267 case WM_LBUTTONUP :
268 bLBDown = FALSE;
269 ReleaseCapture();
270
271 hDC = GetDC(hWnd);
272 DrawGraph(hDC, GetMenu(hWnd), TRUE);
273 ReleaseDC(hWnd, hDC);
274
275 return (0);
276
277 case WM_MOUSEMOVE :
278 if (bLBDown)
279 {
280 PrePoint = CurPoint;
281 CurPoint = MAKEPOINT(lParam);
282
283 hDC = GetDC(hWnd);
284 DrawGraph(hDC, GetMenu(hWnd), FALSE);
285 ReleaseDC(hWnd, hDC);
286 }
287 return (0);
288
289 case WM_SIZE :
290 CX = LOWORD(lParam);
291 CY = HIWORD(lParam);
292 return (0);
293
294 case WM_PAINT :
295 hDC = BeginPaint(hWnd, &ps);
296
297 BitBlt(hDC,
298 ps.rcPaint.left, ps.rcPaint.top,
299 ps.rcPaint.right-ps.rcPaint.left,
300 ps.rcPaint.bottom-ps.rcPaint.top,
301 hMemDC,
302 ps.rcPaint.left, ps.rcPaint.top,
303 SRCCOPY);
304
305 EndPaint(hWnd, &ps);
306 return (0);
307
308 case WM_DESTROY :
309 DeleteDC(hMemDC);
310 DeleteObject(hBitmap);
311 PostQuitMessage(0);
312 return (0);
313
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -