📄 demo4_5.c
字号:
1 /****************************************************************/
2 /* Demo4_5 --- Simple Paint */
3 /****************************************************************/
4
5 #include <windows.h>
6 #include <math.h>
7 #include "demo4_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, BOOL);
18 void DrawPencil(HDC);
19 void DrawLine(HDC, BOOL);
20 void DrawRect(HDC, BOOL);
21 void DrawEllip(HDC, BOOL);
22 void DrawCircle(HDC, BOOL);
23 void DrawRoundRect(HDC, 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 /****************************************************************/
56 /* WinMain() */
57 /****************************************************************/
58
59 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
60 LPSTR lpszCmdLine, int nCmdShow)
61 {
62 WNDCLASS wclass;
63 MSG msg;
64 HWND hWnd;
65 char szName[] = "Demo4_5";
66
67 if (!hPrevInstance)
68 {
69 wclass.style = CS_HREDRAW | CS_VREDRAW;
70 wclass.lpfnWndProc = MainWndProc;
71 wclass.cbClsExtra = 0;
72 wclass.cbWndExtra = 0;
73 wclass.hInstance = hInstance;
74 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
75 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
76 wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
77 wclass.lpszMenuName = szName;
78 wclass.lpszClassName = szName;
79
80 if (!RegisterClass (&wclass))
81 return (FALSE);
82
83 wclass.style = CS_HREDRAW | CS_VREDRAW;
84 wclass.lpfnWndProc = ChooseCtrlProc;
85 wclass.cbClsExtra = 0;
86 wclass.cbWndExtra = 0;
87 wclass.hInstance = hInstance;
88 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
89 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
90 wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
91 wclass.lpszMenuName = NULL;
92 wclass.lpszClassName = "Choose";
93
94 if (!RegisterClass (&wclass))
95 return (FALSE);
96
97 wclass.style = CS_HREDRAW | CS_VREDRAW;
98 wclass.lpfnWndProc = LineWSCtrlProc;
99 wclass.cbClsExtra = 0;
100 wclass.cbWndExtra = 0;
101 wclass.hInstance = hInstance;
102 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
103 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
104 wclass.hbrBackground = COLOR_WINDOW + 1;
105 wclass.lpszMenuName = NULL;
106 wclass.lpszClassName = "LineWS";
107
108 if (!RegisterClass (&wclass))
109 return (FALSE);
110 }
111
112 hWnd = CreateWindow(
113 szName,
114 "Simple Paint" ,
115 WS_OVERLAPPEDWINDOW,
116 CW_USEDEFAULT,
117 CW_USEDEFAULT,
118 CW_USEDEFAULT,
119 CW_USEDEFAULT,
120 NULL,
121 NULL,
122 hInstance,
123 NULL );
124
125 if (!hWnd)
126 return (FALSE);
127
128 ShowWindow(hWnd, nCmdShow);
129 UpdateWindow(hWnd);
130
131 while (GetMessage(&msg, NULL, NULL,NULL))
132 {
133 TranslateMessage(&msg);
134 DispatchMessage(&msg);
135 }
136 return (msg.wParam);
137 }
138
139
140
141 /****************************************************************/
142 /* MainWndProc() */
143 /****************************************************************/
144
145 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
146 WORD wParam, LONG lParam)
147 {
148 HDC hDC;
149 HMENU hMenu;
150 static BOOL bLBDown;
151
152 switch (message)
153 {
154 case WM_CREATE :
155 hMenu = GetMenu(hWnd);
156 CheckMenuItem(hMenu, IDM_PENCIL, MF_CHECKED);
157
158 memcpy(crPCurColor, crDefColor,
159 sizeof(crDefColor));
160 memcpy(crBCurColor, crDefColor,
161 sizeof(crDefColor));
162
163 hInst = ((LPCREATESTRUCT) lParam)->hInstance;
164 return (0);
165
166 case WM_COMMAND :
167 hMenu = GetMenu(hWnd);
168 switch (wParam)
169 {
170 case IDM_PENCIL :
171 case IDM_LINE :
172 case IDM_RECT_F :
173 case IDM_RECT :
174 case IDM_ELLIP_F :
175 case IDM_ELLIP :
176 case IDM_CIRCLE_F :
177 case IDM_CIRCLE :
178 case IDM_ROUNDRECT_F:
179 case IDM_ROUNDRECT :
180
181 if (ToolID == wParam)
182 return (0);
183
184 CheckMenuItem(hMenu, ToolID,
185 MF_UNCHECKED);
186 ToolID = wParam;
187 CheckMenuItem(hMenu, ToolID,
188 MF_CHECKED);
189 break;
190
191 case IDM_CHOOSEPEN :
192
193 lpPenDlgProc = MakeProcInstance(
194 (FARPROC) PenDlgProc, hInst);
195
196 DialogBox(hInst, "PENDLG", hWnd,
197 lpPenDlgProc);
198
199 FreeProcInstance(lpPenDlgProc);
200 break;
201
202 case IDM_CHOOSEBRUSH :
203
204 lpBrushDlgProc = MakeProcInstance(
205 (FARPROC) BrushDlgProc, hInst);
206
207 DialogBox(hInst, "BRUSHDLG", hWnd,
208 lpBrushDlgProc);
209
210 FreeProcInstance(lpBrushDlgProc);
211 break;
212
213 case IDM_CLEAR :
214 InvalidateRect(hWnd, NULL, TRUE);
215 break;
216
217 case IDM_QUIT :
218 DestroyWindow(hWnd);
219 break;
220 }
221 return (0);
222
223 case WM_LBUTTONDOWN :
224 SetCapture(hWnd);
225 bLBDown = TRUE;
226
227 OrgPoint = MAKEPOINT(lParam);
228 CurPoint = PrePoint = OrgPoint;
229
230 return (0);
231
232 case WM_LBUTTONUP :
233 bLBDown = FALSE;
234 ReleaseCapture();
235
236 hDC = GetDC(hWnd);
237 DrawGraph(hDC, TRUE);
238 ReleaseDC(hWnd, hDC);
239
240 return (0);
241
242 case WM_MOUSEMOVE :
243 if (bLBDown)
244 {
245 PrePoint = CurPoint;
246 CurPoint = MAKEPOINT(lParam);
247
248 hDC = GetDC(hWnd);
249 DrawGraph(hDC, FALSE);
250 ReleaseDC(hWnd, hDC);
251 }
252 return (0);
253
254 case WM_DESTROY :
255 PostQuitMessage(0);
256 return (0);
257
258 default :
259 return(DefWindowProc(hWnd, message, wParam, lParam));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -