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

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1992-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. /**************************************************************************
  11. *  dialogs.c -- module for the two dialogs (LOGFONT & TEXTMETRIC)
  12. *   Includes the window procedure and an initialization routine.
  13. *  the LogFontWndProc is actually used for multiple dialogs.
  14. **************************************************************************/
  15. #include <windows.h>
  16. #include <string.h>
  17. #include <stdio.h>
  18. #include "ttfonts.h"
  19. int initDlg(HWND hwndMain)
  20. {
  21.   /*  load three dialogs and position them. Set the minimize icon for
  22.    *   this CLASS and it affects all dialog windows.
  23.    */
  24.   hwndDlgLF = CreateDialog (hInst, TEXT("logfontDlg"), hwndMain,
  25.                 (DLGPROC)LogFontWndProc);
  26.   if (hwndDlgLF == NULL) return FALSE;
  27.   SetWindowPos (hwndDlgLF, NULL,
  28.                 CHILDLEFT(1), CHILDTOP,
  29.                 0,0, SWP_NOZORDER | SWP_NOSIZE);
  30.   hwndDlgTM = CreateDialog (hInst, TEXT("textmetricDlg"), hwndMain,
  31.                 (DLGPROC)LogFontWndProc);
  32.   if (hwndDlgTM == NULL) return FALSE;
  33.   SetWindowPos (hwndDlgTM, NULL,
  34.                 CHILDLEFT(0), CHILDTOP,
  35.                 0,0, SWP_NOZORDER | SWP_NOSIZE);
  36.   hwndDlgOLTM = CreateDialog (hInst, TEXT("oltextmetricDlg"), hwndMain,
  37.                 (DLGPROC)LogFontWndProc);
  38.   if (hwndDlgOLTM == NULL) return FALSE;
  39.   ShowWindow (hwndDlgOLTM, SW_MINIMIZE);
  40.   hwndDlgFD = CreateDialog (hInst, TEXT("getfontdataDlg"), hwndMain,
  41.                 (DLGPROC)FontDataWndProc);
  42.   if (hwndDlgFD == NULL) return FALSE;
  43.   ShowWindow (hwndDlgFD, SW_MINIMIZE);
  44.   SetWindowPos (hwndDlgFD, HWND_TOP,
  45.                 0, 0,
  46.                 0,0, SWP_NOSIZE );
  47.   SetClassLong (hwndDlgLF, GCL_HICON, (LONG)LoadIcon(hInst, TEXT("ttfontsIcon")));
  48.   return TRUE;
  49. }
  50. /* first and last string IDs from string table in RC file */
  51. #define FIRSTSTRING 1
  52. #define LASTSTRING  20
  53. /**************************************************************************
  54. *
  55. *  function:  FontDataWndProc
  56. *
  57. *  input parameters:  normal window procedure parameters.
  58. *
  59. *  Allow the user to select a table, an offset, and a byte count.
  60. *   on command message, post self a user message (allows the user
  61. *   message to come in from other sources too).  On the user message,
  62. *   just call GetFontData and display the results.
  63. *
  64. *
  65.   // UNICODE NOTICE
  66.   //  Parts of this are held as ANSI because the dwTable
  67.   //  in the fontdata is stored with four 8 bit chars.
  68.   //  And because there is not yet a wide char version of sscanf().
  69. *
  70. *
  71. **************************************************************************/
  72. LRESULT CALLBACK FontDataWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  73. {
  74. #define NCHAR 255
  75. TCHAR buffer[NCHAR];
  76. HDC hdc;
  77. int nBytes, nStrings, i;
  78.   switch (message) {
  79.     /* fill combo box w/ table names, and
  80.      *  entry fields w/ meaningful initial values.
  81.      */
  82.     case WM_INITDIALOG:
  83.       SetDlgItemInt (hwnd, DID_DWOFFSET, 0, TRUE);
  84.       SetDlgItemInt (hwnd, DID_CBDATA, 50, TRUE);
  85.       for (i = FIRSTSTRING; i<= LASTSTRING; i++) {
  86.         LoadString (GetModuleHandle (NULL), i, buffer, NCHAR);
  87.         SendDlgItemMessage (hwnd, DID_DWTABLE, CB_ADDSTRING, 0, (LPARAM)buffer);
  88.       }
  89.     return TRUE;
  90.     /* If the user hits the DOIT button, post message back to the
  91.      *  main window.  It will get an HDC and then post us the proper
  92.      *  user message.
  93.      */
  94.     case WM_COMMAND:
  95.       if (wParam == DID_DOIT)
  96.         PostMessage (hwndMain, WM_COMMAND, TBID_GETFONTDATA, 0);
  97.     break;  /* end WM_COMMAND */
  98.     /**********************************************************************
  99.     *  WMU_GETFONTDATA
  100.     *
  101.     *  lParam - HDC.
  102.     *
  103.     * User message.  Parse the contents of the entry fields, and make the
  104.     *  GetFontData() call.  Put results in the listbox.
  105.     **********************************************************************/
  106.     case WMU_GETFONTDATA: {
  107.         DWORD dwTable, dwOffset, cbData;
  108.         LPBYTE   lpDataBuffer;
  109.         DWORD dwNBytes;
  110.         hdc = (HDC) lParam;
  111.         SendDlgItemMessage (hwnd, DID_LISTBOX, LB_RESETCONTENT, 0, 0);
  112.         {
  113.           // UNICODE NOTICE.  GetDlgItemTextA returns ANSI strings.
  114.           //  we are doing manipulation on a byte by byte basis
  115.           CHAR  fourbytes[5];
  116.           CHAR  sbBuffer[NCHAR];
  117.           nBytes = GetDlgItemTextA (hwnd, DID_DWTABLE, fourbytes, 5);
  118.           if (nBytes == 0) {
  119.             dwTable = 0;
  120.           } else {
  121.             dwTable = (DWORD) ((fourbytes[3] << 24)
  122.                             +  (fourbytes[2] << 16)
  123.                             +  (fourbytes[1] <<  8)
  124.                             +  (fourbytes[0]));
  125.           }
  126.           // UNICODE NOTICE.  GetDlgItemTextA returns ANSI strings.
  127.           //  sscanf expects single byte strings.
  128.           GetDlgItemTextA (hwnd, DID_DWOFFSET, sbBuffer, NCHAR);
  129.           sscanf (sbBuffer, "%x", &dwOffset);
  130.           GetDlgItemTextA (hwnd, DID_CBDATA  , sbBuffer, NCHAR);
  131.           sscanf (sbBuffer, "%x", &cbData);
  132.         }
  133.         lpDataBuffer = (LPBYTE) LocalAlloc (LPTR, cbData);
  134.         if (lpDataBuffer == NULL) {
  135.           MessageBox (NULL, szAllocFailed, szMBERROR, MBERRORFLAGS);
  136.           return 0;
  137.         }
  138.         dwNBytes = GetFontData (hdc, dwTable, dwOffset, (LPVOID) lpDataBuffer, cbData);
  139.         if (dwNBytes == -1) {
  140.           MessageBox (NULL, szFontDataErr, szMBERROR, MBERRORFLAGS);
  141.         } else {
  142.           nStrings = dwNBytes / 16;
  143.           for (i = 0; i< nStrings; i++) {
  144.             wsprintf (buffer,
  145.                       TEXT("%02x%02x %02x%02x  %02x%02x %02x%02x  %02x%02x %02x%02x  %02x%02x %02x%02x"),
  146.                       (int)lpDataBuffer[i*16+0],
  147.                       (int)lpDataBuffer[i*16+1],
  148.                       (int)lpDataBuffer[i*16+2],
  149.                       (int)lpDataBuffer[i*16+3],
  150.                       (int)lpDataBuffer[i*16+4],
  151.                       (int)lpDataBuffer[i*16+5],
  152.                       (int)lpDataBuffer[i*16+6],
  153.                       (int)lpDataBuffer[i*16+7],
  154.                       (int)lpDataBuffer[i*16+8],
  155.                       (int)lpDataBuffer[i*16+9],
  156.                       (int)lpDataBuffer[i*16+10],
  157.                       (int)lpDataBuffer[i*16+11],
  158.                       (int)lpDataBuffer[i*16+12],
  159.                       (int)lpDataBuffer[i*16+13],
  160.                       (int)lpDataBuffer[i*16+14],
  161.                       (int)lpDataBuffer[i*16+15]);
  162.             SendDlgItemMessage (hwnd, DID_LISTBOX, LB_ADDSTRING, 0, (LONG) buffer);
  163.           }
  164.         }
  165.         LocalFree ( LocalHandle ((LPVOID)lpDataBuffer));
  166.     } return TRUE;  /* end WMU_GETFONTDATA */
  167.   } /* end switch */
  168.   return 0;
  169. }
  170. /**************************************************************************
  171. *
  172. *  function:  LogFontWndProc
  173. *
  174. *  input parameters:  normal window procedure parameters.
  175. *  global variables:
  176. *
  177. * This window procedure is used for two completely different dialog boxes.
  178. **************************************************************************/
  179. LRESULT CALLBACK LogFontWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  180. {
  181. static LPLOGFONT    lplf;
  182. static LPTEXTMETRIC lptm;
  183.   switch (message) {
  184.     /**********************************************************************
  185.     *  WMU_DEMOTOLF
  186.     *
  187.     *  lParam - pointer to LOGFONT structure.
  188.     *
  189.     * User message.  Take the input LOGFONT and fill the edit fields of the
  190.     *  dialog box.
  191.     **********************************************************************/
  192.     case WMU_DEMOTOLF: {
  193.       lplf = (LPLOGFONT) lParam;
  194.       SetDlgItemInt (hwnd, DIDHEIGHT , lplf->lfHeight,        TRUE);
  195.       SetDlgItemInt (hwnd, DIDWIDTH  , lplf->lfWidth,         TRUE);
  196.       SetDlgItemInt (hwnd, DIDESCAPE , lplf->lfEscapement,    TRUE);
  197.       SetDlgItemInt (hwnd, DIDORIENT , lplf->lfOrientation,   TRUE);
  198.       SetDlgItemInt (hwnd, DIDWEIGHT , lplf->lfWeight,        TRUE);
  199.       SetDlgItemInt (hwnd, DIDITALIC , lplf->lfItalic,        FALSE);
  200.       SetDlgItemInt (hwnd, DIDUNDERL , lplf->lfUnderline,     FALSE);
  201.       SetDlgItemInt (hwnd, DIDSTRIKE , lplf->lfStrikeOut,     FALSE);
  202.       SetDlgItemInt (hwnd, DIDCHARSE , lplf->lfCharSet,       FALSE);
  203.       SetDlgItemInt (hwnd, DIDOUTPRE , lplf->lfOutPrecision,  FALSE);
  204.       SetDlgItemInt (hwnd, DIDCLIPPR , lplf->lfClipPrecision, FALSE);
  205.       SetDlgItemInt (hwnd, DIDQUALIT , lplf->lfQuality,       FALSE);
  206.       SetDlgItemInt (hwnd, DIDPITCHA , lplf->lfPitchAndFamily,FALSE);
  207.       SetDlgItemText (hwnd, DIDFACENA, lplf->lfFaceName);
  208.     } break;
  209.     /**********************************************************************
  210.     *  WMU_LFTODEMO
  211.     *
  212.     *  lParam - pointer to LOGFONT structure.
  213.     *
  214.     * User message.  Fill the input LOGFONT with the contents of the
  215.     *  edit fields of dialog box.
  216.     **********************************************************************/
  217.     case WMU_LFTODEMO: {
  218.       BOOL  success;
  219.       lplf = (LPLOGFONT) lParam;
  220.       lplf->lfHeight =        GetDlgItemInt (hwnd, DIDHEIGHT, &success , TRUE);
  221.       lplf->lfWidth  =        GetDlgItemInt (hwnd, DIDWIDTH , &success , TRUE);
  222.       lplf->lfEscapement =    GetDlgItemInt (hwnd, DIDESCAPE, &success , TRUE);
  223.       lplf->lfOrientation =   GetDlgItemInt (hwnd, DIDORIENT, &success , TRUE);
  224.       lplf->lfWeight =        GetDlgItemInt (hwnd, DIDWEIGHT, &success , TRUE);
  225.       lplf->lfItalic =        (BYTE) GetDlgItemInt (hwnd, DIDITALIC, &success , FALSE);
  226.       lplf->lfUnderline =     (BYTE) GetDlgItemInt (hwnd, DIDUNDERL, &success , FALSE);
  227.       lplf->lfStrikeOut =     (BYTE) GetDlgItemInt (hwnd, DIDSTRIKE, &success , FALSE);
  228.       lplf->lfCharSet =       (BYTE) GetDlgItemInt (hwnd, DIDCHARSE, &success , FALSE);
  229.       lplf->lfOutPrecision =  (BYTE) GetDlgItemInt (hwnd, DIDOUTPRE, &success , FALSE);
  230.       lplf->lfClipPrecision = (BYTE) GetDlgItemInt (hwnd, DIDCLIPPR, &success , FALSE);
  231.       lplf->lfQuality =       (BYTE) GetDlgItemInt (hwnd, DIDQUALIT, &success , FALSE);
  232.       lplf->lfPitchAndFamily =(BYTE) GetDlgItemInt (hwnd, DIDPITCHA, &success , FALSE);
  233.       GetDlgItemText (hwnd, DIDFACENA, lplf->lfFaceName, LF_FACESIZE);
  234.     } break;
  235.     /**********************************************************************
  236.     *  WMU_DEMOTOTM
  237.     *
  238.     *  lParam - pointer to TEXTMETRIC structure.
  239.     *
  240.     * User message.  Take the input LOGFONT and fill the list box with
  241.     *  strings.  Turn off update before hand, then reenable when complete.
  242.     **********************************************************************/
  243.     case WMU_DEMOTOTM: {
  244.       TCHAR buffer[100];
  245.       lptm = (LPTEXTMETRIC) lParam;
  246.       SendDlgItemMessage (hwnd, DID_LISTBOX, WM_SETREDRAW, FALSE, 0);
  247.       SendDlgItemMessage (hwnd, DID_LISTBOX, LB_RESETCONTENT, 0, 0);
  248. #define LBPUT SendDlgItemMessage (hwnd, DID_LISTBOX, LB_ADDSTRING, 0, (LONG) buffer);
  249.       wsprintf (buffer, TEXT("tmHeight        t%d")  ,(int) lptm->tmHeight           ); LBPUT
  250.       wsprintf (buffer, TEXT("tmAscent        t%d")  ,(int) lptm->tmAscent           ); LBPUT
  251.       wsprintf (buffer, TEXT("tmDescent       t%d")  ,(int) lptm->tmDescent          ); LBPUT
  252.       wsprintf (buffer, TEXT("tmInternalLeadingt%d") ,(int) lptm->tmInternalLeading  ); LBPUT
  253.       wsprintf (buffer, TEXT("tmExternalLeadingt%d") ,(int) lptm->tmExternalLeading  ); LBPUT
  254.       wsprintf (buffer, TEXT("tmAveCharWidth  t%d")  ,(int) lptm->tmAveCharWidth     ); LBPUT
  255.       wsprintf (buffer, TEXT("tmMaxCharWidth  t%d")  ,(int) lptm->tmMaxCharWidth     ); LBPUT
  256.       wsprintf (buffer, TEXT("tmWeight        t%d")  ,(int) lptm->tmWeight           ); LBPUT
  257.       wsprintf (buffer, TEXT("tmOverhang      t%d")  ,(int) lptm->tmOverhang         ); LBPUT
  258.       wsprintf (buffer, TEXT("tmDigitizedAspectXt%d"),(int) lptm->tmDigitizedAspectX ); LBPUT
  259.       wsprintf (buffer, TEXT("tmDigitizedAspectYt%d"),(int) lptm->tmDigitizedAspectY ); LBPUT
  260.       wsprintf (buffer, TEXT("tmItalic        t%d")  ,(int) lptm->tmItalic           ); LBPUT
  261.       wsprintf (buffer, TEXT("tmUnderlined    t%d")  ,(int) lptm->tmUnderlined       ); LBPUT
  262.       wsprintf (buffer, TEXT("tmStruckOut     t%d")  ,(int) lptm->tmStruckOut        ); LBPUT
  263.       wsprintf (buffer, TEXT("tmFirstChar     t%d")  ,(int) lptm->tmFirstChar        ); LBPUT
  264.       wsprintf (buffer, TEXT("tmLastChar      t%d")  ,(int) lptm->tmLastChar         ); LBPUT
  265.       wsprintf (buffer, TEXT("tmDefaultChar   t%d")  ,(int) lptm->tmDefaultChar      ); LBPUT
  266.       wsprintf (buffer, TEXT("tmBreakChar     t%d")  ,(int) lptm->tmBreakChar        ); LBPUT
  267.       wsprintf (buffer, TEXT("tmPitchAndFamilyt%d")  ,(int) lptm->tmPitchAndFamily   ); LBPUT
  268.       wsprintf (buffer, TEXT("tmCharSet       t%d")  ,(int) lptm->tmCharSet          ); LBPUT
  269.       SendDlgItemMessage (hwnd, DID_LISTBOX, WM_SETREDRAW, TRUE, 0);
  270.       InvalidateRect (hwnd, NULL, TRUE);
  271.       UpdateWindow (hwnd);
  272.     } break;
  273.     /**********************************************************************
  274.     *  WMU_DEMOTOOLTM
  275.     *
  276.     *  lParam - HDC.
  277.     *
  278.     * User message.  With the input HDC, allocate space for OUTLINETEXTMETRIC
  279.     *  structure, query it from the HDC, and fill the listbox.  (Allocate the
  280.     *  OUTLINETEXTMETRIC structure dynamically since it is variable size.)
  281.     **********************************************************************/
  282.     case WMU_DEMOTOOLTM: {
  283.       HDC hdc;
  284.       TCHAR buffer[100];
  285.       UINT cbData;
  286.       LPOUTLINETEXTMETRIC lpoltm;
  287.       LPBYTE lptStr;
  288.       hdc = (HDC) lParam;
  289.       /* figure out how large the structure is, alloc, and re-query
  290.        *  unless cbData ==0, then post no-op string and exit.
  291.        */
  292.       cbData = GetOutlineTextMetrics (hdc, 0, NULL);
  293.       if (cbData == 0) {
  294.         SendDlgItemMessage (hwnd, DID_LISTBOX, LB_RESETCONTENT, 0, 0);
  295.         wsprintf (buffer, TEXT("cbData == 0")); LBPUT
  296.         return 0;
  297.       }
  298.       lpoltm = (LPOUTLINETEXTMETRIC)LocalAlloc (LPTR, cbData);
  299.       GetOutlineTextMetrics (hdc, cbData, lpoltm);
  300.       /* freeze redraw of listbox, and clear contents. */
  301.       SendDlgItemMessage (hwnd, DID_LISTBOX, WM_SETREDRAW, FALSE, 0);
  302.       SendDlgItemMessage (hwnd, DID_LISTBOX, LB_RESETCONTENT, 0, 0);
  303.       wsprintf (buffer, TEXT("otmSize                t%d"),(int) lpoltm->otmSize               );            LBPUT
  304.       wsprintf (buffer, TEXT("otmTextMetrics { }"));                                                      LBPUT
  305.       wsprintf (buffer, TEXT("otmFiller              t%d"),(int)(BYTE) lpoltm->otmFiller             );      LBPUT
  306.       wsprintf (buffer, TEXT("otmPanoseNumber           "));                                                  LBPUT
  307. // removed for beta 2.      wsprintf (buffer, TEXT("t ulCulture        t%d"),   (int) lpoltm->otmPanoseNumber.ulCulture        ); LBPUT
  308.       wsprintf (buffer, TEXT("t bFamilyType      t0x%lx"),(int) lpoltm->otmPanoseNumber.bFamilyType      ); LBPUT
  309.       wsprintf (buffer, TEXT("t bSerifStyle      t0x%lx"),(int) lpoltm->otmPanoseNumber.bSerifStyle      ); LBPUT
  310.       wsprintf (buffer, TEXT("t bWeight          t0x%lx"),(int) lpoltm->otmPanoseNumber.bWeight          ); LBPUT
  311.       wsprintf (buffer, TEXT("t bProportion      t0x%lx"),(int) lpoltm->otmPanoseNumber.bProportion      ); LBPUT
  312.       wsprintf (buffer, TEXT("t bContrast        t0x%lx"),(int) lpoltm->otmPanoseNumber.bContrast        ); LBPUT
  313.       wsprintf (buffer, TEXT("t bStrokeVariation t0x%lx"),(int) lpoltm->otmPanoseNumber.bStrokeVariation ); LBPUT
  314.       wsprintf (buffer, TEXT("t bArmStyle        t0x%lx"),(int) lpoltm->otmPanoseNumber.bArmStyle        ); LBPUT
  315.       wsprintf (buffer, TEXT("t bLetterform      t0x%lx"),(int) lpoltm->otmPanoseNumber.bLetterform      ); LBPUT
  316.       wsprintf (buffer, TEXT("t bMidline         t0x%lx"),(int) lpoltm->otmPanoseNumber.bMidline         ); LBPUT
  317.       wsprintf (buffer, TEXT("t bXHeight         t0x%lx"),(int) lpoltm->otmPanoseNumber.bXHeight         ); LBPUT
  318.       wsprintf (buffer, TEXT("otmfsSelection         t%d"),(UINT) lpoltm->otmfsSelection        ); LBPUT
  319.       wsprintf (buffer, TEXT("otmfsType              t%d"),(UINT) lpoltm->otmfsType             ); LBPUT
  320.       wsprintf (buffer, TEXT("otmsCharSlopeRise      t%d"),(UINT) lpoltm->otmsCharSlopeRise     ); LBPUT
  321.       wsprintf (buffer, TEXT("otmsCharSlopeRun       t%d"),(UINT) lpoltm->otmsCharSlopeRun      ); LBPUT
  322.       wsprintf (buffer, TEXT("otmItalicAngle         t%d"),(UINT) lpoltm->otmItalicAngle        ); LBPUT
  323.       wsprintf (buffer, TEXT("otmEMSquare            t%d"),(UINT) lpoltm->otmEMSquare           ); LBPUT
  324.       wsprintf (buffer, TEXT("otmAscent              t%d"),(UINT) lpoltm->otmAscent             ); LBPUT
  325.       wsprintf (buffer, TEXT("otmDescent             t%d"),(int) lpoltm->otmDescent             ); LBPUT
  326.       wsprintf (buffer, TEXT("otmLineGap             t%d"),(int) lpoltm->otmLineGap             ); LBPUT
  327.       wsprintf (buffer, TEXT("otmsCapEmHeight        t%d"),(UINT) lpoltm->otmsCapEmHeight        ); LBPUT
  328.       wsprintf (buffer, TEXT("otmsXHeight            t%d"),(UINT) lpoltm->otmsXHeight            ); LBPUT
  329.       wsprintf (buffer, TEXT("otmrcFontBox           t (%d, %d, %d, %d)"),
  330.                                                       (int) lpoltm->otmrcFontBox.left,
  331.                                                       (int) lpoltm->otmrcFontBox.top,
  332.                                                       (int) lpoltm->otmrcFontBox.right,
  333.                                                       (int) lpoltm->otmrcFontBox.bottom   ); LBPUT
  334.       wsprintf (buffer, TEXT("otmMacAscent           t%d"),(int) lpoltm->otmMacAscent          ); LBPUT
  335.       wsprintf (buffer, TEXT("otmMacDescent          t%d"),(int) lpoltm->otmMacDescent         ); LBPUT
  336.       wsprintf (buffer, TEXT("otmMacLineGap          t%d"),(UINT) lpoltm->otmMacLineGap         ); LBPUT
  337.       wsprintf (buffer, TEXT("otmusMinimumPPEM       t%d"),(UINT) lpoltm->otmusMinimumPPEM      ); LBPUT
  338.       wsprintf (buffer, TEXT("otmptSubscriptSize     t(%d, %d)"),
  339.                                                       (int) lpoltm->otmptSubscriptSize.x,
  340.                                                       (int) lpoltm->otmptSubscriptSize.y    ); LBPUT
  341.       wsprintf (buffer, TEXT("otmptSubscriptOffset   t(%d, %d)"),
  342.                                                       (int) lpoltm->otmptSubscriptOffset.x,
  343.                                                       (int) lpoltm->otmptSubscriptOffset.y  ); LBPUT
  344.       wsprintf (buffer, TEXT("otmptSuperscriptSize   t(%d, %d)"),
  345.                                                       (int) lpoltm->otmptSuperscriptSize.x,
  346.                                                       (int) lpoltm->otmptSuperscriptSize.y  ); LBPUT
  347.       wsprintf (buffer, TEXT("otmptSuperscriptOffset t(%d, %d)"),
  348.                                                       (int) lpoltm->otmptSuperscriptOffset.x,
  349.                                                       (int) lpoltm->otmptSuperscriptOffset.y); LBPUT
  350.       wsprintf (buffer, TEXT("otmsStrikeoutSize      t%d"),(UINT) lpoltm->otmsStrikeoutSize     ); LBPUT
  351.       wsprintf (buffer, TEXT("otmsStrikeoutPosition  t%d"),(int) lpoltm->otmsStrikeoutPosition );  LBPUT
  352.       wsprintf (buffer, TEXT("otmsUnderscoreSize     t%d"),(int) lpoltm->otmsUnderscoreSize    );  LBPUT
  353.       wsprintf (buffer, TEXT("otmsUnderscorePosition t%d"),(UINT) lpoltm->otmsUnderscorePosition); LBPUT
  354.       /* the last 4 fields are incorrectly typed as PSTR,
  355.        *  they are in fact offsets from the top of the
  356.        *  OUTLINETEXTMETRIC structure, to the location of the string.
  357.        */
  358.       lptStr = (LPBYTE)lpoltm;
  359.       lptStr += (UINT) (PBYTE) lpoltm->otmpFamilyName;
  360.       wsprintf (buffer, TEXT("otmpFamilyName:   %s"),lptStr); LBPUT
  361.       lptStr = (LPBYTE)lpoltm;
  362.       lptStr += (UINT) (PBYTE) lpoltm->otmpFaceName;
  363.       wsprintf (buffer, TEXT("otmpFaceName:   %s"),lptStr);   LBPUT
  364.       lptStr = (LPBYTE)lpoltm;
  365.       lptStr += (UINT) (PBYTE) lpoltm->otmpStyleName;
  366.       wsprintf (buffer, TEXT("otmpStyleName:   %s"),lptStr);  LBPUT
  367.       wsprintf (buffer, TEXT("otmpFullName:"));               LBPUT
  368.       lptStr = (LPBYTE)lpoltm;
  369.       lptStr += (UINT) (PBYTE) lpoltm->otmpFullName;
  370.       wsprintf (buffer, TEXT("  %s"),lptStr);                 LBPUT
  371.       SendDlgItemMessage (hwnd, DID_LISTBOX, WM_SETREDRAW, TRUE, 0);
  372.       InvalidateRect (hwnd, NULL, TRUE);
  373.       UpdateWindow (hwnd);
  374.       /* balance LocalAlloc(), release memory. */
  375.       LocalFree (LocalHandle (lpoltm));
  376.     } break;
  377.     /**********************************************************************
  378.     *  WM_CHILDACTIVATE
  379.     *
  380.     *  In order for these MDI child windows (dialogs) to be activated
  381.     *   correctly, the dialog procedure here must call the Win32 API
  382.     *   DefMDIChildProc ().
  383.     **********************************************************************/
  384.     case WM_CHILDACTIVATE:
  385.       DefMDIChildProc(hwnd, message, wParam, lParam);
  386.       return TRUE;
  387.     break;
  388.   } /* end switch */
  389.   return 0;
  390. }