📄 paint_fn.c
字号:
1 #include "paint.h"
2 #include <windows.h>
3
4 int FAR PASCAL EnumFaces(LPLOGFONT, LPTEXTMETRIC,
5 short, LPSTR);
6 int FAR PASCAL EnumSizes(LPLOGFONT, LPTEXTMETRIC,
7 short, LPSTR);
8 void MakeFontMenu(HWND);
9 void MakeSizeMenu(HWND);
10 void FillStrokeSize();
11 void ChangeFont(HWND);
12
13 struct {
14 int FaceNum;
15 char FaceName[MAXFACES][LF_FACESIZE];
16 BOOL bRaster[MAXFACES];
17 } FontFace;
18
19 struct {
20 int SizeNum;
21 LOGFONT lf[MAXSIZES];
22 TEXTMETRIC tm[MAXSIZES];
23 } FontSize;
24
25 extern HANDLE hInst;
26
27 extern HDC hMemDC;
28 extern int OX, OY;
29 extern int CX, CY;
30
31 extern int nLogPixSx;
32 extern int nLogPixSy;
33
34 extern BOOL CanUndo;
35
36 int FaceID;
37 int SizeID;
38 BOOL bBold, bItalic;
39 BOOL bUnderLine, bStrikeOut;
40 BOOL bNormal;
41
42 HBITMAP hBoldBM, hItalicBM;
43 HBITMAP hUnderlineBM, hStrikeOutBM;
44
45 HFONT hCurFont;
46 BOOL bFontExist = FALSE;
47
48 BOOL bTextWorking = FALSE;
49 int CharX, CharY;
50 int CharPosX, CharPosY;
51 BOOL bCaret = FALSE;
52
53 char Buffer[160];
54 POINT Start;
55 int nChar;
56
57 TEXTMETRIC CurTM;
58
59 void ChooseFontMenu(HWND hWnd, WORD wParam)
60 {
61 HMENU hMenu;
62
63 hMenu = GetMenu(hWnd);
64
65 if (wParam>=IDM_FONT && wParam<IDM_FONT+MAXFACES)
66 {
67 if (wParam != FaceID)
68 {
69 CheckMenuItem(hMenu, FaceID, MF_UNCHECKED);
70 FaceID = wParam;
71 CheckMenuItem(hMenu, FaceID, MF_CHECKED);
72
73 MakeSizeMenu(hWnd);
74 }
75 return;
76 }
77 else
78 if (wParam>=IDM_SIZE && wParam<IDM_SIZE+MAXSIZES)
79 {
80 if (wParam != SizeID)
81 {
82 CheckMenuItem(hMenu, SizeID, MF_UNCHECKED);
83 SizeID = wParam;
84 CheckMenuItem(hMenu, SizeID, MF_CHECKED);
85 }
86 }
87 else
88 switch (wParam)
89 {
90 case IDM_BOLD :
91 if (bNormal)
92 {
93 bNormal = FALSE;
94 CheckMenuItem(hMenu, IDM_NORM,
95 MF_UNCHECKED);
96 }
97 if (bBold)
98 CheckMenuItem(hMenu, wParam,
99 MF_UNCHECKED);
100 else
101 CheckMenuItem(hMenu, wParam,
102 MF_CHECKED);
103
104 bBold = ! bBold;
105 break;
106
107 case IDM_ITALIC :
108 if (bNormal)
109 {
110 bNormal = FALSE;
111 CheckMenuItem(hMenu, IDM_NORM,
112 MF_UNCHECKED);
113 }
114 if (bItalic)
115 CheckMenuItem(hMenu, wParam,
116 MF_UNCHECKED);
117 else
118 CheckMenuItem(hMenu, wParam,
119 MF_CHECKED);
120
121 bItalic = ! bItalic;
122 break;
123
124 case IDM_UNDERLINE :
125 if (bNormal)
126 {
127 bNormal = FALSE;
128 CheckMenuItem(hMenu, IDM_NORM,
129 MF_UNCHECKED);
130 }
131 if (bUnderLine)
132 CheckMenuItem(hMenu, wParam,
133 MF_UNCHECKED);
134 else
135 CheckMenuItem(hMenu, wParam,
136 MF_CHECKED);
137
138 bUnderLine = ! bUnderLine;
139 break;
140
141 case IDM_STRIKEOUT :
142 if (bNormal)
143 {
144 bNormal = FALSE;
145 CheckMenuItem(hMenu, IDM_NORM,
146 MF_UNCHECKED);
147 }
148 if (bStrikeOut)
149 CheckMenuItem(hMenu, wParam,
150 MF_UNCHECKED);
151 else
152 CheckMenuItem(hMenu, wParam,
153 MF_CHECKED);
154
155 bStrikeOut = ! bStrikeOut;
156 break;
157
158 case IDM_NORM :
159 if (bNormal)
160 break;
161
162 bNormal = TRUE;
163 CheckMenuItem(hMenu, IDM_NORM,
164 MF_CHECKED);
165
166 bBold = bItalic = FALSE;
167 bUnderLine = bStrikeOut = FALSE;
168 CheckMenuItem(hMenu, IDM_BOLD,
169 MF_UNCHECKED);
170 CheckMenuItem(hMenu, IDM_ITALIC,
171 MF_UNCHECKED);
172 CheckMenuItem(hMenu, IDM_UNDERLINE,
173 MF_UNCHECKED);
174 CheckMenuItem(hMenu, IDM_STRIKEOUT,
175 MF_UNCHECKED);
176
177 break;
178 }
179
180 if (bTextWorking)
181 ChangeFont(hWnd);
182 }
183
184
185
186 int FAR PASCAL EnumFaces(LPLOGFONT lpLF, LPTEXTMETRIC lpTM,
187 short nType, LPSTR lpData)
188 {
189 lstrcpy(FontFace.FaceName[FontFace.FaceNum],
190 lpLF->lfFaceName);
191 FontFace.bRaster[FontFace.FaceNum] = nType & 1;
192
193 FontFace.FaceNum++;
194
195 if (FontFace.FaceNum >= MAXFACES)
196 return (0);
197 return (1);
198 }
199
200
201 int FAR PASCAL EnumSizes(LPLOGFONT lpLF, LPTEXTMETRIC lpTM,
202 short nType, LPSTR lpData)
203 {
204 if (nLogPixSx != lpTM->tmDigitizedAspectX ||
205 nLogPixSy != lpTM->tmDigitizedAspectY)
206 return (1);
207
208 FontSize.lf[FontSize.SizeNum] = *lpLF;
209 FontSize.tm[FontSize.SizeNum] = *lpTM;
210
211 FontSize.SizeNum++;
212
213 if (FontSize.SizeNum >= MAXSIZES)
214 return (0);
215 return (1);
216 }
217
218
219 void MakeFontMenu(HWND hWnd)
220 {
221 int i;
222 HDC hDC;
223 HMENU hMenu, hPopMenu;
224 FARPROC lpEnumFaces;
225
226 FontFace.FaceNum = 0;
227 lpEnumFaces = MakeProcInstance(EnumFaces, hInst);
228
229 hDC = GetDC(hWnd);
230 EnumFonts(hDC, NULL, lpEnumFaces, NULL);
231 ReleaseDC(hWnd, hDC);
232
233 hMenu = GetMenu(hWnd);
234 hPopMenu = GetSubMenu(hMenu, FONTMENU);
235
236 DeleteMenu(hPopMenu, 0, MF_BYPOSITION);
237
238 for (i=0; i<FontFace.FaceNum; i++)
239 AppendMenu(hPopMenu, 0, IDM_FONT+i,
240 FontFace.FaceName[i]);
241
242 FaceID = -1;
243 SendMessage(hWnd, WM_COMMAND, IDM_FONT, 0L);
244
245 MakeSizeMenu(hWnd);
246 }
247
248
249 void MakeSizeMenu(HWND hWnd)
250 {
251 int i;
252 HDC hDC;
253 HMENU hMenu, hPopMenu;
254 FARPROC lpEnumSizes;
255 char szStr[10];
256 static LOGFONT DefLF;
257
258 FontSize.SizeNum = 0;
259 lpEnumSizes = MakeProcInstance(EnumSizes, hInst);
260
261 if (FontFace.bRaster[FaceID-IDM_FONT])
262 {
263 hDC = GetDC(hWnd);
264 EnumFonts(hDC, FontFace.FaceName[FaceID-IDM_FONT],
265 lpEnumSizes, NULL);
266 ReleaseDC(hWnd, hDC);
267 }
268 else
269 FillStrokeSize();
270
271 hMenu = GetMenu(hWnd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -