|
|
1.1 root 1: #include "firstaid.h"
2: #define NOMINMAX
3: #include <windows.h>
4: #include "FontView.h"
5:
6: #include <stdlib.h>
7:
8: #if defined (WIN16)
9: typedef LONG (APIENTRY *WNDPROC)(HWND, UINT, WORD, LONG);
10: #endif
11:
12: BOOL CenterWindow (HWND, HWND);
13:
14:
15: typedef struct FONTENUM {
16: short ft;
17: TEXTMETRIC tm;
18: LOGFONT lf;
19: } FONTSTRUCT;
20: typedef FONTSTRUCT *PFONTSTRUCT;
21: typedef FONTSTRUCT NEAR *NPFONTSTRUCT;
22: typedef FONTSTRUCT FAR *LPFONTSTRUCT;
23:
24: typedef struct FONTLIST {
25: int count;
26: HANDLE hList;
27: } FONTLIST;
28: typedef FONTLIST *PFONTLIST;
29: typedef FONTLIST NEAR *NPFONTLIST;
30: typedef FONTLIST FAR *LPFONTLIST;
31:
32:
33: void SetDlgItemValue (HWND hDlg, int nIDDlgItem, int wValue, BOOL bSigned, int nBase)
34: {
35: char szValue[20];
36:
37: switch (nBase) {
38: case 8:
39: wsprintf (szValue, "0o%o", wValue);
40: SetDlgItemText (hDlg, nIDDlgItem, szValue);
41: break;
42: case 16:
43: wsprintf (szValue, "0x%x", wValue);
44: SetDlgItemText (hDlg, nIDDlgItem, szValue);
45: break;
46: default:
47: SetDlgItemInt (hDlg, nIDDlgItem, wValue, bSigned);
48: break;
49: }
50: }
51:
52: int FAR PASCAL DlgEnumFontSizes (lpLogFont, lpTextMetric, nFontType, lpData)
53: LPLOGFONT lpLogFont;
54: LPTEXTMETRIC lpTextMetric;
55: short nFontType;
56: LPHANDLE lpData;
57: {
58: LPSTR lpFaces ;
59: HANDLE hFonts;
60: LPFONTSTRUCT pFS;
61: LPFONTLIST pFL;
62:
63: lpFaces; // unreferenced
64:
65: /*
66: This function will lock down the incoming handle, properly alloc, and realloc the
67: handle within it to hold the data of the fonts enumerated, then unlock the handle.
68: */
69: hFonts = *lpData;
70: pFL = (LPFONTLIST)GlobalLock (hFonts);
71: if (!pFL) {
72: return FALSE;
73: } else if (pFL->count == 0) {
74: pFL->hList = GlobalAlloc (GHND, sizeof(FONTSTRUCT));
75: } else {
76: pFL->hList = GlobalReAlloc (pFL->hList, sizeof(FONTSTRUCT)*(1+pFL->count), GMEM_MOVEABLE);
77: }
78:
79: if (pFL->hList) {
80: pFS = (LPFONTSTRUCT)GlobalLock (pFL->hList);
81: if (pFS) {
82: pFS[pFL->count].ft = nFontType;
83: pFS[pFL->count].tm = *lpTextMetric;
84: pFS[pFL->count].lf = *lpLogFont;
85: GlobalUnlock (pFL->hList);
86: pFL->count++;
87: }
88: GlobalUnlock (hFonts);
89:
90: } else {
91: GlobalUnlock (hFonts);
92: return FALSE;
93: }
94:
95: return TRUE;
96: }
97:
98: int FAR PASCAL DlgEnumFontNames (lpLogFont, lpTextMetric, nFontType, lpData)
99: LPLOGFONT lpLogFont;
100: LPTEXTMETRIC lpTextMetric;
101: short nFontType;
102: LPHANDLE lpData;
103: {
104: HDC hdc;
105: HWND hwnd;
106: HANDLE hInst;
107: FARPROC lpFontEnumProc;
108: extern HANDLE hwndMain;
109:
110: /*
111: This function is just a pass through. For each face encountered, it will in turn enumerate all
112: sizes available. the lpData, which is a FAR * to a FONTSTRUCT structure will simply be passed
113: on to the second enumeration procedure which will fill it in.
114: */
115: lpTextMetric; // unreferenced
116: nFontType; // unreferenced
117:
118: hwnd = GetFocus();
119: #if defined (NT)
120: hInst = (HANDLE)GetWindowLong (hwndMain, GWL_HINSTANCE);
121: #elif defined (WIN16)
122: hInst = (HANDLE)GetWindowWord (hwnd, GWW_HINSTANCE);
123: #endif
124:
125: lpFontEnumProc = MakeProcInstance(DlgEnumFontSizes, hInst);
126: if (lpFontEnumProc) {
127: hdc = GetDC(hwnd);
128: EnumFonts (hdc, lpLogFont->lfFaceName, lpFontEnumProc, (LPSTR)lpData);
129: ReleaseDC(hwnd, hdc);
130: FreeProcInstance (lpFontEnumProc);
131: } else {
132: MessageBox (GetFocus(), "Couldn't create a proc instance", "FontView", MB_OK);
133: return FALSE;
134: }
135: return TRUE;
136: }
137:
138:
139:
140: BOOL APIENTRY SimpleDlgProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
141: {
142: INT wmId;
143:
144: switch (msg) {
145: case WM_INITDIALOG:
146: CenterWindow (hwnd, GetWindow (hwnd, GW_OWNER));
147: return (TRUE);
148:
149: case WM_COMMAND:
150: #if defined (NT)
151: wmId = LOWORD(wParam);
152: #elif defined (WIN16)
153: wmId = wParam;
154: #endif
155: switch (wmId) {
156:
157: case IDOK:
158: EndDialog(hwnd, TRUE);
159: return (TRUE);
160:
161: case IDCANCEL:
162: EndDialog(hwnd, TRUE);
163: return (TRUE);
164: }
165: break;
166: }
167: return (FALSE);
168:
169: /* Just For Reference */
170: lParam;
171: }
172:
173: BOOL APIENTRY CreateDlgProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
174: {
175: INT wmId, i;
176: BOOL bDone;
177: static LOGFONT lfDlg;
178: static LPLOGFONT lplf;
179:
180: switch (msg) {
181: case WM_INITDIALOG:
182: CenterWindow (hwnd, GetWindow (hwnd, GW_OWNER));
183: lplf = (LOGFONT *)lParam;
184: lfDlg = *lplf;
185: SetDlgItemInt (hwnd, CFD_HEIGHT, (int)lfDlg.lfHeight, TRUE);
186: SetDlgItemInt (hwnd, CFD_WIDTH, (int)lfDlg.lfWidth, TRUE);
187: SetDlgItemInt (hwnd, CFD_ESCAPEMENT, (int)lfDlg.lfEscapement, TRUE);
188: SetDlgItemInt (hwnd, CFD_ORIENTATION, (int)lfDlg.lfOrientation, TRUE);
189: SetDlgItemInt (hwnd, CFD_WEIGHT, (int)lfDlg.lfWeight, FALSE);
190: SetDlgItemInt (hwnd, CFD_ITALIC, (int)lfDlg.lfItalic, FALSE);
191: SetDlgItemInt (hwnd, CFD_UNDERLINE, (int)lfDlg.lfUnderline, FALSE);
192: SetDlgItemInt (hwnd, CFD_STRIKEOUT, (int)lfDlg.lfStrikeOut, FALSE);
193: SetDlgItemInt (hwnd, CFD_CHARSET, (int)lfDlg.lfCharSet, FALSE);
194: SetDlgItemInt (hwnd, CFD_OUTPUTPRECISION, (int)lfDlg.lfOutPrecision, FALSE);
195: SetDlgItemInt (hwnd, CFD_CLIPPRECISION, (int)lfDlg.lfClipPrecision, FALSE);
196: SetDlgItemInt (hwnd, CFD_QUALITY, (int)lfDlg.lfQuality, FALSE);
197: SetDlgItemInt (hwnd, CFD_PITCHANDFAMILY, (int)lfDlg.lfPitchAndFamily, FALSE);
198: SetDlgItemText(hwnd, CFD_FACENAME, lfDlg.lfFaceName);
199:
200: return (TRUE);
201:
202: case WM_COMMAND:
203: #if defined (NT)
204: wmId = LOWORD(wParam);
205: #elif defined (WIN16)
206: wmId = wParam;
207: #endif
208: switch (wmId) {
209: case CFD_DEFAULT:
210: for (i=CFD_BASE; i<=CFD_PITCHANDFAMILY; i++) {
211: SetDlgItemInt (hwnd, i, 0, FALSE);
212: }
213: SetDlgItemText (hwnd, CFD_FACENAME, "");
214: break;
215:
216: case IDOK:
217: lfDlg.lfHeight = GetDlgItemInt (hwnd, CFD_HEIGHT, &bDone, TRUE);
218: lfDlg.lfWidth = GetDlgItemInt (hwnd, CFD_WIDTH, &bDone, TRUE);
219: lfDlg.lfEscapement = GetDlgItemInt (hwnd, CFD_ESCAPEMENT, &bDone, TRUE);
220: lfDlg.lfOrientation = GetDlgItemInt (hwnd, CFD_ORIENTATION, &bDone, TRUE);
221: lfDlg.lfWeight = GetDlgItemInt (hwnd, CFD_WEIGHT, &bDone, FALSE);
222: lfDlg.lfItalic = (BYTE)GetDlgItemInt (hwnd, CFD_ITALIC, &bDone, FALSE);
223: lfDlg.lfUnderline = (BYTE)GetDlgItemInt (hwnd, CFD_UNDERLINE, &bDone, FALSE);
224: lfDlg.lfStrikeOut = (BYTE)GetDlgItemInt (hwnd, CFD_STRIKEOUT, &bDone, FALSE);
225: lfDlg.lfCharSet = (BYTE)GetDlgItemInt (hwnd, CFD_CHARSET, &bDone, FALSE);
226: lfDlg.lfOutPrecision = (BYTE)GetDlgItemInt (hwnd, CFD_OUTPUTPRECISION, &bDone, FALSE);
227: lfDlg.lfClipPrecision = (BYTE)GetDlgItemInt (hwnd, CFD_CLIPPRECISION, &bDone, FALSE);
228: lfDlg.lfQuality = (BYTE)GetDlgItemInt (hwnd, CFD_QUALITY, &bDone, FALSE);
229: lfDlg.lfPitchAndFamily = (BYTE)GetDlgItemInt (hwnd, CFD_PITCHANDFAMILY, &bDone, FALSE);
230: GetDlgItemText(hwnd, CFD_FACENAME, lfDlg.lfFaceName,20);
231:
232: *lplf = lfDlg;
233: EndDialog(hwnd, TRUE);
234: return (TRUE);
235:
236: case IDCANCEL:
237: EndDialog(hwnd, TRUE);
238: return (TRUE);
239:
240: }
241: break;
242: }
243: return (FALSE);
244:
245: /* Just For Reference */
246: lParam;
247: }
248:
249: /*
250: typedef struct tagTEXTMETRIC {
251: short int tmHeight;
252: short int tmAscent;
253: short int tmDescent;
254: short int tmInternalLeading;
255: short int tmExternalLeading;
256: short int tmAveCharWidth;
257: short int tmMaxCharWidth;
258: short int tmWeight;
259: BYTE tmItalic;
260: BYTE tmUnderlined;
261: BYTE tmStruckOut;
262: BYTE tmFirstChar;
263: BYTE tmLastChar;
264: BYTE tmDefaultChar;
265: BYTE tmBreakChar;
266: BYTE tmPitchAndFamily;
267: BYTE tmCharSet;
268:
269: short int tmOverhang;
270: short int tmDigitizedAspectX;
271: short int tmDigitizedAspectY;
272:
273: } TEXTMETRIC;
274:
275: tmHeight
276: tmAscent
277: tmDescent
278: tmInternalLeading
279: tmExternalLeading
280: tmAveCharWidth
281: tmMaxCharWidth
282: tmWeight
283: tmItalic
284: tmUnderlined
285: tmStruckOut
286: tmFirstChar
287: tmLastChar
288: tmDefaultChar
289: tmBreakChar
290: tmPitchAndFamily
291: tmCharSet
292:
293: typedef struct tagLOGFONT {
294: short int lfHeight;
295: short int lfWidth;
296: short int lfEscapement;
297: short int lfOrientation;
298: short int lfWeight;
299: BYTE lfItalic;
300: BYTE lfUnderline;
301: BYTE lfStrikeOut;
302: BYTE lfCharSet;
303: BYTE lfOutPrecision;
304: BYTE lfClipPrecision;
305: BYTE lfQuality;
306: BYTE lfPitchAndFamily;
307: BYTE lfFaceName[LF_FACESIZE];
308:
309: } LOGFONT;
310:
311: lfHeight
312: lfWidth
313: lfEscapement
314: lfOrientation
315: lfWeight
316: lfItalic
317: lfUnderline
318: lfStrikeOut
319: lfCharSet
320: lfOutPrecision
321: lfClipPrecision
322: lfQuality
323: lfPitchAndFamily
324: lfFaceName
325:
326: */
327:
328: BOOL APIENTRY MetricsDlgProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
329: {
330: static LOGFONT lfDlg;
331: static LPLOGFONT lplf;
332: static TEXTMETRIC tm;
333: static char szFacename[LF_FACESIZE];
334: INT wmId;
335: BOOL bDone;
336: TEXTMETRIC tmTmp;
337: HFONT hfont, hfontPrev;
338: HDC hdc;
339: char szBuffer[LF_FACESIZE+15];
340:
341:
342: switch (msg) {
343: case WM_INITDIALOG:
344: CenterWindow (hwnd, GetWindow (hwnd, GW_OWNER));
345: lplf = (LOGFONT *)lParam;
346: lfDlg = *lplf;
347:
348: hfont = CreateFontIndirect (&lfDlg);
349: hdc = GetDC (hwnd);
350: hfontPrev = SelectObject (hdc, hfont);
351: GetTextMetrics (hdc, &tm);
352: GetTextFace (hdc, sizeof(szFacename), szFacename);
353: SelectObject (hdc, hfontPrev);
354: DeleteObject (hfont);
355: ReleaseDC (hwnd, hdc);
356:
357: wsprintf (szBuffer, "TextMetrics: %s", (LPSTR)szFacename);
358: SetWindowText (hwnd, szBuffer);
359:
360: SetDlgItemInt (hwnd, TMD_HEIGHT, (int)tm.tmHeight, TRUE);
361: SetDlgItemInt (hwnd, TMD_ASCENT, (int)tm.tmAscent, TRUE);
362: SetDlgItemInt (hwnd, TMD_DESCENT, (int)tm.tmDescent, TRUE);
363: SetDlgItemInt (hwnd, TMD_INTERNAL, (int)tm.tmInternalLeading, TRUE);
364: SetDlgItemInt (hwnd, TMD_EXTERNAL, (int)tm.tmExternalLeading, TRUE);
365: SetDlgItemInt (hwnd, TMD_AVEWIDTH, (int)tm.tmAveCharWidth, TRUE);
366: SetDlgItemInt (hwnd, TMD_MAXWIDTH, (int)tm.tmMaxCharWidth, TRUE);
367: SetDlgItemInt (hwnd, TMD_WEIGHT, (int)tm.tmWeight, TRUE);
368: SetDlgItemInt (hwnd, TMD_ITALIC, (int)tm.tmItalic, FALSE);
369: SetDlgItemInt (hwnd, TMD_UNDERLINE, (int)tm.tmUnderlined, FALSE);
370: SetDlgItemInt (hwnd, TMD_STRUCKOUT, (int)tm.tmStruckOut, FALSE);
371: SetDlgItemInt (hwnd, TMD_FIRSTCHAR, (int)tm.tmFirstChar, FALSE);
372: SetDlgItemInt (hwnd, TMD_LASTCHAR, (int)tm.tmLastChar, FALSE);
373: SetDlgItemInt (hwnd, TMD_DEFAULTCHAR, (int)tm.tmDefaultChar, FALSE);
374: SetDlgItemInt (hwnd, TMD_BREAKCHAR, (int)tm.tmBreakChar, FALSE);
375: SetDlgItemInt (hwnd, TMD_PITCHANDFAMILY, (int)tm.tmPitchAndFamily, FALSE);
376: SetDlgItemInt (hwnd, TMD_CHARSET, (int)tm.tmCharSet, FALSE);
377: SetDlgItemInt (hwnd, TMD_OVERHANG, (int)tm.tmOverhang, TRUE);
378: SetDlgItemInt (hwnd, TMD_DIGITIZEDASPECTX, (int)tm.tmDigitizedAspectX, TRUE);
379: SetDlgItemInt (hwnd, TMD_DIGITIZEDASPECTY, (int)tm.tmDigitizedAspectY, TRUE);
380:
381: return (TRUE);
382:
383: case WM_COMMAND:
384: #if defined (NT)
385: wmId = LOWORD(wParam);
386: #elif defined (WIN16)
387: wmId = wParam;
388: #endif
389: switch (wmId) {
390: case IDOK:
391:
392: lfDlg.lfHeight = tm.tmHeight;
393: lfDlg.lfWidth = tm.tmAveCharWidth;
394: //lfDlg.lfEscapement
395: //lfDlg.lfOrientation
396: lfDlg.lfWeight = tm.tmWeight;
397: lfDlg.lfItalic = tm.tmItalic;
398: lfDlg.lfUnderline = tm.tmUnderlined;
399: lfDlg.lfStrikeOut = tm.tmStruckOut;
400: lfDlg.lfCharSet = tm.tmCharSet;
401: //lfDlg.lfOutPrecision
402: //lfDlg.lfClipPrecision
403: //lfDlg.lfQuality
404: lfDlg.lfPitchAndFamily = tm.tmPitchAndFamily;
405: lstrcpy(lfDlg.lfFaceName, szFacename);
406:
407: hfont = CreateFontIndirect (&lfDlg);
408: hdc = GetDC (hwnd);
409: hfontPrev = SelectObject (hdc, hfont);
410: GetTextMetrics (hdc, &tmTmp);
411: GetTextFace (hdc, sizeof(szBuffer), szBuffer);
412: SelectObject (hdc, hfontPrev);
413: DeleteObject (hfont);
414: ReleaseDC (hwnd, hdc);
415:
416: bDone = TRUE;
417: bDone = bDone && (tm.tmHeight==tmTmp.tmHeight);
418: bDone = bDone && (tm.tmAscent==tmTmp.tmAscent);
419: bDone = bDone && (tm.tmDescent==tmTmp.tmDescent);
420: bDone = bDone && (tm.tmInternalLeading==tmTmp.tmInternalLeading);
421: bDone = bDone && (tm.tmExternalLeading==tmTmp.tmExternalLeading);
422: bDone = bDone && (tm.tmAveCharWidth==tmTmp.tmAveCharWidth);
423: bDone = bDone && (tm.tmMaxCharWidth==tmTmp.tmMaxCharWidth);
424: bDone = bDone && (tm.tmWeight==tmTmp.tmWeight);
425: bDone = bDone && (tm.tmItalic==tmTmp.tmItalic);
426: bDone = bDone && (tm.tmUnderlined==tmTmp.tmUnderlined);
427: bDone = bDone && (tm.tmStruckOut==tmTmp.tmStruckOut);
428: bDone = bDone && (tm.tmFirstChar==tmTmp.tmFirstChar);
429: bDone = bDone && (tm.tmLastChar==tmTmp.tmLastChar);
430: bDone = bDone && (tm.tmDefaultChar==tmTmp.tmDefaultChar);
431: bDone = bDone && (tm.tmBreakChar==tmTmp.tmBreakChar);
432: bDone = bDone && (tm.tmPitchAndFamily==tmTmp.tmPitchAndFamily);
433: bDone = bDone && (tm.tmCharSet==tmTmp.tmCharSet);
434: if (bDone) {
435: *lplf = lfDlg;
436: EndDialog(hwnd, TRUE);
437: return (TRUE);
438: } else {
439: lfDlg = *lplf;
440: MessageBox (GetFocus(),
441: "Unable to re-create font from TextMetrics",
442: "FontView", MB_OK);
443: }
444: break;
445:
446: case IDCANCEL:
447: EndDialog(hwnd, TRUE);
448: return (TRUE);
449:
450: }
451: break;
452: }
453: return (FALSE);
454:
455: /* Just For Reference */
456: lParam;
457: }
458:
459:
460: BOOL FillEnumFields (HWND hwnd, int iType, LPTEXTMETRIC ptm, LPLOGFONT plf, int nBase)
461: {
462: SetDlgItemValue (hwnd, TMD_HEIGHT, (int)ptm->tmHeight, TRUE, nBase);
463: SetDlgItemValue (hwnd, TMD_ASCENT, (int)ptm->tmAscent, TRUE, nBase);
464: SetDlgItemValue (hwnd, TMD_DESCENT, (int)ptm->tmDescent, TRUE, nBase);
465: SetDlgItemValue (hwnd, TMD_INTERNAL, (int)ptm->tmInternalLeading, TRUE, nBase);
466: SetDlgItemValue (hwnd, TMD_EXTERNAL, (int)ptm->tmExternalLeading, TRUE, nBase);
467: SetDlgItemValue (hwnd, TMD_AVEWIDTH, (int)ptm->tmAveCharWidth, TRUE, nBase);
468: SetDlgItemValue (hwnd, TMD_MAXWIDTH, (int)ptm->tmMaxCharWidth, TRUE, nBase);
469: SetDlgItemValue (hwnd, TMD_WEIGHT, (int)ptm->tmWeight, TRUE, nBase);
470: SetDlgItemValue (hwnd, TMD_ITALIC, (int)ptm->tmItalic, FALSE, nBase);
471: SetDlgItemValue (hwnd, TMD_UNDERLINE, (int)ptm->tmUnderlined, FALSE, nBase);
472: SetDlgItemValue (hwnd, TMD_STRUCKOUT, (int)ptm->tmStruckOut, FALSE, nBase);
473: SetDlgItemValue (hwnd, TMD_FIRSTCHAR, (int)ptm->tmFirstChar, FALSE, nBase);
474: SetDlgItemValue (hwnd, TMD_LASTCHAR, (int)ptm->tmLastChar, FALSE, nBase);
475: SetDlgItemValue (hwnd, TMD_DEFAULTCHAR, (int)ptm->tmDefaultChar, FALSE, nBase);
476: SetDlgItemValue (hwnd, TMD_BREAKCHAR, (int)ptm->tmBreakChar, FALSE, nBase);
477: SetDlgItemValue (hwnd, TMD_PITCHANDFAMILY, (int)ptm->tmPitchAndFamily, FALSE, nBase);
478: SetDlgItemValue (hwnd, TMD_CHARSET, (int)ptm->tmCharSet, FALSE, nBase);
479: SetDlgItemValue (hwnd, TMD_OVERHANG, (int)ptm->tmOverhang, TRUE, nBase);
480: SetDlgItemValue (hwnd, TMD_DIGITIZEDASPECTX, (int)ptm->tmDigitizedAspectX, TRUE, nBase);
481: SetDlgItemValue (hwnd, TMD_DIGITIZEDASPECTY, (int)ptm->tmDigitizedAspectY, TRUE, nBase);
482:
483: SetDlgItemValue (hwnd, CFD_HEIGHT, (int)plf->lfHeight, TRUE, nBase);
484: SetDlgItemValue (hwnd, CFD_WIDTH, (int)plf->lfWidth, TRUE, nBase);
485: SetDlgItemValue (hwnd, CFD_ESCAPEMENT, (int)plf->lfEscapement, TRUE, nBase);
486: SetDlgItemValue (hwnd, CFD_ORIENTATION, (int)plf->lfOrientation, TRUE, nBase);
487: SetDlgItemValue (hwnd, CFD_WEIGHT, (int)plf->lfWeight, FALSE, nBase);
488: SetDlgItemValue (hwnd, CFD_ITALIC, (int)plf->lfItalic, FALSE, nBase);
489: SetDlgItemValue (hwnd, CFD_UNDERLINE, (int)plf->lfUnderline, FALSE, nBase);
490: SetDlgItemValue (hwnd, CFD_STRIKEOUT, (int)plf->lfStrikeOut, FALSE, nBase);
491: SetDlgItemValue (hwnd, CFD_CHARSET, (int)plf->lfCharSet, FALSE, nBase);
492: SetDlgItemValue (hwnd, CFD_OUTPUTPRECISION, (int)plf->lfOutPrecision, FALSE, nBase);
493: SetDlgItemValue (hwnd, CFD_CLIPPRECISION, (int)plf->lfClipPrecision, FALSE, nBase);
494: SetDlgItemValue (hwnd, CFD_QUALITY, (int)plf->lfQuality, FALSE, nBase);
495: SetDlgItemValue (hwnd, CFD_PITCHANDFAMILY, (int)plf->lfPitchAndFamily, FALSE, nBase);
496: SetDlgItemText(hwnd, CFD_FACENAME, plf->lfFaceName);
497:
498: SetDlgItemValue (hwnd, ED_TYPE, (int)iType, FALSE, nBase);
499:
500: return TRUE;
501: }
502:
503:
504: BOOL DrawSample (HWND hwnd, LPLOGFONT plf)
505: {
506: HFONT hfont, hfontPrev;
507: HDC hdc;
508: RECT r;
509:
510: hfont = CreateFontIndirect (plf);
511: hdc = GetDC (hwnd);
512: hfontPrev = SelectObject (hdc, hfont);
513: GetWindowRect (hwnd, &r);
514: ScreenToClient (hwnd, (LPPOINT)&r.left);
515: ScreenToClient (hwnd, (LPPOINT)&r.right);
516:
517: Rectangle (hdc, r.left, r.top, r.right, r.bottom);
518:
519: InflateRect (&r, -1, -1);
520: SetTextAlign (hdc, TA_BOTTOM | TA_CENTER);
521: ExtTextOut (hdc, r.left + ((r.right-r.left)/2), r.bottom, ETO_CLIPPED, &r,"AaBbCcDdEe 012345", 17, NULL);
522:
523: SelectObject (hdc, hfontPrev);
524: DeleteObject (hfont);
525: ReleaseDC (hwnd, hdc);
526: return TRUE;
527: }
528:
529:
530: BOOL APIENTRY EnumDlgProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
531: {
532: static HANDLE /*TO FONTLIST*/ hFonts;
533: static int iLoc=0;
534: static int count=0;
535: static BOOL bHex = FALSE;
536: static LOGFONT *lplf;
537: static LOGFONT lfDlg;
538: INT wmId, i, j;
539: HANDLE hInst;
540: HWND hwndItem;
541: HDC hdc;
542: FARPROC lpEnumFonts;
543: LPFONTLIST pFL;
544: LPFONTSTRUCT pFS;
545: char szTmp[80];
546:
547: switch (msg) {
548: case WM_INITDIALOG:
549: lplf = (LOGFONT *)lParam;
550: lfDlg = *lplf;
551: iLoc = 0;
552: count = 0;
553: bHex = FALSE;
554: /* First, lets enumerate ALL fonts, and store them in our list */
555: hFonts = GlobalAlloc (GHND, sizeof(FONTLIST));
556: if (hFonts) {
557:
558: #if defined (NT)
559: hInst = (HANDLE)GetWindowLong (hwnd, GWL_HINSTANCE);
560: #elif defined (WIN16)
561: hInst = (HANDLE)GetWindowWord (hwnd, GWW_HINSTANCE);
562: #endif
563:
564: lpEnumFonts = MakeProcInstance(DlgEnumFontNames, hInst);
565: if (lpEnumFonts) {
566: hdc = GetDC(hwnd);
567: // The enumeration function will lock down the handle
568: EnumFonts (hdc, NULL, lpEnumFonts, (LPSTR)&hFonts);
569: // The handle will come back to us properly unlocked
570: ReleaseDC(hwnd, hdc);
571: FreeProcInstance (lpEnumFonts);
572:
573: }
574: }
575: pFL = (LPFONTLIST)GlobalLock (hFonts);
576: if (pFL) {
577: pFS = (LPFONTSTRUCT)GlobalLock (pFL->hList);
578: if (pFS) {
579: iLoc = 0;
580: j = 100;
581: for (i=0; i<pFL->count; i++) {
582: if (lstrcmp(lfDlg.lfFaceName, pFS[i].lf.lfFaceName) == 0) {
583: if (abs(lfDlg.lfHeight-pFS[i].lf.lfHeight) < j) {
584: j = abs(lfDlg.lfHeight-pFS[i].lf.lfHeight);
585: iLoc = i;
586: }
587: }
588: }
589: FillEnumFields (hwnd, pFS[iLoc].ft, &pFS[iLoc].tm, &pFS[iLoc].lf, (bHex?16:10));
590: hwndItem = GetDlgItem (hwnd, ED_SAMPLE);
591: DrawSample (hwndItem, &pFS[iLoc].lf);
592: GlobalUnlock (pFL->hList);
593:
594: }
595: count = pFL->count;
596: GlobalUnlock (hFonts);
597:
598: }
599: /* now fill in the dialog values */
600: wsprintf (szTmp, "EnumFonts %d of %d", iLoc+1, count);
601: SetWindowText (hwnd, szTmp);
602: CenterWindow (hwnd, GetWindow (hwnd, GW_OWNER));
603:
604: return TRUE;
605:
606: case WM_COMMAND:
607: #if defined (NT)
608: wmId = LOWORD(wParam);
609: #elif defined (WIN16)
610: wmId = wParam;
611: #endif
612: switch (wmId) {
613:
614: case ED_HEX:
615: bHex = !bHex;
616: CheckDlgButton (hwnd, wmId, bHex);
617: pFL = (LPFONTLIST)GlobalLock (hFonts);
618: if (pFL) {
619: pFS = (LPFONTSTRUCT)GlobalLock (pFL->hList);
620: if (pFS) {
621: FillEnumFields (hwnd, pFS[iLoc].ft, &pFS[iLoc].tm, &pFS[iLoc].lf, (bHex?16:10));
622: if (GlobalUnlock (pFL->hList)) {
623: MessageBox (GetFocus(), "In HEX", "Unlock pFL->hList", MB_OK);
624: }
625: }
626: if (GlobalUnlock (hFonts)) {
627: MessageBox (GetFocus(), "In HEX", "Unlock hFonts", MB_OK);
628: }
629:
630: }
631: break;
632:
633: case ED_PREV:
634: pFL = (LPFONTLIST)GlobalLock (hFonts);
635: if (pFL) {
636: if (iLoc > 0) {
637: iLoc--;
638: pFS = (LPFONTSTRUCT)GlobalLock (pFL->hList);
639: if (pFS) {
640: FillEnumFields (hwnd, pFS[iLoc].ft, &pFS[iLoc].tm, &pFS[iLoc].lf, (bHex?16:10));
641: hwndItem = GetDlgItem (hwnd, ED_SAMPLE);
642: DrawSample (hwndItem, &pFS[iLoc].lf);
643: GlobalUnlock (pFL->hList);
644: }
645: }
646: GlobalUnlock (hFonts);
647: }
648: wsprintf (szTmp, "EnumFonts %d of %d", iLoc+1, count);
649: SetWindowText (hwnd, szTmp);
650: break;
651:
652: case ED_NEXT:
653: pFL = (LPFONTLIST)GlobalLock (hFonts);
654: if (pFL) {
655: if ((pFL->count-1) > iLoc) {
656: iLoc++;
657: pFS = (LPFONTSTRUCT)GlobalLock (pFL->hList);
658: if (pFS) {
659: FillEnumFields (hwnd, pFS[iLoc].ft, &pFS[iLoc].tm, &pFS[iLoc].lf, (bHex?16:10));
660: hwndItem = GetDlgItem (hwnd, ED_SAMPLE);
661: DrawSample (hwndItem, &pFS[iLoc].lf);
662: GlobalUnlock (pFL->hList);
663: }
664:
665: }
666: GlobalUnlock (hFonts);
667: }
668: wsprintf (szTmp, "EnumFonts %d of %d", iLoc+1, count);
669: SetWindowText (hwnd, szTmp);
670: break;
671:
672: case IDOK:
673: // Copy the LOGFONT structure from the enumeration list, into our private LF
674: pFL = (LPFONTLIST)GlobalLock (hFonts);
675: if (pFL) {
676: if ((pFL->count-1) > iLoc) {
677: pFS = (LPFONTSTRUCT)GlobalLock (pFL->hList);
678: if (pFS) {
679: lfDlg = pFS[iLoc].lf;
680: GlobalUnlock (pFL->hList);
681: }
682: }
683: GlobalUnlock (hFonts);
684: }
685: // Now set our master lf to this value. This way, we 'could' verify that the
686: // LOGFONT structure will in fact select this particular font, we just aren't
687: *lplf = lfDlg;
688: pFL = (LPFONTLIST)GlobalLock (hFonts);
689: if (pFL) {
690: if (GlobalFree (pFL->hList)) {
691: MessageBox (GetFocus(), "Failed To Free", "pFL->hList", MB_OK);
692: } else {
693: GlobalUnlock (hFonts);
694: if (GlobalFree (hFonts)) {
695: MessageBox (GetFocus(), "Failed To Free", "hFonts", MB_OK);
696: }
697: }
698: }
699: EndDialog(hwnd, TRUE);
700: return (TRUE);
701:
702: case IDCANCEL:
703: pFL = (LPFONTLIST)GlobalLock (hFonts);
704: if (pFL) {
705: if (GlobalFree (pFL->hList)) {
706: MessageBox (GetFocus(), "Failed To Free", "pFL->hList", MB_OK);
707: } else {
708: GlobalUnlock (hFonts);
709: if (GlobalFree (hFonts)) {
710: MessageBox (GetFocus(), "Failed To Free", "hFonts", MB_OK);
711: }
712: }
713: }
714: EndDialog(hwnd, TRUE);
715: return (TRUE);
716: }
717: break;
718: }
719: return (FALSE);
720:
721: /* Just For Reference */
722: lParam;
723: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.