home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / gdi / fonts / fontview / display.c < prev    next >
Text File  |  1997-10-05  |  18KB  |  496 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 Microsoft Corporation.
  5. *       All rights reserved. 
  6. *       This source code is only intended as a supplement to 
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the 
  9. *       Microsoft samples programs.
  10. \******************************************************************************/
  11.  
  12. #include <windows.h>
  13. #include <string.h>
  14. #include <math.h>
  15.  
  16. #if defined (WIN32)
  17. #define _MoveTo(hdc,x,y) MoveToEx(hdc,x,y,NULL)
  18. #else
  19. #define _MoveTo(hdc,x,y) MoveTo(hdc,x,y)
  20. #endif
  21.  
  22. // These are the 'exported' functions from this file:
  23. void DrawAscii (HDC hdc, RECT *pRect, WORD direction);
  24. void DrawGlyph (HDC hdc, RECT *pRect, BYTE glyph, HFONT hfont);
  25. BYTE FindChar (HDC hdc, RECT *pRect, int x, int y);
  26.  
  27. #pragma warning(4 : 4309)
  28. // A data structure that DrawAscii will use:
  29. char ascii[]=
  30.     {
  31.     // Low Ascii:
  32.  
  33.     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  34.     20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  35.  
  36.     // Standard Ascii:
  37.  
  38.     ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',',
  39.     '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  40.     ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F',
  41.     'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  42.     'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`',
  43.     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
  44.     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
  45.     '{', '|', '}', '~', '',
  46.  
  47.     // High Ascii:
  48.  
  49.     '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
  50.     '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
  51.     '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
  52.     '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
  53.     '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
  54.     '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
  55.     '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
  56.     '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
  57.  
  58.     '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
  59.     '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
  60.     '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
  61.     '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
  62.     '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
  63.     '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
  64.     '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
  65.     '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
  66.  
  67.  
  68.     // End of the list:
  69.  
  70.     000, 000};
  71. #pragma warning(3 : 4309)
  72.  
  73. /* A function that the CharSet window will use to display the text */
  74. void DrawAscii (HDC hdc, RECT *pRect, WORD direction)
  75. {
  76.     BYTE *pch;
  77.     int h, w, incx, incy, width;
  78.     unsigned int  wDisplay;
  79.     POINT pt;
  80.     TEXTMETRIC tm;
  81.     BOOL bLineMode = FALSE;
  82.  
  83.  
  84.     GetTextMetrics (hdc, &tm);
  85.     h = tm.tmHeight;
  86.     w = tm.tmMaxCharWidth;
  87.  
  88.     incx = 0;
  89.     incy = h;
  90.     pt.x = 0;
  91.     pt.y = 0;
  92.  
  93.     //
  94.     pt.y = tm.tmAscent + tm.tmExternalLeading;
  95.     //
  96.  
  97.     pch = &(ascii[tm.tmFirstChar]);
  98.     wDisplay = pRect->right -pRect->left;
  99.  
  100.     //
  101.     SetTextAlign (hdc, TA_BASELINE | TA_CENTER);
  102.     SetBkMode (hdc, TRANSPARENT);
  103.     //
  104.  
  105.     while (pch[0] && (pch[0]<=tm.tmLastChar)) {
  106. #if defined (WIN32)
  107.         SIZE size;
  108.         GetTextExtentPoint (hdc, pch, 1, &size);
  109.         width = size.cx;
  110. #else
  111.         width = LOWORD (GetTextExtent (hdc, pch, 1));
  112. #endif
  113.         if ((unsigned)(pt.x + width) > wDisplay) {
  114.             pt.x = 0;
  115.             pt.y += incy;
  116.         }
  117.         TextOut (hdc, pt.x + (width/2), pt.y, pch, 1);
  118.         pt.x += width;
  119.         pch++;
  120.     }
  121.     return;
  122.  
  123.     direction;
  124. }
  125.  
  126. // Return the character that was drawn at the provided location
  127. // This allows us to 'click' on a character, and determined what
  128. // it was we actually clicked on.
  129. BYTE FindChar (HDC hdc, RECT *pRect, int x, int y)
  130. {
  131.     BYTE *pch;
  132.     int h, w, incx, incy, width;
  133.     unsigned int wDisplay;
  134.     POINT pt;
  135.     TEXTMETRIC tm;
  136.     BOOL bLineMode = FALSE;
  137.  
  138.  
  139.     GetTextMetrics (hdc, &tm);
  140.     h = tm.tmHeight;
  141.     w = tm.tmMaxCharWidth;
  142.  
  143.     incx = 0;
  144.     incy = h;
  145.     pt.x = 0;
  146.     pt.y = 0;
  147.  
  148.     pch = &(ascii[tm.tmFirstChar]);
  149.     wDisplay = pRect->right -pRect->left;
  150.  
  151.     while (pch[0] && (pch[0]<=tm.tmLastChar)) {
  152. #if defined (WIN32)
  153.         SIZE size;
  154.         GetTextExtentPoint (hdc, pch, 1, &size);
  155.         width = size.cx;
  156. #else
  157.         width = LOWORD (GetTextExtent (hdc, pch, 1));
  158. #endif
  159.         if ((unsigned)(pt.x + width) > wDisplay) {
  160.             pt.x = 0;
  161.             pt.y += incy;
  162.         }
  163.         if ((x>=pt.x) && (x <=(pt.x+width)) && (y>=pt.y) && (y<=pt.y+incy)) return pch[0];
  164.         pt.x += width;
  165.         pch++;
  166.     }
  167.     return 0;
  168. }
  169.  
  170. // Essentially, a StretchBlt, but draws cicular pels.
  171. BOOL CircleBlt (HDC hdcDest, int xDst, int yDst, int iWidthDst, int iHeightDst, HDC hdcSrc, int xSrc, int ySrc, int iWidthSrc, int iHeightSrc, DWORD dwROP)
  172. {
  173.     int x, y, x1, y1, x2, y2;
  174.     DWORD rgb;
  175.     float fXUnit, fYUnit;
  176.     HBRUSH hbrush, hbrushOld;
  177.  
  178.     if (iWidthSrc != 0){
  179.         fXUnit = (float)iWidthDst / (float)iWidthSrc;
  180.     } else {
  181.         fXUnit = (float)iWidthDst;
  182.     }
  183.     if (iHeightSrc != 0) {
  184.         fYUnit = (float)iHeightDst / (float)iHeightSrc;
  185.     } else {
  186.         fYUnit = (float)iHeightDst;
  187.     }
  188.  
  189.     for (y=ySrc; y<(ySrc+iHeightSrc); y++) {
  190.         for (x=xSrc; x<(xSrc+iWidthSrc); x++) {
  191.  
  192.             rgb = GetPixel (hdcSrc, x, y);
  193.             if (rgb != -1 && rgb != 0x00FFFFFF) {
  194.                 hbrush = CreateSolidBrush (rgb);
  195.                 hbrushOld = SelectObject (hdcDest, hbrush);
  196.                 x1 = xDst + (int)((x-xSrc)*fXUnit);
  197.                 y1 = yDst + (int)((y-ySrc)*fYUnit);
  198.                 x2 = xDst + (int)(((x-xSrc)+1)*fXUnit)+1;
  199.                 y2 = yDst + (int)(((y-ySrc)+1)*fYUnit)+1;
  200.                 Ellipse (hdcDest, x1, y1, x2, y2);
  201.                 DeleteObject(SelectObject(hdcDest, hbrushOld));
  202.             }
  203.         }
  204.     }
  205.  
  206.     return TRUE;
  207.  
  208.     dwROP;
  209. }
  210.  
  211. double Radian(double ang)
  212. {
  213.         return ang * (double)3.1415926535 / (double)180.0;
  214. }
  215.  
  216. void CalcRot (double x, double y, double ang, double* x1, double* y1)
  217. {
  218.         ang = Radian(-ang);
  219.         *x1 = (x * cos(ang)) - (y * sin(ang));
  220.         *y1 = (x * sin(ang)) + (y * cos(ang));
  221. }
  222.  
  223. void DrawGlyph (HDC hdc, RECT *pRect, BYTE glyph, HFONT hfont)
  224. {
  225.     TEXTMETRIC tm;
  226.     LOGFONT lf;
  227.     int wChar, h1, h2, w1, w2, x, y;
  228.     double xTL, yTL, xTR, yTR, xBL, yBL, xBR, yBR, xML, yML, xMR, yMR;
  229.     int cWidth, cExtentW, cExtentH;
  230.     int unit, margin;
  231.     RECT rect, rectChar;
  232.     HDC hdcMem;
  233.     HBITMAP hbitmap, hbitmapOld;
  234.     HFONT hfontOld, hfontTmp;
  235.     char szText[80];
  236.     double fAng, fWa, fWb, fHa, fHb, fHeight, fWidth;
  237.     BOOL bRotateable;
  238.     double fxOff, fyOff;
  239. #if defined(TT_AVAILABLE)
  240.     ABC abc;
  241. #endif
  242.  
  243.     GetTextMetrics (hdc, &tm);
  244.     hfontTmp = SelectObject (hdc, GetStockObject(SYSTEM_FONT));
  245.     GetObject (hfontTmp, sizeof(LOGFONT), &lf);
  246.  
  247. // Some fields of 'lf' need to be whacked out depending on the type of
  248. // font involved. For instance, lfEscapement should only be non-zero for
  249. // rotatable fonts.
  250.         bRotateable = FALSE;
  251. #if defined (TMPF_VECTOR)
  252.         bRotateable = (tm.tmPitchAndFamily & TMPF_VECTOR);
  253. #endif
  254. #if defined (TMPF_TRUETYPE)
  255.         bRotateable |= (tm.tmPitchAndFamily & TMPF_TRUETYPE);
  256. #endif
  257.         if (!bRotateable) {
  258.                 lf.lfEscapement = 0;
  259.         }
  260.  
  261.     SelectObject (hdc, hfontTmp);
  262.     GetCharWidth (hdc, glyph, glyph, &cWidth);
  263.  
  264. #if defined (WIN32)
  265.     {
  266.         SIZE size;
  267.         GetTextExtentPoint (hdc, (LPSTR)&glyph, 1, &size);
  268.         cExtentW = size.cx;
  269.         cExtentH = size.cy;
  270.     }
  271. #else
  272.     cExtentW = LOWORD (GetTextExtent (hdc, (LPSTR)&glyph, 1));
  273.     cExtentH = HIWORD (GetTextExtent (hdc, (LPSTR)&glyph, 1));
  274. #endif
  275.  
  276.     wChar = max(cWidth, cExtentW);
  277.  
  278. #if defined(TT_AVAILABLE)
  279.     if (GetCharABCWidths (hdc, (UINT)glyph, (UINT)glyph, &abc)) {
  280.         wChar = abc.abcA + abc.abcB + abc.abcC;
  281.         wChar = max(abc.abcA,0) + max (abc.abcB,0) + max (abc.abcC,0);
  282.     } else {
  283.         abc.abcA = 0;
  284.         abc.abcB = wChar;
  285.         abc.abcC = 0;
  286.     }
  287. #endif
  288.  
  289. // ****
  290.         // Lets figure out how large of a bitmap we need to draw this character into.
  291.         // This will take lfEscapement into account.
  292.  
  293.         // Turn the 'escapement' value into a valid angle
  294.     fAng = 90.0 - ((double)lf.lfEscapement/10.0);
  295.  
  296.     // We now need to calculate two values for height and width. These
  297.     // represent the bases of the triangles that are formed as the
  298.     // character cell rotates. Thus fWa+fWb is the 'width' of the space
  299.     // required by the given character at the current rotation.
  300.     // At 0, 90, 180, 270 and 360, one of the two values will be '0'.
  301.     fWa = (double)cExtentW * sin(Radian(fAng));
  302.     fHa = (double)cExtentW * sin(Radian((double)lf.lfEscapement/10.0));
  303.     fHb = (double)cExtentH * sin(Radian(fAng));
  304.     fWb = (double)cExtentH * sin(Radian((double)lf.lfEscapement/10.0));
  305.  
  306.     // This gives us a width/height of:
  307.     fHeight = fabs(fHa) + fabs(fHb);
  308.     fWidth = fabs(fWa) + fabs(fWb);
  309. // ****
  310.  
  311.     h1 = pRect->bottom - pRect->top;
  312.     h2 = tm.tmHeight + tm.tmExternalLeading;
  313.     h2 = (int)fHeight;
  314.     if (h2 == 0) {
  315.         MessageBeep (0);
  316.         h2 = 10;
  317.     }
  318.  
  319.     w1 = pRect->right - pRect->left;
  320.     w2 = (int)fWidth;
  321.  
  322.     unit = (h1 / h2);
  323.  
  324.     margin = (h1 - (unit * h2)) / 2;
  325.     margin = 0;
  326.     // Define a rectangle that will enclose our drawing area
  327.     SetRect (&rect, 0, 0, wChar*unit, (tm.tmHeight*unit) + (tm.tmExternalLeading*unit));
  328.     OffsetRect (&rect, margin, margin);
  329.     // Define a rectangle that will define the bounding box of the character
  330.     SetRect (&rectChar, 0, 0, wChar*unit, tm.tmHeight*unit);
  331.     OffsetRect (&rectChar, margin, margin + (tm.tmExternalLeading*unit));
  332.  
  333.  
  334. // ****
  335.     // These are floating point values.
  336.     SetRect (&rect, 0, 0, (int)(fWidth)*unit, ((int)(fHeight)*unit) + (tm.tmExternalLeading*unit));
  337.     OffsetRect (&rect, margin, margin);
  338.     // Define a rectangle that will define the bounding box of the character
  339.     SetRect (&rectChar, 0, 0, (int)(fWidth)*unit, ((int)(fHeight)*unit));
  340.     OffsetRect (&rectChar, margin, margin + (tm.tmExternalLeading*unit));
  341.  
  342.     // Calculate the points of the 'character cell'. This will take full
  343.     // rotation into consideration.
  344.         CalcRot (0, 0, (double)lf.lfEscapement/10.0, &xTL, &yTL);
  345.         CalcRot ((double)cExtentW, 0, (double)lf.lfEscapement/10.0, &xTR, &yTR);
  346.         CalcRot (0, (double)cExtentH, (double)lf.lfEscapement/10.0, &xBL, &yBL);
  347.         CalcRot ((double)cExtentW, (double)cExtentH, (double)lf.lfEscapement/10.0, &xBR, &yBR);
  348.         CalcRot (0, (double)tm.tmAscent, (double)lf.lfEscapement/10.0, &xML, &yML);
  349.         CalcRot ((double)cExtentW, (double)tm.tmAscent, (double)lf.lfEscapement/10.0, &xMR, &yMR);
  350.  
  351.         fxOff = min(xTL, min(xTR, min(xBL, xBR)));
  352.         fyOff = min(yTL, min(yTR, min(yBL, yBR)));
  353.  
  354. // Draw a rectangle around the drawing limits of the character.
  355.     _MoveTo (hdc, (int)((xTL-fxOff)*(double)unit), (int)((yTL-fyOff)*(double)unit));
  356.     LineTo (hdc, (int)((xTR-fxOff)*(double)unit), (int)((yTR-fyOff)*(double)unit));
  357.     LineTo (hdc, (int)((xBR-fxOff)*(double)unit), (int)((yBR-fyOff)*(double)unit));
  358.     LineTo (hdc, (int)((xBL-fxOff)*(double)unit), (int)((yBL-fyOff)*(double)unit));
  359.     LineTo (hdc, (int)((xTL-fxOff)*(double)unit), (int)((yTL-fyOff)*(double)unit));
  360.  
  361. // Draw the baseline, which indicates the advance width of the character
  362.     _MoveTo (hdc, (int)((xML-fxOff)*(double)unit), (int)((yML-fyOff)*(double)unit));
  363.     LineTo (hdc, (int)((xMR-fxOff)*(double)unit), (int)((yMR-fyOff)*(double)unit));
  364.  
  365.     hdcMem = CreateCompatibleDC (hdc);
  366.     if (hdcMem) {
  367.         hbitmap = CreateCompatibleBitmap (hdc, (int)(fWidth), (int)(fHeight));
  368.         if (hbitmap) {
  369.             hbitmapOld = SelectObject (hdcMem, hbitmap);
  370.             BitBlt (hdcMem, 0, 0, (int)(fWidth), (int)(fHeight), NULL, 0, 0, WHITENESS);
  371.             hfontOld = SelectObject (hdcMem, hfont);
  372.  
  373.             SetTextAlign (hdcMem, TA_LEFT | TA_BASELINE);
  374.             if (TextOut (hdcMem, (int)(xML-fxOff), (int)(yML-fyOff), (LPSTR)&glyph, 1)) {
  375.  
  376.  
  377.                                 /*
  378.                 // Just for debugging, lets mark some special pixels
  379.                         SetPixel (hdcMem, (int)(xML-fxOff), (int)(yML-fyOff), 0x808080); // Base Lft
  380.                         SetPixel (hdcMem, (int)(xTL-fxOff), (int)(yTL-fyOff), 0x808080); // Top Left
  381.                         SetPixel (hdcMem, (int)(xTR-fxOff), (int)(yTR-fyOff), 0x808080); // Top Right
  382.                         SetPixel (hdcMem, (int)(xBL-fxOff), (int)(yBL-fyOff), 0x808080); // Btm Left
  383.                         SetPixel (hdcMem, (int)(xBR-fxOff), (int)(yBR-fyOff), 0x808080); // Btm Right
  384.                         SetPixel (hdcMem, (int)(xML-fxOff), (int)(yML-fyOff), 0x808080); // Base Lft
  385.                         SetPixel (hdcMem, (int)(xMR-fxOff), (int)(yMR-fyOff), 0x808080); // Base Rt
  386.                 */
  387.  
  388.                 CircleBlt(hdc, margin, margin,
  389.                     rectChar.right-rectChar.left, rectChar.bottom-rectChar.top,
  390.                     hdcMem, 0, 0, (int)(fWidth), (int)(fHeight), SRCPAINT);
  391.  
  392.             } else {
  393.                 MessageBox (GetFocus(),
  394.                         "Unable to perform TextOut", "DisplayGlyph", MB_OK);
  395.             }
  396.             SelectObject (hdcMem, hbitmapOld);
  397.             SelectObject (hdcMem, hfontOld);
  398.             DeleteObject (hbitmap);
  399.         } else {
  400.             MessageBox (GetFocus(), "Unable To create Bitmap", "DisplayGlyph", MB_OK);
  401.         }
  402.         DeleteDC (hdcMem);
  403.     } else {
  404.         MessageBox (GetFocus(), "Unable to create DC", "DisplayGlyph", MB_OK);
  405.     }
  406.  
  407.     hfontTmp = CreateFont(14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VARIABLE_PITCH | FF_SWISS, "");
  408.  
  409.     if (hfontTmp) {
  410.         hfontOld = SelectObject (hdc, hfontTmp);
  411.         x = rect.right + 10;
  412.         GetTextMetrics (hdc, &tm);
  413.  
  414.         y = tm.tmHeight + tm.tmExternalLeading;
  415.  
  416.         y += tm.tmHeight + tm.tmExternalLeading;
  417.         wsprintf (szText, "Character = '%c' %u (0x%X)", (char)glyph, (int)glyph, (int)glyph);
  418.         TextOut (hdc, x, y, szText, lstrlen(szText));
  419.  
  420.         y += tm.tmHeight + tm.tmExternalLeading;
  421.         wsprintf (szText, "CharWidth = %i", cWidth);
  422.         TextOut (hdc, x, y, szText, lstrlen(szText));
  423.  
  424.                 // ABC Width - Eventually, I want to 'draw' this into the character
  425.                 // cell, but for now, this at least makes the information easily
  426.                 // available:
  427. #if defined (TT_AVAILABLE)
  428.         y += tm.tmHeight + tm.tmExternalLeading;
  429.         wsprintf (szText, "A|B|C = %i | %u | %i", abc.abcA, abc.abcB, abc.abcC);
  430.         TextOut (hdc, x, y, szText, lstrlen(szText));
  431. #endif
  432.  
  433.         y += tm.tmHeight + tm.tmExternalLeading;
  434.         wsprintf (szText, "CharExtentW = %i", cExtentW);
  435.         TextOut (hdc, x, y, szText, lstrlen(szText));
  436.  
  437.         y += tm.tmHeight + tm.tmExternalLeading;
  438.         wsprintf (szText, "CharExtentH = %i", cExtentH);
  439.         TextOut (hdc, x, y, szText, lstrlen(szText));
  440.  
  441.                 // These are for some values I was using to debug the character
  442.                 // cell rotation calculation:
  443.  
  444.         //y += tm.tmHeight + tm.tmExternalLeading;
  445.         //wsprintf (szText, "(%i,%i) : (%i,%i) [%i]", (int)xTL, (int)yTL, (int)xTR, (int)yTR,(int)(((double)lf.lfEscapement/10.0)*10));
  446.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  447.  
  448.         //y += tm.tmHeight + tm.tmExternalLeading;
  449.         //wsprintf (szText, "(%i,%i) : (%i,%i)", (int)xML, (int)yML, (int)xMR, (int)yMR);
  450.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  451.  
  452.         //y += tm.tmHeight + tm.tmExternalLeading;
  453.         //wsprintf (szText, "(%i,%i) : (%i,%i)", (int)xBL, (int)yBL, (int)xBR, (int)yBR);
  454.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  455.  
  456.         //y += tm.tmHeight + tm.tmExternalLeading;
  457.         //wsprintf (szText, "fAng = %i", (int)(fAng));
  458.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  459.  
  460.         //y += tm.tmHeight + tm.tmExternalLeading;
  461.         //wsprintf (szText, "fHa = %i", (int)(fHa));
  462.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  463.  
  464.         //y += tm.tmHeight + tm.tmExternalLeading;
  465.         //wsprintf (szText, "fHb = %i", (int)(fHb));
  466.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  467.  
  468.         //y += tm.tmHeight + tm.tmExternalLeading;
  469.         //wsprintf (szText, "fWa = %i", (int)(fWa));
  470.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  471.  
  472.         //y += tm.tmHeight + tm.tmExternalLeading;
  473.         //wsprintf (szText, "fWb = %i", (int)(fWb));
  474.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  475.  
  476.         //y += tm.tmHeight + tm.tmExternalLeading;
  477.         //wsprintf (szText, "fWd = %i", (int)(fWd));
  478.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  479.  
  480.         //y += tm.tmHeight + tm.tmExternalLeading;
  481.         //wsprintf (szText, "fHd = %i", (int)(fHd));
  482.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  483.  
  484.         //y += tm.tmHeight + tm.tmExternalLeading;
  485.         //wsprintf (szText, "fHeight = %i", (int)(fHeight));
  486.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  487.  
  488.         //y += tm.tmHeight + tm.tmExternalLeading;
  489.         //wsprintf (szText, "fWidth = %i", (int)(fWidth));
  490.         //TextOut (hdc, x, y, szText, lstrlen(szText));
  491.  
  492.         SelectObject (hdc, hfontOld);
  493.         DeleteObject (hfontTmp);
  494.     }
  495. }
  496.