⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paint_fn.c

📁 WINDOWS图形编程随书光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -