DIALOGS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:33k
源码类别:

Windows编程

开发平台:

Visual C++

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