home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / fonts / gtxtmtrx.c < prev    next >
Text File  |  1988-08-10  |  6KB  |  194 lines

  1. /*
  2.  *
  3.  * GetTextMetrics
  4.  *
  5.  * This program registers a window and creates it on the screen.  The
  6.  *  program then creates the window, shows the window, and then updates
  7.  *  the window.  If the user couble clicks the right mouse button, the
  8.  *  GetTextMetrics function is executed with the HDC of the top level
  9.  *  window and the current font.  The width and height are returned in a
  10.  *  message box.
  11.  *
  12.  */
  13.  
  14. #include "windows.h"
  15.  
  16. /* Global Variables */
  17. static HANDLE hInst;         /* Handle to the Instance.            */
  18. static HWND hWnd;            /* Handle to the Window.              */
  19.  
  20. /* FORWARD REFERENCES */
  21. long FAR PASCAL WindowProc (HWND, unsigned, WORD, LONG);
  22.  
  23. /* WINMAIN */
  24. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, cmdShow)
  25. HANDLE hInstance, hPrevInstance;
  26. LPSTR lpszCmdLine;
  27. int cmdShow;
  28. {
  29.   MSG msg;
  30.  
  31.   if (!hPrevInstance)  {
  32.  
  33.      WNDCLASS rClass;
  34.  
  35.      rClass.lpszClassName = (LPSTR)"gtxtmtrx";
  36.      rClass.hInstance      = hInstance;
  37.      rClass.lpfnWndProc   = WindowProc;
  38.      rClass.hCursor         = LoadCursor(NULL, IDC_ARROW);
  39.      rClass.hIcon          = LoadIcon(hInstance, IDI_APPLICATION);
  40.      rClass.lpszMenuName  = (LPSTR)NULL;
  41.      rClass.hbrBackground = GetStockObject(WHITE_BRUSH);
  42.      rClass.style            = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  43.      rClass.cbClsExtra      = 0;       /* Add double click capabilities. */
  44.      rClass.cbWndExtra      = 0;
  45.  
  46.      RegisterClass((LPWNDCLASS)&rClass);
  47.  
  48.      }
  49.    else
  50.       ;
  51.  
  52.    hInst = hInstance;
  53.  
  54.    hWnd = CreateWindow((LPSTR) "gtxtmtrx",
  55.                (LPSTR) "GetTextMetrics",        /* Create a window.         */
  56.                WS_OVERLAPPEDWINDOW,            /* Make it overlapped.      */
  57.                CW_USEDEFAULT,                  /* Use default coordinates. */
  58.                CW_USEDEFAULT,                  /* Use default coordinates. */
  59.                CW_USEDEFAULT,                  /* Use default coordinates. */
  60.                CW_USEDEFAULT,                  /* Use default coordinates. */
  61.                (HWND)NULL,
  62.                (HMENU)NULL,
  63.                (HANDLE)hInstance,
  64.                (LPSTR)NULL
  65.              );
  66.  
  67.    ShowWindow(hWnd, cmdShow);
  68.  
  69.    UpdateWindow(hWnd);
  70.  
  71.    while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
  72.        TranslateMessage(&msg);
  73.        DispatchMessage(&msg);
  74.    }
  75.  
  76.    exit(msg.wParam);
  77.  
  78. } /* WinMain */
  79.  
  80. /* WINDOWPROC */
  81.  
  82. long FAR PASCAL WindowProc(hWnd, identifier, wParam, lParam)
  83. HWND    hWnd;
  84. unsigned identifier;
  85. WORD     wParam;
  86. LONG     lParam;
  87.  
  88. {
  89.    switch (identifier) {
  90.  
  91.      case WM_PAINT: {
  92.  
  93.            PAINTSTRUCT ps;
  94.           RECT        rRect;
  95.          HDC        hDC;
  96.  
  97.          hDC=BeginPaint(hWnd, (LPPAINTSTRUCT)&ps);
  98.          SetMapMode(hDC, MM_ANISOTROPIC);
  99.          SetWindowOrg(hDC, 0, 0);
  100.          SetWindowExt(hDC, 110, 110);
  101.          GetClientRect(hWnd, (LPRECT)&rRect);
  102.          SetViewportOrg(hDC, 0, 0);
  103.          SetViewportExt(hDC, rRect.right, rRect.bottom);
  104.          DrawText(hDC,
  105.                 (LPSTR)"Double Click Right Mouse Button To Conduct Test.",
  106.                 48, (LPRECT)&rRect, DT_SINGLELINE);  /* Prompt text.    */
  107.          EndPaint(hWnd, (LPPAINTSTRUCT)&ps);          
  108.  
  109.       }
  110.         break;
  111.     
  112.      case WM_RBUTTONDBLCLK:                    /* If the user double   */
  113.        {                                       /* clicks on the right  */
  114.        char szbuf[80];   /* Output buffer.      | mouse button, then   */
  115.        TEXTMETRIC *strTM; /* Extents - test text.| establish needed    */
  116.        BOOL bGotem;      /* Boolean success flg | variables and call   */
  117.        HDC hDC;      /* Display Context Handle. | the GetTextMetrics   */
  118.        HANDLE hLMem;     /* Local Memory for the Text Metrics.         */
  119.  
  120.           /* Allocate the local memory for the Text Metrics. */
  121.  
  122.        hLMem = LocalAlloc(LMEM_DISCARDABLE | LMEM_MOVEABLE,
  123.                           sizeof(TEXTMETRIC));
  124.        if (hLMem == NULL)   /* If error, then complain. */
  125.           {
  126.           MessageBox(hWnd, (LPSTR)"Could Not allocate Local Memory!!!",
  127.                      (LPSTR)"ERROR!!!", MB_OK | MB_ICONEXCLAMATION);
  128.           break;
  129.           };
  130.  
  131.           /* Lock the local memory. */
  132.  
  133.        strTM = (TEXTMETRIC *)LocalLock(hLMem);
  134.  
  135.        if (strTM == NULL)   /* If error, then complain. */
  136.           {
  137.           MessageBox(hWnd, (LPSTR)"Could Not lock Local Memory!!!",
  138.                      (LPSTR)"ERROR!!!", MB_OK | MB_ICONEXCLAMATION);
  139.           break;
  140.           };
  141.  
  142.        hDC = GetDC(hWnd);                      /* (after getting DC)   */
  143.  
  144.           /* Get the Text Metrics of the current Font. */
  145.        
  146.        bGotem = GetTextMetrics(hDC, (LPTEXTMETRIC)strTM);
  147.  
  148.        if (bGotem == NULL)   /* If the GetTextMetrics fails, then complain. */
  149.           {
  150.           MessageBox(hWnd,
  151.              (LPSTR)"Did Not Get The Text Metrics!!!",
  152.              (LPSTR)"ERROR!!!", MB_OK | MB_ICONEXCLAMATION);
  153.           break;
  154.           }
  155.        else
  156.           {
  157.            sprintf(szbuf,                       /* Otherwise, capture   */
  158.                   "%s%s%i%s%i%s\0",            /* the Ext information  */
  159.                   "The Text Metrics ",         /* in a zero terminated */
  160.                   "<height,weight> are (",     /* buffer.             */   
  161.                    (int)strTM->tmHeight, ",",    
  162.                   (int)strTM->tmWeight, ").");
  163.  
  164.            MessageBox(hWnd,                     /* Output the buffer in */
  165.                      (LPSTR)szbuf,             /* a message box format */
  166.                      (LPSTR)"GetTextMetrics",  /* so that the user can */
  167.                       MB_OK);                   /* have a readable and  */
  168.           };                                   /* useful format.       */
  169.        LocalUnlock(hLMem);  /* Unlock the local memory. */
  170.        LocalFree(hLMem);    /* Free the local memory.   */
  171.        };
  172.        break;
  173.  
  174.      case WM_CLOSE: {
  175.  
  176.           DestroyWindow(hWnd);
  177.        }
  178.          break;
  179.     
  180.     case WM_DESTROY:
  181.         PostQuitMessage(0);
  182.         break;
  183.  
  184.     default:
  185.         return(DefWindowProc(hWnd, identifier, wParam, lParam));
  186.         break;
  187.  
  188.    }
  189.  
  190.    return(0L);
  191.  
  192. }
  193. 
  194.