Annotation of mstools/samples/printer/paint.c, revision 1.1

1.1     ! root        1: /******************************************************************************\
        !             2: *
        !             3: *  MODULE:      PAINT.C
        !             4: *
        !             5: *  PURPOSE:     Given an HDC and a pointer to a bounding rectangle
        !             6: *               draw all graphics/fonts based on the flags set in
        !             7: *               the dwGraphicsOptions global variable.
        !             8: *
        !             9: *  FUNTIONS:    Paint              - main painting routine
        !            10: *               GetFirstGraphicSlot- computes bounding rect of 1st
        !            11: *                                      graphic
        !            12: *               GetNextGraphicSlot - computes bounding rect of next
        !            13: *                                      graphic
        !            14: *               DrawFonts          - draws enumerated fonts
        !            15: *               BuildFontList      - builds a list of fonts of fonts
        !            16: *                                      supported by a given DC
        !            17: *               MyEnumFaces        - enumerates the font facenames
        !            18: *                                      supported by a given DC
        !            19: *               MyEnumCopy         - copies LOGFONT & TEXTMETRIC info
        !            20: *                                      to a global variable
        !            21: *               MyEnumCount        - counts total number of fonts
        !            22: *                                      supported by a given DC
        !            23: *               FreeFontList       - frees a (BuildFontList-) font list
        !            24: *
        !            25: *  COMMENTS:    Most of the font-enumeration code "lifted" from NTF.EXE
        !            26: *               sample. For more complete documentation have a look a
        !            27: *               that.
        !            28: *
        !            29: *
        !            30: *                           Microsoft Developer Support
        !            31: *                     Copyright (c) 1992 Microsoft Corporation
        !            32: *
        !            33: \******************************************************************************/
        !            34: 
        !            35: #include <windows.h>
        !            36: #include <string.h>
        !            37: #include "common.h"
        !            38: #include "paint.h"
        !            39: 
        !            40: 
        !            41: 
        !            42: /******************************************************************************\
        !            43: *
        !            44: *  FUNCTION:    Paint
        !            45: *
        !            46: *  INPUTS:      hdc    - device context to paint
        !            47: *               lpRect - bounding rectangle of device to paint
        !            48: *
        !            49: *  RETURNS:     TRUE if painting went ok, or
        !            50: *               FALSE if error while painting
        !            51: *
        !            52: \******************************************************************************/
        !            53: 
        !            54: BOOL Paint (HDC hdc, LPRECT lpRect)
        !            55: {
        !            56:   RECT  rect;
        !            57:   HPEN  hpenSave;
        !            58:   RECTI ri;
        !            59: 
        !            60:   if (gdwGraphicsOptions & DRAWAXIS)
        !            61:   {
        !            62: 
        !            63:     //
        !            64:     // draw axis
        !            65:     //
        !            66: 
        !            67:     rect = *lpRect;
        !            68: 
        !            69:     hpenSave = SelectObject (hdc, GetStockObject (BLACK_PEN));
        !            70: 
        !            71:     //
        !            72:     // if giMapMode == MM_TEXT, MM_ANISOTROPIC then (0,0) is upper left corner
        !            73:     //
        !            74: 
        !            75:     if (giMapMode == MM_TEXT || giMapMode == MM_ANISOTROPIC)
        !            76:     {
        !            77:       MoveToEx (hdc, rect.left - glcyMenu/2, rect.bottom, NULL);
        !            78:       LineTo   (hdc, rect.left,  rect.bottom + glcyMenu/2);
        !            79:       LineTo   (hdc, rect.left + glcyMenu/2,  rect.bottom);
        !            80: 
        !            81:       MoveToEx (hdc, rect.left,  rect.bottom + glcyMenu/2, NULL);
        !            82:       LineTo   (hdc, rect.left,  rect.top);
        !            83:       LineTo   (hdc, rect.right + glcyMenu/2, rect.top);
        !            84: 
        !            85:       MoveToEx (hdc, rect.right, rect.top - glcyMenu/2, NULL);
        !            86:       LineTo   (hdc, rect.right + glcyMenu/2,  rect.top);
        !            87:       LineTo   (hdc, rect.right,  rect.top + glcyMenu/2);
        !            88:     }
        !            89: 
        !            90:     //
        !            91:     // else (0,0) is lower left corner
        !            92:     //
        !            93: 
        !            94:     else
        !            95:     {
        !            96:       MoveToEx (hdc, rect.left - glcyMenu/2, rect.bottom, NULL);
        !            97:       LineTo   (hdc, rect.left,  rect.bottom + glcyMenu/2);
        !            98:       LineTo   (hdc, rect.left + glcyMenu/2,  rect.bottom);
        !            99: 
        !           100:       MoveToEx (hdc, rect.left,  rect.bottom + glcyMenu/2, NULL);
        !           101:       LineTo   (hdc, rect.left,  rect.top);
        !           102:       LineTo   (hdc, rect.right + glcyMenu/2, rect.top);
        !           103: 
        !           104:       MoveToEx (hdc, rect.right, rect.top + glcyMenu/2, NULL);
        !           105:       LineTo   (hdc, rect.right + glcyMenu/2, rect.top);
        !           106:       LineTo   (hdc, rect.right, rect.top - glcyMenu/2);
        !           107:     }
        !           108:   }
        !           109: 
        !           110:   SelectObject (hdc, hpenSave);
        !           111: 
        !           112:   //
        !           113:   // look at bits in gdwGraphicsOptions & determine which graphics to draw
        !           114:   //
        !           115: 
        !           116:   if (gdwGraphicsOptions & ENUMFONTS)
        !           117:   {
        !           118:     DrawFonts (hdc, lpRect);
        !           119:     return TRUE;
        !           120:   }
        !           121: 
        !           122:   giDeltaX = (int) ((lpRect->right - BORDER) / NUM_GRAPHICS_XSLOTS);
        !           123:   giDeltaY = (int) ((lpRect->bottom - lpRect->top - BORDER)
        !           124:                                              / NUM_GRAPHICS_YSLOTS);
        !           125: 
        !           126:   GetFirstGraphicSlot (lpRect, &ri);
        !           127: 
        !           128:   if (gdwGraphicsOptions & ARC)
        !           129:   {
        !           130:     Arc (hdc, ri.left, ri.top, ri.right, ri.bottom,
        !           131:               ri.left, ri.top, ri.right-10, ri.bottom-10);
        !           132:     GetNextGraphicSlot (&ri);
        !           133:   }
        !           134: 
        !           135:   if (gdwGraphicsOptions & ELLIPSE)
        !           136:   {
        !           137:     Ellipse (hdc, ri.left, ri.top, ri.right, ri.bottom);
        !           138:     GetNextGraphicSlot (&ri);
        !           139:   }
        !           140: 
        !           141:   if (gdwGraphicsOptions & LINETO)
        !           142:   {
        !           143:     int i;
        !           144: 
        !           145:     for (i = PS_SOLID; i <= PS_DASHDOTDOT; i++)
        !           146:     {
        !           147:       MoveToEx (hdc, ri.left, ri.top + (i+1)*giDeltaY/7, NULL);
        !           148:       LineTo   (hdc, ri.right, ri.top + (i+1)*giDeltaY/7);
        !           149:     }
        !           150:     GetNextGraphicSlot (&ri);
        !           151:   }
        !           152: 
        !           153:   if (gdwGraphicsOptions & PIE)
        !           154:   {
        !           155:     Pie (hdc, ri.left, ri.top, ri.right, ri.bottom,
        !           156:               ri.left, ri.top, ri.right-10, ri.bottom-10);
        !           157:     GetNextGraphicSlot (&ri);
        !           158:   }
        !           159: 
        !           160:   if (gdwGraphicsOptions & PLG_BLT)
        !           161:   {
        !           162:     HBITMAP hbm;
        !           163:     BITMAP  bm;
        !           164:     HDC     hdcMem;
        !           165:     POINT   ap[3];
        !           166: 
        !           167:     hbm = LoadBitmap (ghInst, "printer");
        !           168:     hdcMem = CreateCompatibleDC (hdc);
        !           169:     SelectObject (hdcMem, hbm);
        !           170: 
        !           171:     GetObject (hbm, sizeof(BITMAP), (LPSTR)&bm);
        !           172: 
        !           173:     //
        !           174:     // special case here because PlgBlt requires coordinates
        !           175:     //   of upper left, upper right, & lower left
        !           176:     //
        !           177: 
        !           178:     ap[0].x = (LONG) (ri.left + (ri.right - ri.left)/4);
        !           179:     ap[0].y = (LONG) (ri.top + (ri.bottom - ri.top)/4);
        !           180:     ap[1].x = (LONG) ri.right;
        !           181:     ap[1].y = (LONG) ri.top;
        !           182:     ap[2].x = (LONG) ri.left;
        !           183:     ap[2].y = (LONG) ri.bottom;
        !           184: 
        !           185:     PlgBlt (hdc, ap, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, NULL, 0, 0);
        !           186: 
        !           187:     DeleteDC(hdcMem);
        !           188:     GetNextGraphicSlot (&ri);
        !           189: 
        !           190:   }
        !           191: 
        !           192:   if (gdwGraphicsOptions & POLYBEZIER)
        !           193:   {
        !           194:     POINT ap[4];
        !           195: 
        !           196:     ap[0].x  = (LONG) ri.left;    ap[0].y = (LONG) ri.top;
        !           197:     ap[1].x  = (LONG) ri.left;    ap[1].y = (LONG) ri.bottom;
        !           198:     ap[2].x  = (LONG) ri.right;   ap[2].y = (LONG) ri.top;
        !           199:     ap[3].x  = (LONG) ri.right;   ap[3].y = (LONG) ri.bottom;
        !           200: 
        !           201:     PolyBezier (hdc, ap, 4);
        !           202:     GetNextGraphicSlot (&ri);
        !           203:   }
        !           204: 
        !           205:   if (gdwGraphicsOptions & POLYGON)
        !           206:   {
        !           207:     POINT ap[5];
        !           208: 
        !           209:     ap[0].x  = (LONG) ri.left;    ap[0].y = (LONG) ri.top;
        !           210:     ap[1].x  = (LONG) ri.right;   ap[1].y = (LONG) ri.bottom;
        !           211:     ap[2].x  = (LONG) ri.right;   ap[2].y = (LONG) ri.top;
        !           212:     ap[3].x  = (LONG) ri.left;    ap[3].y = (LONG) ri.bottom;
        !           213:     ap[4].x  = (LONG) ri.left;    ap[4].y = (LONG) ri.top;
        !           214: 
        !           215:     Polygon (hdc, ap, 4);
        !           216:     GetNextGraphicSlot (&ri);
        !           217:   }
        !           218: 
        !           219:   if (gdwGraphicsOptions & POLYLINE)
        !           220:   {
        !           221:     POINT ap[4];
        !           222: 
        !           223:     ap[0].x  = (LONG) ri.left;    ap[0].y = (LONG) ri.top;
        !           224:     ap[1].x  = (LONG) ri.left;    ap[1].y = (LONG) ri.bottom;
        !           225:     ap[2].x  = (LONG) ri.right;   ap[2].y = (LONG) ri.top;
        !           226:     ap[3].x  = (LONG) ri.right;   ap[3].y = (LONG) ri.bottom;
        !           227: 
        !           228:     Polyline (hdc, ap, 4);
        !           229:     GetNextGraphicSlot (&ri);
        !           230:   }
        !           231: 
        !           232:   if (gdwGraphicsOptions & POLYPOLYGON)
        !           233:   {
        !           234:     POINT ap[8];
        !           235:     int ai[2] = { 4, 4 };
        !           236: 
        !           237:     ap[0].x = (LONG)  ri.left;
        !           238:     ap[0].y = (LONG)  ri.top;
        !           239:     ap[1].x = (LONG) (ri.left + giDeltaX/4);
        !           240:     ap[1].y = (LONG)  ri.top;
        !           241:     ap[2].x = (LONG) (ri.left + giDeltaX/4);
        !           242:     ap[2].y = (LONG) (ri.top  + giDeltaY/4);
        !           243:     ap[3].x = (LONG)  ri.left;
        !           244:     ap[3].y = (LONG) (ri.top  + giDeltaY/4);
        !           245:     ap[4].x = (LONG) (ri.right  - 2*giDeltaX/3);
        !           246:     ap[4].y = (LONG) (ri.bottom - 2*giDeltaY/3);
        !           247:     ap[5].x = (LONG)  ri.right;
        !           248:     ap[5].y = (LONG) (ri.bottom - 2*giDeltaY/3);
        !           249:     ap[6].x = (LONG)  ri.right;
        !           250:     ap[6].y = (LONG)  ri.bottom;
        !           251:     ap[7].x = (LONG) (ri.right  - 2*giDeltaX/3);
        !           252:     ap[7].y = (LONG)  ri.bottom;
        !           253: 
        !           254:     PolyPolygon (hdc, ap, ai, 2);
        !           255:     GetNextGraphicSlot (&ri);
        !           256:   }
        !           257: 
        !           258:   if (gdwGraphicsOptions & RECTANGLE)
        !           259:   {
        !           260:     Rectangle (hdc, ri.left, ri.top, ri.right, ri.bottom);
        !           261:     GetNextGraphicSlot (&ri);
        !           262:   }
        !           263: 
        !           264:   if (gdwGraphicsOptions & ROUNDRECT)
        !           265:   {
        !           266:     RoundRect (hdc, ri.left, ri.top, ri.right, ri.bottom, 15, 25);
        !           267:     GetNextGraphicSlot (&ri);
        !           268:   }
        !           269: 
        !           270:   if (gdwGraphicsOptions & STRETCH_BLT)
        !           271:   {
        !           272:     HBITMAP hbm;
        !           273:     BITMAP  bm;
        !           274:     HDC     hdcMem;
        !           275: 
        !           276:     hbm = LoadBitmap (ghInst, "printer");
        !           277:     hdcMem = CreateCompatibleDC (hdc);
        !           278:     SelectObject (hdcMem, hbm);
        !           279: 
        !           280:     GetObject (hbm, sizeof(BITMAP), (LPSTR)&bm);
        !           281: 
        !           282:     StretchBlt (hdc, ri.left, ri.top, ri.right-ri.left,
        !           283:                 ri.bottom - ri.top, hdcMem, 0, 0,
        !           284:                 bm.bmWidth, bm.bmHeight, SRCCOPY);
        !           285: 
        !           286:     DeleteDC(hdcMem);
        !           287:     GetNextGraphicSlot (&ri);
        !           288: 
        !           289:   }
        !           290: 
        !           291:   return TRUE;
        !           292: }
        !           293: 
        !           294: 
        !           295: 
        !           296: /******************************************************************************\
        !           297: *
        !           298: *  FUNCTION:    GetFirstGraphicSlot
        !           299: *
        !           300: *  INPUTS:      pri - pointer to a RECTI
        !           301: *
        !           302: \******************************************************************************/
        !           303: 
        !           304: void GetFirstGraphicSlot (LPRECT lpRect, PRECTI pri)
        !           305: {
        !           306:   pri->left   = BORDER;
        !           307:   pri->top    = lpRect->top + BORDER;
        !           308:   pri->right  = giDeltaX;
        !           309:   pri->bottom = giDeltaY;
        !           310: 
        !           311:   giColumn = 1;
        !           312: }
        !           313: 
        !           314: 
        !           315: 
        !           316: /******************************************************************************\
        !           317: *
        !           318: *  FUNCTION:    GetNextGraphicSlot
        !           319: *
        !           320: *  INPUTS:      pri - pointer to a RECTI
        !           321: *
        !           322: \******************************************************************************/
        !           323: 
        !           324: void GetNextGraphicSlot (PRECTI pri)
        !           325: {
        !           326:   if (++giColumn <= NUM_GRAPHICS_XSLOTS)
        !           327:   {
        !           328:     pri->left  += giDeltaX;
        !           329:     pri->right += giDeltaX;
        !           330:   }
        !           331:   else
        !           332:   {
        !           333:     giColumn = 1;
        !           334: 
        !           335:     pri->left   =  BORDER;
        !           336:     pri->top    += giDeltaY;
        !           337:     pri->right  =  giDeltaX;
        !           338:     pri->bottom += giDeltaY;
        !           339:   }
        !           340: }
        !           341: 
        !           342: 
        !           343: 
        !           344: /******************************************************************************\
        !           345: *
        !           346: *  FUNCTION:    DrawFonts
        !           347: *
        !           348: *  INPUTS:      hdc   - device context to enumerate from & draw on
        !           349: *               pRect - pointer to bounding rect to draw fonts in
        !           350: *
        !           351: *  LOCAL VARS:  i, j       - loop variables
        !           352: *               xText      - starting x position to draw text
        !           353: *               yText      - starting y position to draw text
        !           354: *               iMaxStrLen - length in pels of string to draw
        !           355: *
        !           356: \******************************************************************************/
        !           357: 
        !           358: void DrawFonts (HDC hdc, LPRECT lpRect)
        !           359: {
        !           360:   int      i, j, xText, yText, iMaxStrLen = 0;
        !           361:   PARFONTS paf;
        !           362: 
        !           363:   paf = BuildFontList (hdc);
        !           364: 
        !           365:   xText = yText = 2;
        !           366: 
        !           367:   //
        !           368:   // set the appropriate text align mode depending on
        !           369:   //   whether we're drawing from top down or bottom up
        !           370:   //
        !           371: 
        !           372:   if (giMapMode == MM_TEXT | giMapMode == MM_ANISOTROPIC)
        !           373: 
        !           374:     SetTextAlign (hdc, TA_TOP);
        !           375: 
        !           376:   else
        !           377: 
        !           378:     SetTextAlign (hdc, TA_BOTTOM);
        !           379: 
        !           380:   for (i = 0; i < nFaces; i++)
        !           381:   {
        !           382:     for (j = 0; j < (paf + i)->nFonts; j++)
        !           383:     {
        !           384:       HFONT      hFont, hSaveFont;
        !           385:       SIZE       size;
        !           386:       POINT      LogPtExtent;
        !           387: 
        !           388:       LogPtExtent.x = lpRect->right;
        !           389:       LogPtExtent.y = lpRect->bottom;
        !           390: 
        !           391:       hFont = CreateFontIndirect ((paf + i)->lf + j);
        !           392: 
        !           393:       hSaveFont = SelectObject (hdc, hFont);
        !           394: 
        !           395:       TextOut (hdc, xText, yText, ((paf + i)->lf + j)->lfFaceName,
        !           396:                strlen(((paf + i)->lf + j)->lfFaceName));
        !           397: 
        !           398:       GetTextExtentPoint (hdc, ((paf + i)->lf + j)->lfFaceName,
        !           399:                           strlen(((paf+i)->lf+j)->lfFaceName),
        !           400:                           &size);
        !           401:       size.cx += 2;
        !           402:       iMaxStrLen = iMaxStrLen > (int)size.cx ? iMaxStrLen: (int) size.cx;
        !           403: 
        !           404:       if (!(i == (nFaces - 1) && j == ((paf + i)->nFonts - 1)))
        !           405:       {
        !           406:         TEXTMETRIC *pNextTM;
        !           407: 
        !           408:         pNextTM = j < ((paf+i)->nFonts-1) ?
        !           409:                           (paf+i)->tm+j+1 : (paf+i+1)->tm;
        !           410: 
        !           411:         //
        !           412:         // add in the height of the face name we just drew
        !           413:         //
        !           414: 
        !           415:         yText += (int) ((paf + i)->tm + j)->tmHeight;
        !           416: 
        !           417:         //
        !           418:         // if the next facename will be drawn outside the bounding rect then
        !           419:         //   start at first line of next column
        !           420:         //
        !           421: 
        !           422:         if (yText + (int) pNextTM->tmHeight > (int) LogPtExtent.y)
        !           423:         {
        !           424:           yText = 2;
        !           425:           xText += iMaxStrLen + 2;
        !           426:           iMaxStrLen = 0;
        !           427:         }
        !           428:       }
        !           429: 
        !           430:       SelectObject (hdc, hSaveFont);
        !           431:       DeleteObject (hFont);
        !           432: 
        !           433:       if (xText > (int) LogPtExtent.x)
        !           434:       {
        !           435:         if (GetDeviceCaps (hdc, TECHNOLOGY) & DT_RASDISPLAY)
        !           436:         {
        !           437:           //
        !           438:           // If we're drawing to the screen & have run out of
        !           439:           //   room then tell user how many fonts there are left
        !           440:           //   (that we haven't displayed)
        !           441:           //
        !           442: 
        !           443:           int   k;
        !           444:           int   iFontsLeft = (paf + i)->nFonts - j - 1;
        !           445:           char  buf[40];
        !           446:           SIZE  size;
        !           447: 
        !           448: 
        !           449:           for (k = i + 1; k < nFaces; k++)
        !           450: 
        !           451:             iFontsLeft += (paf + k)->nFonts;
        !           452: 
        !           453:           wsprintf (buf, "%ld more display fonts (not listed)",
        !           454:                     iFontsLeft);
        !           455: 
        !           456:           GetTextExtentPoint (hdc, buf, strlen(buf), &size);
        !           457: 
        !           458:           if ((xText = lpRect->right - size.cx) < glcyMenu + 1)
        !           459: 
        !           460:             xText = glcyMenu/2 + 1;
        !           461: 
        !           462:           TextOut (hdc, xText, lpRect->bottom, buf, strlen(buf));
        !           463: 
        !           464:           goto done_enumfonts;
        !           465:         }
        !           466: 
        !           467:         else
        !           468:         {
        !           469:           //
        !           470:           // Else we're drawing to a printer & have filled up
        !           471:           //   the first page. If there's any fonts left to draw
        !           472:           //   then start a new page.
        !           473:           //
        !           474: 
        !           475:           if (!(i == nFaces - 1 && j == (paf + i)->nFonts - 1))
        !           476:           {
        !           477:             EndPage   (hdc);
        !           478:             xText = yText = 2;
        !           479:             StartPage (hdc);
        !           480:           }
        !           481:         }
        !           482:       }
        !           483:     }
        !           484:   }
        !           485: 
        !           486: done_enumfonts:
        !           487: 
        !           488:   FreeFontList (paf);
        !           489: }
        !           490: 
        !           491: 
        !           492: 
        !           493: 
        !           494: /*  In the callback functions for the enumerations, there is a limited
        !           495:  *  ability to pass in parameters.  For that reason, declare the following
        !           496:  *  global variables to be used by any of the call back functions.
        !           497:  *
        !           498:  *        HDC      hdcGlobal;
        !           499:  *        PARFONTS parFontsGlobal;
        !           500:  *        int      iFace,jFont;
        !           501:  *        int      nFaces;
        !           502:  *
        !           503:  *
        !           504:  * General call structure:
        !           505:  *
        !           506:  *        BuildFontList
        !           507:  *            EnumFonts
        !           508:  *                MyEnumCount
        !           509:  *            LocalAlloc
        !           510:  *            EnumFonts
        !           511:  *                MyEnumFaces
        !           512:  *                    EnumFonts
        !           513:  *                        MyEnumCount
        !           514:  *                    LocalAlloc
        !           515:  *                    LocalAlloc
        !           516:  *                    LocalAlloc
        !           517:  *                    EnumFonts
        !           518:  *                        MyEnumCopy
        !           519:  */
        !           520: 
        !           521: 
        !           522: 
        !           523: /******************************************************************************\
        !           524: *
        !           525: *  FUNCTION:    BuildFontList
        !           526: *
        !           527: *  GLOBAL VARS: (see above)
        !           528: *
        !           529: \******************************************************************************/
        !           530: 
        !           531: PARFONTS BuildFontList (HDC hdcIn)
        !           532: {
        !           533:   nFaces = 0;
        !           534: 
        !           535:   hdcGlobal = hdcIn;
        !           536: 
        !           537:   //
        !           538:   // count the total number of face names.
        !           539:   //
        !           540: 
        !           541:   EnumFonts (hdcGlobal, NULL, (FONTENUMPROC)MyEnumCount, (LPARAM)&nFaces);
        !           542: 
        !           543:   //
        !           544:   // allocate the pointer to the array of PArFont structures.
        !           545:   //
        !           546: 
        !           547:   parFontsGlobal = (PARFONTS) LocalAlloc (LPTR, sizeof(ARFONTS) * (nFaces+1));
        !           548: 
        !           549:   //
        !           550:   // step through all fonts again.  For each one fill a LOGFONT and
        !           551:   //   a TEXTMETRIC stucture.
        !           552:   //
        !           553: 
        !           554:   iFace = 0;
        !           555:   EnumFonts (hdcGlobal, NULL, (FONTENUMPROC)MyEnumFaces, NULL);
        !           556: 
        !           557:   return parFontsGlobal;
        !           558: }
        !           559: 
        !           560: 
        !           561: 
        !           562: /******************************************************************************\
        !           563: *
        !           564: *  FUNCTION:    MyEnumFaces
        !           565: *
        !           566: *  GLOBAL VARS: (see above)
        !           567: *
        !           568: \******************************************************************************/
        !           569: 
        !           570: int CALLBACK MyEnumFaces (LPLOGFONT lpLogFont, LPTEXTMETRIC lpTEXTMETRICs,
        !           571:                           DWORD fFontType, LPVOID  lpData)
        !           572: {
        !           573:   int nFonts;
        !           574: 
        !           575:   nFonts = 0;
        !           576:   EnumFonts (hdcGlobal, lpLogFont->lfFaceName, (FONTENUMPROC)MyEnumCount,
        !           577:              (LPARAM)&nFonts);
        !           578: 
        !           579:   parFontsGlobal[iFace].lf   = (LOGFONT *)    LocalAlloc (LPTR,
        !           580:                                                           sizeof(LOGFONT) *
        !           581:                                                             nFonts);
        !           582:   parFontsGlobal[iFace].tm   = (TEXTMETRIC *) LocalAlloc (LPTR,
        !           583:                                                           sizeof(TEXTMETRIC) *
        !           584:                                                             nFonts);
        !           585:   parFontsGlobal[iFace].Type = (int *)        LocalAlloc (LPTR,
        !           586:                                                           sizeof(int) *
        !           587:                                                             nFonts);
        !           588: 
        !           589:   if ((parFontsGlobal[iFace].lf   == NULL) ||
        !           590:       (parFontsGlobal[iFace].tm   == NULL) ||
        !           591:       (parFontsGlobal[iFace].Type == NULL))
        !           592:   {
        !           593:     ErrMsgBox ("LocalAlloc failed", ERR_MOD_NAME);
        !           594:     return FALSE;
        !           595:   }
        !           596: 
        !           597:   parFontsGlobal[iFace].nFonts = nFonts;
        !           598: 
        !           599:   jFont = 0;
        !           600:   EnumFonts (hdcGlobal, lpLogFont->lfFaceName, (FONTENUMPROC)MyEnumCopy, NULL);
        !           601: 
        !           602:   iFace++;
        !           603: 
        !           604:   return TRUE;
        !           605: }
        !           606: 
        !           607: 
        !           608: 
        !           609: /******************************************************************************\
        !           610: *
        !           611: *  FUNCTION:    MyEnumCopy
        !           612: *
        !           613: *  GLOBAL VARS: (see above)
        !           614: *
        !           615: \******************************************************************************/
        !           616: 
        !           617: int CALLBACK MyEnumCopy (LPLOGFONT lpLogFont, LPTEXTMETRIC lpTEXTMETRICs,
        !           618:                          DWORD fFontType, LPVOID  lpData)
        !           619: {
        !           620:   LOGFONT    *lplf;
        !           621:   TEXTMETRIC *lptm;
        !           622:   int        *pType;
        !           623: 
        !           624:   lplf  = parFontsGlobal[iFace].lf;
        !           625:   lptm  = parFontsGlobal[iFace].tm;
        !           626:   pType = parFontsGlobal[iFace].Type;
        !           627: 
        !           628:   lplf[jFont]  = *lpLogFont;
        !           629:   lptm[jFont]  = *lpTEXTMETRICs;
        !           630:   pType[jFont] = fFontType;
        !           631: 
        !           632:   jFont++;
        !           633:   return TRUE;
        !           634: }
        !           635: 
        !           636: 
        !           637: 
        !           638: /******************************************************************************\
        !           639: *
        !           640: *  FUNCTION:    MyEnumCount
        !           641: *
        !           642: *  GLOBAL VARS: (see above)
        !           643: *
        !           644: \******************************************************************************/
        !           645: 
        !           646: int CALLBACK MyEnumCount (LPLOGFONT lpLogFont, LPTEXTMETRIC lpTEXTMETRICs,
        !           647:                           DWORD fFontType, LPVOID lpData)
        !           648: {
        !           649:   (*(LPINT)lpData)++;
        !           650:   return TRUE;
        !           651: }
        !           652: 
        !           653: 
        !           654: 
        !           655: /******************************************************************************\
        !           656: *
        !           657: *  FUNCTION:    FreeFontList
        !           658: *
        !           659: *  INPUTS:      paf - pointer to ARFONTS struct to free
        !           660: *
        !           661: \******************************************************************************/
        !           662: 
        !           663: void FreeFontList (PARFONTS paf)
        !           664: {
        !           665:   int i;
        !           666: 
        !           667:   for (i = 0; i < nFaces; i++)
        !           668:   {
        !           669:     LocalFree (LocalHandle ((LPSTR) ((paf + i)->lf  )));
        !           670:     LocalFree (LocalHandle ((LPSTR) ((paf + i)->tm  )));
        !           671:     LocalFree (LocalHandle ((LPSTR) ((paf + i)->Type)));
        !           672:   }
        !           673:   LocalFree (LocalHandle ((LPSTR) paf));
        !           674: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.