Annotation of mstools/samples/ntfonts/allfont.c, revision 1.1.1.1

1.1       root        1: /**************************************************************************\
                      2: *  allfont.c -- module to display the result of enumerating all fonts.
                      3: *   Includes the window procedure and an initialization routine.
                      4: *
                      5: *  There are actually two windows serviced by this module.  One for the
                      6: *   display fonts, one for the printer fonts.
                      7: *
                      8: *
                      9: *  Data structure:
                     10: *   Since we keep a modest amount of data for each possible font, and
                     11: *   since the amount of this information is known only at run time,
                     12: *   the main data structure used here is all allocated dynamically.
                     13: *   parFonts points to an array of ARFONT structures.  These structures
                     14: *   store two int's and then three pointers to arrays of LOGFONT,
                     15: *   TEXTMETRIC, and int's respectively.
                     16: *
                     17: *   parFonts--> |--------------------|  |--------------------|
                     18: *               |  nFonts (Family0)  |  |  nFonts (Family1)  |
                     19: *               |       cySpace      |  |       cySpace      | ...
                     20: *               |        hdc         |  |        hdc         |
                     21: *               |--------------------|  |--------------------|
                     22: *               | lf  |  tm |  Type  |  | lf  |  tm |  Type  |
                     23: *               |--------------------|  |--------------------|
                     24: *                 |       |       |       |       |       |
                     25: *                 |       |       |       |       |       |
                     26: *                 V       V       V       V       V       V
                     27: *               |----| |------| |----|  |----| |------| |----|
                     28: *               |LOG | |TEXT  | |Type|  |LOG | |TEXT  | |Type|
                     29: *               |FONT| |METRIC| |    |  |FONT| |METRIC| |    |
                     30: *               |0,0 | |0,0   | |0,0 |  |1,0 | |1,0   | |1,0 |
                     31: *               |----| |------| |----|  |----| |------| |----|
                     32: *               |LOG | |TEXT  | |Type|  |LOG | |TEXT  | |Type|
                     33: *               |FONT| |METRIC| |    |  |FONT| |METRIC| |    |
                     34: *               |0,1 | |0,1   | |0,1 |  |1,1 | |1,1   | |1,1 |
                     35: *               |----| |------| |----|  |----| |------| |----|
                     36: *
                     37: *                ...    ...      ...     ...    ...      ...
                     38: *
                     39: *               |----| |------| |----|
                     40: *               |LOG | |TEXT  | |Type|
                     41: *               |FONT| |METRIC| |    |  |----| |------| |----|
                     42: *               |0,  | |0,    | |0,  |  |LOG | |TEXT  | |Type|
                     43: *               |nFon| |nFonts| |nFon|  |FONT| |METRIC| |    |
                     44: *               |----| |------| |----|  |1,  | |1,    | |1,  |
                     45: *                                       |nFon| |nFonts| |nFon|
                     46: *                                       |----| |------| |----|
                     47: *
                     48: *
                     49: *   So, to get the FontType of the 4th font within the 2nd family use:
                     50: *    parFonts[1].Type[3]
                     51: *
                     52: *   There is one final ARFONT structure which has no linked lists atttached,
                     53: *    but has a blank HDC as padding on the far right of the window.
                     54: *
                     55: *   The pointer to the array of ARFONT structures is stored in the
                     56: *    GWL_PARFONTS extra bytes for each window.  The number of face names
                     57: *    for each window is stored in the GWLU_NFACES extra bytes.
                     58: *
                     59: \**************************************************************************/
                     60: 
                     61: #include <windows.h>
                     62: #include <string.h>
                     63: #include "ntfonts.h"
                     64: 
                     65: 
                     66: typedef struct tagArFonts{
                     67:   int        nFonts;
                     68:   int        cySpace;
                     69:   HDC        hdc;
                     70:   LOGFONT    *lf;
                     71:   TEXTMETRIC *tm;
                     72:   int        *Type;
                     73: } ARFONTS, *PARFONTS;
                     74: 
                     75: 
                     76: #define ALLFONTBORDER  10
                     77: #define CXDEF         130
                     78: #define BMSIZE         14
                     79: 
                     80: 
                     81: /* user defined create messsage, sent to window once CreateWindow() returns */
                     82: #define WMU_CREATE  WM_USER + 10
                     83: 
                     84: #define GWLU_PARFONTS 0
                     85: #define GWLU_NFACES   4
                     86: 
                     87: /* forward declare function prototypes. */
                     88: HDC      GetPrinterDC (VOID);
                     89: VOID     DrawBitmapXY (HDC, HBITMAP, int, int);
                     90: 
                     91: PARFONTS BuildFontList(HDC, LPINT);
                     92: VOID     BuildBitmapStrips (HWND, LPRECT, PARFONTS, int);
                     93: 
                     94: int APIENTRY MyEnumFaces(LPLOGFONT, LPTEXTMETRIC, DWORD, LPVOID);
                     95: int APIENTRY MyEnumCopy (LPLOGFONT, LPTEXTMETRIC, DWORD, LPVOID);
                     96: int APIENTRY MyEnumCount(LPLOGFONT, LPTEXTMETRIC, DWORD, LPINT);
                     97: 
                     98: 
                     99: 
                    100: int initAllFont(HWND hwndMain)
                    101: {
                    102: WNDCLASS  wc;
                    103: HDC       hdc;
                    104: 
                    105:   wc.style = NULL;
                    106:   wc.lpfnWndProc = (WNDPROC)AllFontsWndProc;
                    107:   wc.cbClsExtra = 0;
                    108:   wc.cbWndExtra = 8;
                    109:   wc.hInstance = hInst;
                    110:   wc.hIcon = NULL;
                    111:   wc.hCursor = LoadCursor(NULL, IDC_CROSS);
                    112:   wc.hbrBackground = GetStockObject(WHITE_BRUSH);
                    113:   wc.lpszMenuName = NULL;
                    114:   wc.lpszClassName = "AllFonts";
                    115: 
                    116:   if (!RegisterClass(&wc)) return (FALSE);
                    117: 
                    118: 
                    119:   /* create a window to show all of the display fonts, and send it
                    120:    *  the proper WMU_CREATE message with an HDC for the display.
                    121:    */
                    122:   hwndDisplayFonts = CreateWindow(
                    123:       "AllFonts",
                    124:       NULL,
                    125:       WS_CHILD | WS_CLIPSIBLINGS | WS_HSCROLL,
                    126:       0,0,
                    127:       GetSystemMetrics (SM_CXFULLSCREEN),
                    128:       GetSystemMetrics (SM_CYFULLSCREEN),
                    129:       hwndMain, NULL, hInst, NULL);
                    130: 
                    131:   hdc = GetDC (hwndDisplayFonts);
                    132:   SendMessage (hwndDisplayFonts, WMU_CREATE, (DWORD)hdc, 0);
                    133:   ReleaseDC (hwndDisplayFonts, hdc);
                    134: 
                    135:   if (!hwndDisplayFonts) return (FALSE);
                    136: 
                    137: 
                    138:   /* create a window to show all of the printer fonts, and send it
                    139:    *  the proper WMU_CREATE message with an HDC for the printer.
                    140:    */
                    141:   hwndPrinterFonts = CreateWindow(
                    142:       "AllFonts",
                    143:       NULL,
                    144:       WS_CHILD | WS_CLIPSIBLINGS | WS_HSCROLL,
                    145:       0,0,
                    146:       GetSystemMetrics (SM_CXFULLSCREEN),
                    147:       GetSystemMetrics (SM_CYFULLSCREEN),
                    148:       hwndMain, NULL, hInst, NULL);
                    149: 
                    150:   hdc = GetPrinterDC ();
                    151:   SendMessage (hwndPrinterFonts, WMU_CREATE, (DWORD)hdc, 0);
                    152:   DeleteDC (hdc);
                    153: 
                    154:   if (!hwndPrinterFonts) return (FALSE);
                    155: 
                    156:   return TRUE;
                    157: }
                    158: 
                    159: 
                    160: 
                    161: 
                    162: 
                    163: /**************************************************************************\
                    164: *  function:  GetPrinterDC
                    165: *
                    166: *  input parameters:  none.
                    167: *
                    168: * Simply return an HDC for the default printer as specified in win.ini.
                    169: *  Note that this HDC should be deleted later (DeleteDC).
                    170: \**************************************************************************/
                    171: #define NCHAR MAX_PATH
                    172: 
                    173: HDC GetPrinterDC ()
                    174: {
                    175: char szPrinter[NCHAR];
                    176: 
                    177: char szDevice[NCHAR];
                    178: char szDriver[NCHAR];
                    179: char szOutput[NCHAR];
                    180: 
                    181: DEVMODE DevMode;
                    182: 
                    183:   GetProfileString ("windows", "device", "", szPrinter, NCHAR) ;
                    184: 
                    185:   strcpy (szDevice,strtok (szPrinter, "," ));
                    186:   strcpy (szDriver,strtok (NULL,      ", "));
                    187:   strcpy (szOutput,strtok (NULL,      ", "));
                    188: 
                    189:   return CreateDC (szDriver, szDevice, szOutput, &DevMode);
                    190: }
                    191: 
                    192: 
                    193: 
                    194: 
                    195: /**************************************************************************\
                    196: *
                    197: *  function:  AllFontsWndProc
                    198: *
                    199: *  input parameters:  normal window procedure parameters.
                    200: *
                    201: *  global variables:
                    202: *   hwndMain - Main window.  place to return focus.
                    203: *
                    204: * Create array of structures which contain, among other things, bitmap
                    205: *  strips containing the face names of fonts.  These strips are later
                    206: *  scrolled back and forth as well as selected with the mouse.
                    207: *
                    208: \**************************************************************************/
                    209: LRESULT AllFontsWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    210: {
                    211: RECT rectClient;
                    212: int i,j;
                    213: int thumbpos;
                    214: int nStrips;
                    215: PARFONTS parFonts;
                    216: int nFaces;
                    217: 
                    218:   /* Get the pointer out of the userdata extra bytes.  */
                    219:   parFonts = (PARFONTS) GetWindowLong (hwnd, GWLU_PARFONTS);
                    220:   nFaces   =            GetWindowLong (hwnd, GWLU_NFACES);
                    221: 
                    222: 
                    223:   switch (message) {
                    224: 
                    225: 
                    226:     /**********************************************************************\
                    227:     *  WMU_CREATE
                    228:     *
                    229:     * USER create message (sent after the window is created, before it
                    230:     *  is shown for the first time).  Use this rather than WM_CREATE because
                    231:     *  we want to have control over the message parameters.
                    232:     *
                    233:     * wParam - HDC which we build the font list for.
                    234:     *
                    235:     * First build the 2d variable arrays of fonts (c.f. BuildFontList), then
                    236:     *  create the bitmap strips (stored in HDCs in ARFONT structures),
                    237:     *  Set the parFonts pointer into the extra bytes for use by other messages.
                    238:     \**********************************************************************/
                    239:     case WMU_CREATE: {
                    240:       int rightPos;
                    241:       HDC hdc;
                    242: 
                    243:       hdc = (HDC) wParam;
                    244: 
                    245:       GetClientRect (hwnd, &rectClient);
                    246:       InflateRect (&rectClient, 0, -ALLFONTBORDER);
                    247: 
                    248:       parFonts = BuildFontList (hdc, &nFaces);
                    249: 
                    250:       BuildBitmapStrips (hwnd, &rectClient, parFonts, nFaces);
                    251: 
                    252:       SetWindowLong (hwnd, GWLU_PARFONTS, (LONG) parFonts);
                    253:       SetWindowLong (hwnd, GWLU_NFACES,   nFaces);
                    254: 
                    255:       /* Compute the number of bitmap strips visible in the window.
                    256:        * set the scroll bar range,
                    257:        * or make it invisible if there are not enough fonts to justify.
                    258:        */
                    259:       nStrips = (rectClient.right - rectClient.left) /CXDEF + 1;
                    260:       if (nFaces > nStrips) {
                    261:         rightPos = nFaces - nStrips + 1;
                    262:         SetScrollRange (hwnd, SB_HORZ, 0, rightPos, FALSE);
                    263:       } else {
                    264:         SetScrollRange (hwnd, SB_HORZ, 0, 0, FALSE);
                    265:       }
                    266: 
                    267:     } break;
                    268: 
                    269: 
                    270:     /**********************************************************************\
                    271:     *  WM_DESTROY
                    272:     *
                    273:     * Free up the memory allocated at create time.  Notice that parFonts
                    274:     *  is allocated in BuildFontList, as are its subarrays.
                    275:     \**********************************************************************/
                    276:     case WM_DESTROY:
                    277:       for (i= 0; i<nFaces; i++) {
                    278:         LocalFree ( LocalHandle ((LPSTR)parFonts[i].lf   ));
                    279:         LocalFree ( LocalHandle ((LPSTR)parFonts[i].tm   ));
                    280:         LocalFree ( LocalHandle ((LPSTR)parFonts[i].Type ));
                    281:         DeleteDC (parFonts[i].hdc);
                    282:       }
                    283:       /* also get the final, blank one */
                    284:       DeleteDC (parFonts[nFaces].hdc);
                    285: 
                    286:       LocalFree ( LocalHandle ((LPSTR)parFonts));
                    287:     break;
                    288: 
                    289: 
                    290:     /**********************************************************************\
                    291:     *  WM_HSCROLL
                    292:     *
                    293:     * Slide the contents of the window back and forth.  Notice that the
                    294:     *  scroll bar thumb position is important for painting and hit testing.
                    295:     \**********************************************************************/
                    296:     case WM_HSCROLL:
                    297:       /* compute number of strips for page scrolling. */
                    298:       GetClientRect (hwnd, &rectClient);
                    299:       nStrips = (rectClient.right - rectClient.left) /CXDEF + 1;
                    300: 
                    301:       switch (LOWORD(wParam)){
                    302:         int OldPos, NewPos;
                    303: 
                    304:         case SB_LINEDOWN:
                    305:           OldPos = GetScrollPos (hwnd, SB_HORZ);
                    306:           SetScrollPos (hwnd, SB_HORZ, (OldPos+1), TRUE);
                    307:           NewPos = GetScrollPos (hwnd, SB_HORZ);
                    308:           ScrollWindow (hwnd, (OldPos-NewPos)*CXDEF, 0, NULL, NULL);
                    309:         break;
                    310: 
                    311:         case SB_PAGEDOWN:
                    312:           OldPos = GetScrollPos (hwnd, SB_HORZ);
                    313:           SetScrollPos (hwnd, SB_HORZ, (OldPos+(nStrips-1)), TRUE);
                    314:           NewPos = GetScrollPos (hwnd, SB_HORZ);
                    315:           ScrollWindow (hwnd, (OldPos-NewPos)*CXDEF, 0, NULL, NULL);
                    316:         break;
                    317: 
                    318:         case SB_LINEUP:
                    319:           OldPos = GetScrollPos (hwnd, SB_HORZ);
                    320:           SetScrollPos (hwnd, SB_HORZ, (OldPos-1), TRUE);
                    321:           NewPos = GetScrollPos (hwnd, SB_HORZ);
                    322:           ScrollWindow (hwnd, (OldPos-NewPos)*CXDEF, 0, NULL, NULL);
                    323:         break;
                    324: 
                    325:         case SB_PAGEUP:
                    326:           OldPos = GetScrollPos (hwnd, SB_HORZ);
                    327:           SetScrollPos (hwnd, SB_HORZ, (OldPos-(nStrips-1)), TRUE);
                    328:           NewPos = GetScrollPos (hwnd, SB_HORZ);
                    329:           ScrollWindow (hwnd, (OldPos-NewPos)*CXDEF, 0, NULL, NULL);
                    330:         break;
                    331: 
                    332:         case SB_THUMBPOSITION:
                    333:           OldPos = GetScrollPos (hwnd, SB_HORZ);
                    334:           NewPos = HIWORD (wParam);
                    335:           SetScrollPos (hwnd, SB_HORZ, NewPos, TRUE);
                    336:           ScrollWindow (hwnd, (OldPos-NewPos)*CXDEF, 0, NULL, NULL);
                    337:         break;
                    338: 
                    339:       }
                    340:     break;
                    341: 
                    342: 
                    343: 
                    344:     /**********************************************************************\
                    345:     *  WM_LBUTTONDOWN
                    346:     *
                    347:     * Hittest based on the mouse position.  When finished, hide the window.
                    348:     \**********************************************************************/
                    349:     case WM_LBUTTONDOWN: {
                    350:       POINT mousePt;
                    351: 
                    352:       mousePt.x = LOWORD(lParam);
                    353:       mousePt.y = HIWORD(lParam);
                    354: 
                    355:       mousePt.x -= 0;
                    356:       mousePt.y -= ALLFONTBORDER;
                    357: 
                    358:       i = mousePt.x / CXDEF;
                    359:       i += GetScrollPos (hwnd, SB_HORZ);
                    360:       if (i < 0) i = 0;
                    361:       if (i >= nFaces) i = (nFaces-1);
                    362: 
                    363:       j = mousePt.y / parFonts[i].cySpace;
                    364:       if (j < 0) j = 0;
                    365:       if (j >= parFonts[i].nFonts) j = (parFonts[i].nFonts-1);
                    366: 
                    367:       ShowWindow(hwnd, SW_HIDE);
                    368:       UpdateWindow(hwndMain);
                    369:       flyWinWin(hwndMain,  hwnd, hwndDlgLF, 40);
                    370:       SendMessage (hwndDlgLF, WMU_DEMOTOLF, 0,(LONG) &(parFonts[i].lf[j]));
                    371: 
                    372:       flyWinWin(hwndMain,  hwnd, hwndDlgTM, 40);
                    373:       SendMessage (hwndDlgTM, WMU_DEMOTOTM, 0,(LONG) &(parFonts[i].tm[j]));
                    374:       SetFocus (hwndMain);
                    375: 
                    376:     }break;
                    377: 
                    378: 
                    379:     /**********************************************************************\
                    380:     *  WM_RBUTTONDOWN, WM_CHAR
                    381:     *
                    382:     * Put the window away without changing the LOGFONT or TEXTMETRIC dlgs.
                    383:     \**********************************************************************/
                    384:     case WM_RBUTTONDOWN:
                    385:     case WM_CHAR       :
                    386:       ShowWindow(hwnd, SW_HIDE);
                    387:       SetFocus (hwndMain);
                    388:     break;
                    389: 
                    390: 
                    391:     /**********************************************************************\
                    392:     *  WM_PAINT
                    393:     *
                    394:     * Using the HDCs stored in the parFonts array, blt enough strips of
                    395:     *  font family names to cover the window.
                    396:     \**********************************************************************/
                    397:     case WM_PAINT : {
                    398:       PAINTSTRUCT ps;
                    399:       HDC hdc;
                    400:       int iStrip;
                    401: 
                    402:       GetClientRect (hwnd, &rectClient);
                    403:       hdc = BeginPaint(hwnd, &ps);
                    404: 
                    405: 
                    406:       thumbpos = GetScrollPos (hwnd, SB_HORZ);
                    407: 
                    408:       nStrips = (rectClient.right - rectClient.left) /CXDEF + 1;
                    409: 
                    410:       for (iStrip= 0; iStrip<nStrips; iStrip++)
                    411:           BitBlt (hdc, iStrip*CXDEF,0,
                    412:                   CXDEF,
                    413:                   (rectClient.bottom - rectClient.top),
                    414:                   parFonts[iStrip+thumbpos].hdc, 0,0, SRCCOPY);
                    415: 
                    416: 
                    417:       EndPaint (hwnd, &ps);
                    418:     } break;
                    419: 
                    420: 
                    421:     default:
                    422:       return (DefWindowProc(hwnd, message, wParam, lParam));
                    423:     }
                    424:     return (NULL);
                    425: }
                    426: 
                    427: 
                    428: 
                    429: 
                    430: /**************************************************************************\
                    431: *
                    432: *  function:  DrawBitmapXY()
                    433: *
                    434: *  input parameters:  HDC, HBITMAP,
                    435: *   X, Y - destination position.  (get width and height from hbitmap)
                    436: *
                    437: *  Draw the bitmap into the hdc.  Source rectangle computed to include the
                    438: *   whole bitmap.
                    439: *
                    440: *  global variables: none.
                    441: *
                    442: \**************************************************************************/
                    443: VOID DrawBitmapXY (HDC hdc, HBITMAP hbm, int x, int y)
                    444: {
                    445:     BOOL f;
                    446:     HDC hdcBits;
                    447:     BITMAP bm;
                    448: 
                    449:     hdcBits = CreateCompatibleDC(hdc);
                    450:     GetObject (hbm, sizeof(BITMAP), &bm);
                    451:     SelectObject(hdcBits,hbm);
                    452:     f = BitBlt(hdc,x,y,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
                    453:     DeleteDC(hdcBits);
                    454: }
                    455: 
                    456: 
                    457: 
                    458: 
                    459: 
                    460: 
                    461: 
                    462: /**************************************************************************\
                    463: *  function:  BuildBitmapStrips
                    464: *
                    465: *  input parameters:
                    466: *   hwnd - window this will all be painted on some day, needed for GetDC
                    467: *   lprectClient - Pointer to client window rect, bitmap strips are this high
                    468: *   parFonts - array with all the font information.
                    469: *   nFaces - number of face names (array size of parFonts).
                    470: *
                    471: * Once the fonts have all been queried, create bitmaps and HDCs for them, and
                    472: *  draw the different fonts into the different bitmap strips.
                    473: \**************************************************************************/
                    474: VOID BuildBitmapStrips (HWND hwnd, LPRECT lprectClient,
                    475:                         PARFONTS parFonts, int nFaces)
                    476: {
                    477: int     i,j;
                    478: HFONT   hNewFont;
                    479: HBITMAP hbm;
                    480: HBITMAP hbmtt, hbmdevice;
                    481: RECT    rectClip, rectStrip;
                    482: HDC     hdc;
                    483: int     height;
                    484: int     rightshift;
                    485: 
                    486:   /* load 2 bitmaps used to "tag" true type and printer fonts. */
                    487:   hbmtt =     LoadBitmap (hInst, "bmtt");
                    488:   hbmdevice = LoadBitmap (hInst, "bmdevice");
                    489: 
                    490:   /* establish bounds of vertical strip that all fonts are drawn into. */
                    491:   hdc              = GetDC (hwnd);
                    492:   rectStrip.left   = rectStrip.top =0;
                    493:   rectStrip.right  = CXDEF;
                    494:   rectStrip.bottom = (lprectClient->bottom - lprectClient->top);
                    495: 
                    496: 
                    497:   /* step through all of the face names.  For each one, compute the cySpace-
                    498:    *  i.e. number of pixels per entry.  also create a memory DC that we can
                    499:    *  draw the font into.  This DC provides the STRIP later blt'ed out at
                    500:    *  paint time.
                    501:    */
                    502:   for (i= 0; i<nFaces; i++) {
                    503:     parFonts[i].cySpace = rectStrip.bottom / parFonts[i].nFonts;
                    504:     parFonts[i].hdc     = CreateCompatibleDC (hdc);
                    505: 
                    506:     /* When there is only one font, then make a small bitmap.  If there
                    507:      * is more than one, then make a bitmap the whole height of the window.
                    508:      */
                    509:     height = (parFonts[i].nFonts == 1) ?
                    510:       parFonts[i].lf[0].lfHeight + ALLFONTBORDER :
                    511:       rectStrip.bottom;
                    512:     hbm = CreateCompatibleBitmap (hdc, rectStrip.right,height);
                    513: 
                    514:     SelectObject (parFonts[i].hdc, hbm);
                    515:     FillRect (parFonts[i].hdc, &rectStrip, GetStockObject(WHITE_BRUSH));
                    516:     SelectObject (parFonts[i].hdc, GetStockObject(NULL_BRUSH));
                    517: 
                    518:     /* step through each font for the face name.  Establish a bounding
                    519:      *  rectangle for the name, write the name and mark with bitmaps if apropos
                    520:      */
                    521:     for (j = 0; j<parFonts[i].nFonts; j++) {
                    522:       rectClip.left   = 0;
                    523:       rectClip.right  = rectClip.left + CXDEF - 5;
                    524:       rectClip.top    = j*parFonts[i].cySpace+ALLFONTBORDER;
                    525:       rectClip.bottom = rectClip.top+ parFonts[i].lf[j].lfHeight;
                    526:       rightshift = 0;
                    527: 
                    528: 
                    529:       /* for true type fonts, add special bitmap on left, top */
                    530:       if (!(parFonts[i].Type[j] & RASTER_FONTTYPE)) {
                    531:         DrawBitmapXY (parFonts[i].hdc, hbmtt,rectClip.left,rectClip.top);
                    532:         rightshift = BMSIZE;
                    533:       }
                    534: 
                    535: 
                    536:       /* for printer fonts, add printer bitmap on left, shifted down
                    537:        * for display fonts, create a logical font to draw the face name with.
                    538:        */
                    539:       if (parFonts[i].Type[j] & DEVICE_FONTTYPE) {
                    540:         DrawBitmapXY (parFonts[i].hdc, hbmdevice,rectClip.left,rectClip.top+ BMSIZE);
                    541:         rightshift = BMSIZE;
                    542:         hNewFont = NULL;
                    543:       } else {
                    544:         hNewFont = CreateFontIndirect (&(parFonts[i].lf[j]));
                    545:         SelectObject (parFonts[i].hdc, hNewFont);
                    546:       }
                    547: 
                    548:       /* iff bitmap drawn, shift text over to the right. */
                    549:       rectClip.left+=rightshift;
                    550: 
                    551:       /* draw the face name in the rectangle allotted. */
                    552:       ExtTextOut (parFonts[i].hdc,
                    553:                        rectClip.left, rectClip.top, ETO_CLIPPED,
                    554:                        &rectClip,
                    555:                        parFonts[i].lf[j].lfFaceName,
                    556:                        strlen(parFonts[i].lf[j].lfFaceName),
                    557:                        NULL );
                    558: 
                    559: 
                    560:       DeleteObject (hNewFont);
                    561:     }
                    562:   }
                    563: 
                    564:   /* make one final strip on the far right side as a white space buffer */
                    565:   hbm = CreateCompatibleBitmap (hdc, rectStrip.right, rectStrip.bottom);
                    566:   SelectObject (parFonts[nFaces].hdc, hbm);
                    567:   FillRect (parFonts[nFaces].hdc, &rectStrip, GetStockObject(WHITE_BRUSH));
                    568: 
                    569:   ReleaseDC (hwnd, hdc);
                    570:   DeleteObject (hbmtt);
                    571:   DeleteObject (hbmdevice);
                    572: }
                    573: 
                    574: 
                    575: 
                    576: 
                    577: 
                    578: /* In the callback functions from the enumerations, there is a limited
                    579:  *  ability to pass in parameters.  For that reason, declare the following
                    580:  *  global variables to be used by any of the call back functions.
                    581:  */
                    582: HDC      hdcGlobal;
                    583: PARFONTS parFontsGlobal;
                    584: int      iFace,jFont;
                    585: int      nFaces;
                    586: 
                    587: /* General call structure:
                    588:  *
                    589:  *  BuildFontList()
                    590:  *      EnumFonts
                    591:  *          MyEnumCount()
                    592:  *      LocalAlloc
                    593:  *      EnumFonts
                    594:  *          MyEnumFaces()
                    595:  *              EnumFonts
                    596:  *                  MyEnumCount()
                    597:  *              LocalAlloc
                    598:  *              LocalAlloc
                    599:  *              LocalAlloc
                    600:  *              EnumFonts
                    601:  *                  MyEnumCopy()
                    602:  */
                    603: 
                    604: 
                    605: 
                    606: /**************************************************************************\
                    607: *  function:  BuildFontList
                    608: *
                    609: *  input parameters:
                    610: *   hdcIn - hdc to query the fonts for.
                    611: *   retnFaces - (OUT) pointer to nFaces value
                    612: *
                    613: * Enumerate all of the fonts for this DC allocating and filling up the
                    614: *  parFonts structure as needed.
                    615: \**************************************************************************/
                    616: PARFONTS BuildFontList(HDC hdcIn, LPINT retnFaces)
                    617: {
                    618: 
                    619:   nFaces = 0;
                    620: 
                    621:   /* hdcGlobal is global variable also used by the callback functions. */
                    622:   hdcGlobal = hdcIn;
                    623: 
                    624:   /* count the total number of face names. */
                    625:   EnumFonts (hdcGlobal, NULL, (FONTENUMPROC)MyEnumCount, (LPARAM)&nFaces);
                    626: 
                    627: 
                    628:   /* allocate the pointer to the array of PArFont structures. */
                    629:   parFontsGlobal = (PARFONTS)LocalAlloc (LPTR, sizeof(ARFONTS) * (nFaces+1));
                    630: 
                    631:   /* step through all fonts again.  For each one fill a LOGFONT and
                    632:    * a TEXTMETRIC stucture.
                    633:    */
                    634:   iFace = 0;
                    635:   EnumFonts (hdcGlobal, NULL, (FONTENUMPROC)MyEnumFaces, (LPARAM)NULL);
                    636: 
                    637:   *retnFaces = nFaces;
                    638:   return parFontsGlobal;
                    639: }
                    640: 
                    641: 
                    642: 
                    643: 
                    644: 
                    645: 
                    646: 
                    647: /**************************************************************************\
                    648: *  function:  MyEnumFaces
                    649: *
                    650: *  input parameters:  c.f. EnumFonts
                    651: *
                    652: * Count the number of fonts for this particular face name.  Allocate the
                    653: *  LOGFONT and TEXTMETRIC arrays large enough to hold all of them.  Then
                    654: *  enumerate the fonts once again to fill in these arrays.
                    655: \**************************************************************************/
                    656: int APIENTRY MyEnumFaces(
                    657:        LPLOGFONT  lpLogFont,
                    658:        LPTEXTMETRIC lpTEXTMETRICs,
                    659:        DWORD  fFontType,
                    660:        LPVOID  lpData)
                    661: {
                    662: int nFonts;
                    663: 
                    664: 
                    665:   UNREFERENCED_PARAMETER (lpTEXTMETRICs);
                    666:   UNREFERENCED_PARAMETER (fFontType);
                    667:   UNREFERENCED_PARAMETER (lpData);
                    668: 
                    669: 
                    670:   nFonts = 0;
                    671:   EnumFonts (hdcGlobal, lpLogFont->lfFaceName, (FONTENUMPROC)MyEnumCount, (LPARAM)&nFonts);
                    672: 
                    673: 
                    674:   parFontsGlobal[iFace].lf   = (LPLOGFONT)LocalAlloc (LPTR, sizeof(LOGFONT)    * nFonts);
                    675:   parFontsGlobal[iFace].tm   = (LPTEXTMETRIC)LocalAlloc (LPTR, sizeof(TEXTMETRIC) * nFonts);
                    676:   parFontsGlobal[iFace].Type = (LPINT)LocalAlloc (LPTR, sizeof(int)        * nFonts);
                    677: 
                    678:   if ((parFontsGlobal[iFace].lf   == NULL) ||
                    679:       (parFontsGlobal[iFace].tm   == NULL) ||
                    680:       (parFontsGlobal[iFace].Type == NULL)) {
                    681:     MessageBox (hwndMain, "alloc failed", "HEY!", MB_ICONSTOP | MB_OK);
                    682:     return FALSE;
                    683:   }
                    684: 
                    685:   parFontsGlobal[iFace].nFonts = nFonts;
                    686: 
                    687:   jFont = 0;
                    688:   EnumFonts (hdcGlobal, lpLogFont->lfFaceName, (FONTENUMPROC)MyEnumCopy, (LPARAM)NULL);
                    689: 
                    690:   iFace++;
                    691: 
                    692:   return TRUE;
                    693: }
                    694: 
                    695: 
                    696: 
                    697: /**************************************************************************\
                    698: *  function:  MyEnumCopy
                    699: *
                    700: *  input parameters:  c.f. EnumFonts
                    701: *
                    702: * Each time that this function is called, copy the LOGFONT and TEXTMETRIC
                    703: *  structures into the proper place in the global arrays.  Incr jFont.
                    704: \**************************************************************************/
                    705: int APIENTRY MyEnumCopy(
                    706:        LPLOGFONT  lpLogFont,
                    707:        LPTEXTMETRIC lpTEXTMETRICs,
                    708:        DWORD  fFontType,
                    709:        LPVOID  lpData)
                    710: {
                    711: LOGFONT    *lplf;
                    712: TEXTMETRIC *lptm;
                    713: int        *pType;
                    714: 
                    715:   UNREFERENCED_PARAMETER (lpData);
                    716: 
                    717:   lplf  = parFontsGlobal[iFace].lf;
                    718:   lptm  = parFontsGlobal[iFace].tm;
                    719:   pType = parFontsGlobal[iFace].Type;
                    720: 
                    721:   lplf[jFont]  = *lpLogFont;
                    722:   lptm[jFont]  = *lpTEXTMETRICs;
                    723:   pType[jFont] = fFontType;
                    724: 
                    725:   jFont++;
                    726:   return TRUE;
                    727: }
                    728: 
                    729: 
                    730: 
                    731: /**************************************************************************\
                    732: *  function:  MyEnumCount
                    733: *
                    734: *  input parameters:  c.f. EnumFonts
                    735: *
                    736: * Simply increment the variable that lpData points to.
                    737: \**************************************************************************/
                    738: int APIENTRY MyEnumCount(
                    739:        LPLOGFONT  lpLogFont,
                    740:        LPTEXTMETRIC lpTEXTMETRICs,
                    741:        DWORD  fFontType,
                    742:        LPINT  lpData)
                    743: {
                    744:     UNREFERENCED_PARAMETER (lpLogFont);
                    745:     UNREFERENCED_PARAMETER (lpTEXTMETRICs);
                    746:     UNREFERENCED_PARAMETER (fFontType);
                    747: 
                    748:     (*lpData)++;
                    749:     return TRUE;
                    750: }

unix.superglobalmegacorp.com

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