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

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-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. *
  12. *  PROGRAM:     GETCAPS.C
  13. *
  14. *  PURPOSE:     Handles display of information returned by call to
  15. *               GetDeviceCaps. GetDeviceCaps is called for the
  16. *               currently selected deivce (in the tool bar comobobox),
  17. *               and the results are formatted and displayed in a dialog
  18. *               box.
  19. *
  20. *  FUNTIONS:    GetDeviceCapsDlgProc - handles messages for dialog
  21. *               DisplayDeviceCapsInfo- retrieves device caps info
  22. *               TranslateDeviceCaps  - displays a capability in listbox
  23. *               ComplexDeviceCapsLine- formats a bitfield capability
  24. *
  25. ******************************************************************************/
  26. #include <windows.h>
  27. #include <winspool.h>
  28. #include <string.h>
  29. #include <stdio.h>
  30. #include <winspool.h>
  31. #include "common.h"
  32. #include "getcaps.h"
  33. /******************************************************************************
  34. *
  35. *  FUNCTION:    GetDeviceCapsDlgProc (standard dialog procedure INPUTS/RETURNS)
  36. *
  37. *  COMMENTS:    Processes messages for GetDeviceCaps dialog box
  38. *
  39. ******************************************************************************/
  40. LRESULT CALLBACK   GetDeviceCapsDlgProc (HWND   hwnd, UINT msg, WPARAM wParam,
  41.                                          LPARAM lParam)
  42. {
  43.   switch (msg)
  44.   {
  45.     case WM_INITDIALOG:
  46.     {
  47.       BOOL bReturn;
  48.       char buf[BUFSIZE];
  49.       ghwndDevCaps = hwnd;
  50.       //
  51.       // shove all the caps info in the list box
  52.       //
  53.       SetCursor (LoadCursor (NULL, IDC_WAIT));
  54.       bReturn = DisplayDeviceCapsInfo ();
  55.       SetCursor (LoadCursor (NULL, IDC_ARROW));
  56.       if (!bReturn)
  57.       {
  58.         EndDialog (hwnd, TRUE);
  59.       }
  60.       //
  61.       // set window title to reflect current device
  62.       //
  63.       else
  64.       {
  65.         sprintf (buf, "GetDeviceCaps: %s;%s;%s", gszDeviceName, gszPort,
  66.                  gszDriverName);
  67.         SetWindowText (hwnd, (LPCSTR) buf);
  68.       }
  69.       break;
  70.     }
  71.     case WM_COMMAND:
  72.       switch (LOWORD (wParam))
  73.       {
  74.         case DID_OK:
  75.           EndDialog (hwnd, TRUE);
  76.           return 1;
  77.       }
  78.       break;
  79.   }
  80.   return 0;
  81. }
  82. /******************************************************************************
  83. *
  84. *  FUNCTION:    DisplayDeviceCapsInfo
  85. *
  86. *  RETURNS:     TRUE if successful,
  87. *               FALSE otherwise
  88. *
  89. *  COMMENTS:    Retrieves all device caps for current deivce & calls
  90. *                 TranslateCaps to insert them in the dialog's listbox.
  91. *
  92. ******************************************************************************/
  93. BOOL DisplayDeviceCapsInfo ()
  94. {
  95.   HDC hdc;
  96.   int i, iValue;
  97.   if (!strcmp (gszDeviceName, "Display"))
  98.   {
  99.     if (!(hdc = GetDC (ghwndDevCaps)))
  100.     {
  101.       ErrMsgBox (GetStringRes(IDS_GETDCFAIL), ERR_MOD_NAME);
  102.       return FALSE;
  103.     }
  104.   }
  105.   else
  106.   {
  107.     if (!(hdc = CreateDC (gszDriverName, gszDeviceName, gszPort, NULL)))
  108.     {
  109.       char buf[BUFSIZE];
  110.       sprintf (buf, GetStringRes(IDS_FMT_CREDCFAIL),
  111.                gszDriverName, gszDeviceName, gszPort);
  112.       ErrMsgBox (buf, ERR_MOD_NAME);
  113.       return FALSE;
  114.     }
  115.   }
  116.   for (i = 0; i < MAX_DEVICE_CAPS; i++)
  117.   {
  118.     iValue = GetDeviceCaps (hdc, gaCaps[i].iValue);
  119.     TranslateDeviceCaps (i, gaCaps[i].iValue, iValue);
  120.   }
  121.   DeleteDC (hdc);
  122.   return TRUE;
  123. }
  124. /******************************************************************************
  125. *
  126. *  FUNCTION:    TranslateDeviceCaps
  127. *
  128. *  INPUTS:      arrayIndex - index into gaCaps[]
  129. *               capIndex   - devcap index (eg. TECHNOLOGY, CURVECAPS)
  130. *               iValue     - value returned by GetDeviceCaps
  131. *
  132. *  COMMENTS:    For simple devcaps (eg. tjose with single numeric return
  133. *               value), appends caps value to string and inserts into
  134. *               listbox. For "complex" caps (those returning multiple
  135. *               bit-values) calls ComplexCapsLine which handles text
  136. *               formattting & insertion.
  137. *
  138. ******************************************************************************/
  139. void TranslateDeviceCaps (int arrayIndex, int capIndex, int iValue)
  140. {
  141.   char buf[BUFSIZE];
  142.   strcpy (buf, gaCaps[arrayIndex].szValue);
  143.   switch (capIndex)
  144.   {
  145.     case TECHNOLOGY:
  146.     {
  147.       int     i;
  148.       
  149.       for (i = 0; i < MAX_TECHNOLOGY_CAPS; i++)
  150.         if (iValue == (gaTechnologyCaps + i)->iValue)
  151.         {
  152.           strcat(buf, (gaTechnologyCaps + i)->szValue);
  153.           SendDlgItemMessage (ghwndDevCaps, DID_LISTBOX, LB_INSERTSTRING,
  154.                               (UINT)-1, (LONG) buf);
  155.           break;
  156.         }
  157.             
  158.       break;
  159.     }
  160.     case CURVECAPS:
  161.       ComplexDeviceCapsLine (buf, gaCurveCaps, MAX_CURVE_CAPS, iValue);
  162.       break;
  163.     case LINECAPS:
  164.       ComplexDeviceCapsLine (buf, gaLineCaps, MAX_LINE_CAPS, iValue);
  165.       break;
  166.     case POLYGONALCAPS:
  167.       ComplexDeviceCapsLine (buf, gaPolygonCaps, MAX_POLYGON_CAPS, iValue);
  168.       break;
  169.     case TEXTCAPS:
  170.       ComplexDeviceCapsLine (buf, gaTextCaps, MAX_TEXT_CAPS, iValue);
  171.       break;
  172.     case CLIPCAPS:
  173.       ComplexDeviceCapsLine (buf, gaClipCaps, MAX_CLIP_CAPS, iValue);
  174.       break;
  175.     case RASTERCAPS:
  176.       ComplexDeviceCapsLine (buf, gaRasterCaps, MAX_RASTER_CAPS, iValue);
  177.       break;
  178.     default:
  179.       wsprintf(buf, gaCaps[arrayIndex].szValue, iValue);
  180.       SendDlgItemMessage (ghwndDevCaps, DID_LISTBOX, LB_INSERTSTRING,
  181.                           (UINT)-1, (LONG) buf);
  182.       break;
  183.   }
  184. }
  185. /******************************************************************************
  186. *
  187. *  FUNCTION:     ComplexDeviceCapsLine
  188. *
  189. *  INPUTS:       pbuf        - pointer to buffer containing a cap-type
  190. *                              string
  191. *                pLkUp       - pointer to a CAPSLOOKUP table
  192. *                iMaxEntries - # of enries in table pointed at by pLkUp
  193. *                iValue      - an integer containing 1+ bit-value flags.
  194. *
  195. *  COMMENTS:     This function is used to expand an int containing
  196. *                multiple bit-values into a set of strings which are
  197. *                inserted into the DevCapsDlg listbox. The iValue
  198. *                parameter is checked against each iIndex entry in the
  199. *                CAPSLOOKUP table pointed at by pLkUp, and when matches
  200. *                are found the corresponding (lpszValue) string is
  201. *                inserted.
  202. *
  203. *                The buffer pointed to by pbuf will be destroyed.
  204. *
  205. ******************************************************************************/
  206. void ComplexDeviceCapsLine (char *pbuf, CAPSLOOKUP *pLkUp, int iMaxEntries,
  207.                      int iValue)
  208. {
  209.   int  i;
  210.   BOOL bNewLine = FALSE;
  211.   for (i = 0; i < iMaxEntries; i++)
  212.     if (iValue & (pLkUp + i)->iValue)
  213.     {
  214.       if (bNewLine)
  215.       {
  216.         //
  217.         // Keep the first symbolic constant on the same line as the
  218.         //   cap type, eg:  "TECHNOLOGY:     DT_RASDISPLAY".
  219.         //
  220.         strcpy (pbuf, BLANKS);
  221.         strcat (pbuf, (pLkUp + i)->szValue);
  222.       }
  223.       else
  224.       {
  225.         //
  226.         // Put symbolic constant on new line, eg:
  227.         //                  "                DT_RASPRINTER".
  228.         //
  229.         strcat (pbuf, (pLkUp + i)->szValue);
  230.         bNewLine = TRUE;
  231.       }
  232.       SendDlgItemMessage (ghwndDevCaps, DID_LISTBOX, LB_INSERTSTRING,
  233.                           (UINT)-1, (LONG) pbuf);
  234.    }
  235. }