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