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