home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_17 / PrinterDevice / DevPage.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-08  |  5.1 KB  |  198 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : devpage.cpp                                                         //
  10. //  Description: KDevicePage class                                                     //
  11. //  Version    : 1.00.002, Sep 7, 2000                                               //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #define NOCRYPT
  16. #define WINVER       0x0500
  17.  
  18. #include <windows.h>
  19. #include <tchar.h>
  20.  
  21. #include "resource.h"
  22.  
  23. #include "..\..\include\property.h"
  24. #include "..\..\include\listview.h"
  25. #include "..\..\include\outputsetup.h"
  26.  
  27. #include "DevPage.h"
  28. #include "DevCaps.h"
  29. #include "DCAttr.h"
  30.  
  31. int FrameBufferSize(int width, int height, int bpp)
  32. {
  33.     int bytepp = ( bpp + 7 ) / 8;                 // bytes per pixel
  34.     int byteps = ( width * bytepp + 3 ) / 4 * 4; // bytes per scanline
  35.  
  36.     return height * byteps;                         // bytes per frame buffer
  37. }
  38.  
  39.  
  40. void AddDisplaySettings(HWND hList, LPCTSTR pszDeviceName)
  41. {
  42.     DEVMODE  dm;
  43.  
  44.     dm.dmSize         = sizeof(DEVMODE);
  45.     dm.dmDriverExtra = 0;
  46.  
  47.     SendMessage(hList, LB_RESETCONTENT, 0, 0);
  48.  
  49.     for (unsigned i=0;
  50.          EnumDisplaySettings(pszDeviceName, i, & dm);
  51.          i++ )
  52.     {
  53.         TCHAR szTemp[MAX_PATH];
  54.  
  55.         wsprintf(szTemp, _T("%d by %d, %d bits, %d Hz, %d Kb"), 
  56.             dm.dmPelsWidth, 
  57.             dm.dmPelsHeight, 
  58.             dm.dmBitsPerPel,
  59.             dm.dmDisplayFrequency,
  60.             FrameBufferSize(dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel) / 1024
  61.             );
  62.  
  63.         SendMessage(hList, LB_ADDSTRING, 0, (LPARAM) szTemp);
  64.     }
  65. }
  66.  
  67.  
  68. BOOL KDevicePage::OnInitDialog(HWND hWnd)
  69. {
  70.     HWND hList = GetDlgItem(hWnd, IDC_DEVICE);
  71.  
  72.     SendMessage(hList, CB_RESETCONTENT, 0, 0);
  73.     ListPrinters(hList, CB_ADDSTRING);
  74.      SendMessage(hList, CB_SETCURSEL, 0, 0);
  75.  
  76.     m_infolist.FromDlgItem(hWnd, IDC_INFO2);
  77.     m_infolist.AddColumn(0, 100, "Field");
  78.     m_infolist.AddColumn(1, 200, "Values");
  79.         
  80.     OnDeviceChange(hWnd);
  81.  
  82.     return TRUE;
  83. }
  84.  
  85.  
  86. inline void AddRow(KListView & list, const TCHAR * col1, const TCHAR * col2)
  87. {
  88.     list.AddItem(0, col1);
  89.     list.AddItem(1, col2);
  90. }
  91.  
  92.  
  93. BOOL KDevicePage::OnDeviceChange(HWND hWnd)
  94. {
  95.     TCHAR szDeviceName[MAX_PATH];
  96.  
  97.     GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);
  98.  
  99.     HANDLE hPrinter;
  100.     OpenPrinter(szDeviceName, & hPrinter, NULL);
  101.  
  102.     if ( m_pInfo2 )
  103.         delete [] (BYTE *) m_pInfo2;
  104.  
  105.     DWORD cbNeeded = 0;
  106.  
  107.     GetPrinter(hPrinter, 2, NULL, 0, & cbNeeded);
  108.     
  109.     if ( cbNeeded>0 )
  110.     {
  111.         m_pInfo2 = (PRINTER_INFO_2 * ) new BYTE[cbNeeded];
  112.  
  113.         GetPrinter(hPrinter, 2, (BYTE *) m_pInfo2, cbNeeded, & cbNeeded);
  114.  
  115.         m_infolist.DeleteAll();
  116.  
  117.         AddRow(m_infolist, _T("Driver Name"),        m_pInfo2->pDriverName);
  118.         AddRow(m_infolist, _T("Printer Name"),        m_pInfo2->pPrinterName);
  119.         AddRow(m_infolist, _T("Share Name"),        m_pInfo2->pShareName);
  120.         AddRow(m_infolist, _T("Port Name"),            m_pInfo2->pPortName);
  121.         AddRow(m_infolist, _T("Driver Name"),        m_pInfo2->pDriverName);
  122.         AddRow(m_infolist, _T("Comment"),            m_pInfo2->pComment);
  123.         AddRow(m_infolist, _T("Location"),            m_pInfo2->pLocation);
  124.         AddRow(m_infolist, _T("Separator Page"),    m_pInfo2->pSepFile);
  125.         AddRow(m_infolist, _T("Print Processor"),    m_pInfo2->pPrintProcessor);
  126.         AddRow(m_infolist, _T("Data type"),            m_pInfo2->pDatatype);
  127.         AddRow(m_infolist, _T("Parameters"),        m_pInfo2->pParameters);
  128.     }
  129.  
  130.     ClosePrinter(hPrinter);
  131.  
  132.     return cbNeeded != 0;
  133. }
  134.  
  135.  
  136.  
  137. BOOL KDevicePage::OnDeviceCaps(HWND hWnd)
  138. {
  139.     if ( m_pInfo2==NULL )
  140.         return FALSE;
  141.  
  142.     HDC hDC = CreateDC(m_pInfo2->pDriverName, m_pInfo2->pPrinterName, 
  143.                     m_pInfo2->pPortName, m_pInfo2->pDevMode);
  144.  
  145.     KDeviceCaps caps(hDC);
  146.  
  147.     caps.Dialogbox(m_hInstance, MAKEINTRESOURCE(IDD_DEVICECAPS));
  148.     
  149.     DeleteDC(hDC);
  150.  
  151.     return TRUE;
  152. }
  153.  
  154.  
  155. BOOL KDevicePage::OnDCAttributes(HWND hWnd)
  156. {
  157.     if ( m_pInfo2==NULL )
  158.         return FALSE;
  159.  
  160.     HDC hDC = CreateDC(m_pInfo2->pDriverName, m_pInfo2->pPrinterName, 
  161.                     m_pInfo2->pPortName, m_pInfo2->pDevMode);
  162.  
  163.     KDCAttributes attr(hDC);
  164.  
  165.     attr.Dialogbox(m_hInstance, MAKEINTRESOURCE(IDD_DCATTRIBUTES), hWnd);
  166.     
  167.     DeleteDC(hDC);
  168.  
  169.     return TRUE;
  170. }
  171.  
  172.  
  173. BOOL KDevicePage::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  174. {
  175.     switch (uMsg)
  176.     {
  177.         case WM_INITDIALOG:
  178.             return OnInitDialog(hWnd);
  179.  
  180.         case WM_COMMAND:
  181.             switch ( LOWORD(wParam) )
  182.             {
  183.                 case IDC_DEVICE:
  184.                     if ( HIWORD(wParam)==CBN_SELCHANGE )
  185.                         return OnDeviceChange(hWnd);
  186.                     break;
  187.  
  188.                 case IDC_DEVICECAPS:
  189.                     return OnDeviceCaps(hWnd);
  190.  
  191.                 case IDC_DCATTR:
  192.                     return OnDCAttributes(hWnd);
  193.             }
  194.     }
  195.     
  196.     return FALSE;
  197. }
  198.