home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / include / outputsetup.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-08  |  13.6 KB  |  476 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   : outputsetup.cpp                                                        //
  10. //  Description: KOutputSetup class: printer setup and page setup                    //
  11. //  Version    : 1.00.001, Sep 7, 2000                                               //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #define WIN32_LEAN_AND_MEAN
  16.  
  17. #include <windows.h>
  18. #include <assert.h>
  19. #include <commdlg.h>
  20. #include <winspool.h>
  21. #include <tchar.h>
  22.  
  23. #include "outputsetup.h"
  24. #include "dialog.h"
  25. #include "listview.h"
  26.  
  27. void KOutputSetup::Release(void)
  28. {
  29.     if ( m_pd.hDevMode )
  30.     {
  31.         GlobalFree(m_pd.hDevMode);
  32.         m_pd.hDevMode = NULL;
  33.     }
  34.             
  35.     if ( m_pd.hDevNames )
  36.     {
  37.         GlobalFree(m_pd.hDevNames);
  38.         m_pd.hDevNames = NULL;
  39.     }
  40.  
  41.     DeletePrinterDC();
  42. }
  43.  
  44.  
  45. void KOutputSetup::DeletePrinterDC(void)
  46. {
  47.     if ( m_pd.hDC )
  48.     {
  49.         DeleteObject(m_pd.hDC);
  50.         m_pd.hDC = NULL;
  51.     }
  52. }
  53.  
  54.  
  55. KOutputSetup::KOutputSetup(void)
  56. {
  57.     memset (&m_pd, 0, sizeof(PRINTDLG));
  58.     m_pd.lStructSize = sizeof(PRINTDLG);
  59. //    m_pd.nMinPage = 1;
  60. //    m_pd.nMaxPage = 100;
  61.  
  62.     memset(& m_psd, 0, sizeof(m_psd));
  63.     m_psd.lStructSize = sizeof(m_psd);
  64. }
  65.  
  66. void KOutputSetup::SetDefault(HWND hwndOwner, int minpage, int maxpage)
  67. {
  68.     m_pd.hwndOwner   = hwndOwner;
  69.  
  70.     PrintDialog(PD_RETURNDEFAULT);
  71.  
  72.     m_pd.nFromPage = minpage;
  73.     m_pd.nToPage   = maxpage;
  74.     m_pd.nMinPage  = minpage;
  75.     m_pd.nMaxPage  = maxpage;
  76.  
  77.     m_psd.hwndOwner  = hwndOwner;
  78.  
  79.     m_psd.rtMargin.left  = 1250; // 1.25 inch
  80.     m_psd.rtMargin.right = 1250; // 1.25 inch
  81.     m_psd.rtMargin.top   = 1000; // 1.25 inch
  82.     m_psd.rtMargin.bottom= 1000; // 1.25 inch
  83.  
  84.     HDC hDC = CreatePrinterDC();
  85.  
  86.     int dpix = hDC ? GetDeviceCaps(hDC, LOGPIXELSX) : 300;
  87.     int dpiy = hDC ? GetDeviceCaps(hDC, LOGPIXELSY) : 300;
  88.  
  89.     m_psd.ptPaperSize.x     = ( hDC ? GetDeviceCaps(hDC, PHYSICALWIDTH)  : 2500 ) * 1000 / dpix;
  90.     m_psd.ptPaperSize.y     = ( hDC ? GetDeviceCaps(hDC, PHYSICALHEIGHT) : 3300 ) * 1000 / dpiy;
  91.  
  92.     m_psd.rtMinMargin.left  = ( hDC ? GetDeviceCaps(hDC, PHYSICALOFFSETX) : 75 ) * 1000 / dpix;
  93.     m_psd.rtMinMargin.top   = ( hDC ? GetDeviceCaps(hDC, PHYSICALOFFSETY) : 12 ) * 1000 / dpiy;
  94.  
  95.     m_psd.rtMinMargin.right = m_psd.ptPaperSize.x - m_psd.rtMinMargin.left - 
  96.         ( hDC ? GetDeviceCaps(hDC, HORZRES) : 203 ) * 1000 / dpix;
  97.  
  98.     m_psd.rtMinMargin.bottom= m_psd.ptPaperSize.y - m_psd.rtMinMargin.top  - 
  99.         ( hDC ? GetDeviceCaps(hDC, VERTRES) : 266 ) * 1000 / dpiy;
  100.         
  101.     if ( hDC )
  102.         DeleteObject(hDC);
  103. //  PageSetup(PSD_RETURNDEFAULT);
  104. }
  105.  
  106.     
  107. KOutputSetup::~KOutputSetup(void)
  108. {
  109.     Release();
  110. }
  111.  
  112.  
  113. int KOutputSetup::PrintDialog(DWORD flag)
  114. {
  115.     m_pd.Flags = flag;
  116.     return PrintDlg(&m_pd);
  117. }
  118.  
  119.  
  120. BOOL KOutputSetup::PageSetup(DWORD flag)
  121. {
  122.     m_psd.hDevMode  = m_pd.hDevMode; 
  123.     m_psd.hDevNames = m_pd.hDevNames;
  124.     m_psd.Flags     = flag | PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS;
  125.  
  126.     return PageSetupDlg(& m_psd);
  127. }
  128.  
  129.  
  130. const TCHAR * KOutputSetup::GetDriverName(void) const
  131. {
  132.     const DEVNAMES * pDevNames = (DEVNAMES *) GlobalLock(m_pd.hDevNames);
  133.  
  134.     if ( pDevNames )
  135.         return (const TCHAR *) ( (const char *) pDevNames + pDevNames->wDriverOffset );
  136.     else
  137.         return NULL;
  138. }
  139.  
  140.  
  141. const TCHAR * KOutputSetup::GetDeviceName(void) const
  142. {
  143.     const DEVNAMES * pDevNames = (DEVNAMES *) GlobalLock(m_pd.hDevNames);
  144.  
  145.     if ( pDevNames )
  146.         return (const TCHAR *) ( (const char *) pDevNames + pDevNames->wDeviceOffset );
  147.     else
  148.         return NULL;
  149. }
  150.  
  151.  
  152. const TCHAR * KOutputSetup::GetOutputName(void) const
  153. {
  154.     const DEVNAMES * pDevNames = (DEVNAMES *) GlobalLock(m_pd.hDevNames);
  155.  
  156.     if ( pDevNames )
  157.         return (const TCHAR *) ( (const char *) pDevNames + pDevNames->wOutputOffset );
  158.     else
  159.         return NULL;
  160. }
  161.  
  162.  
  163. HDC KOutputSetup::CreatePrinterDC(void)
  164. {
  165.     return CreateDC(NULL, GetDeviceName(), NULL, GetDevMode());
  166. }
  167.  
  168.  
  169. /////////////////////////////////////////////////////////
  170.  
  171. void * EnumeratePrinters(DWORD flag, LPTSTR name, DWORD level, DWORD & nPrinters)
  172. {
  173.     DWORD cbNeeded;
  174.  
  175.     nPrinters = 0;
  176.     EnumPrinters(flag, name, level, NULL, 0, & cbNeeded, & nPrinters);
  177.  
  178.     BYTE * pPrnInfo = new BYTE[cbNeeded];
  179.  
  180.     if ( pPrnInfo )
  181.         EnumPrinters(flag, name, level, (BYTE *) pPrnInfo, cbNeeded, 
  182.             & cbNeeded, & nPrinters);
  183.  
  184.     return pPrnInfo;
  185. }
  186.  
  187.  
  188. void ListPrinters(HWND hWnd, int message)
  189. {
  190.     DWORD nPrinters;
  191.  
  192.     PRINTER_INFO_5 * pInfo5 = (PRINTER_INFO_5 *) EnumeratePrinters(PRINTER_ENUM_LOCAL, NULL, 5, nPrinters);
  193.  
  194.     if ( pInfo5 )
  195.     {
  196.         for (unsigned i=0; i<nPrinters; i++)
  197.             SendMessage(hWnd, message, 0, (LPARAM) pInfo5[i].pPrinterName);
  198.  
  199.         delete [] (BYTE *) pInfo5;
  200.     }
  201.  
  202.     PRINTER_INFO_1 * pInfo1 = (PRINTER_INFO_1 *) EnumeratePrinters(PRINTER_ENUM_CONNECTIONS, NULL, 1, nPrinters);
  203.  
  204.     if ( pInfo1 )
  205.     {
  206.         for (unsigned i=0; i<nPrinters; i++)
  207.             SendMessage(hWnd, message, 0, (LPARAM) pInfo1[i].pName);
  208.  
  209.         delete [] (BYTE *) pInfo1;
  210.     }
  211. }
  212.  
  213.  
  214. DEVMODE * GetDEVMODE(TCHAR * PrinterName, int nPrompt)
  215. {
  216.     HANDLE hPrinter;
  217.  
  218.     if ( !OpenPrinter(PrinterName, &hPrinter, NULL) )
  219.         return NULL;
  220.  
  221.     // A zero for last param returns the size of buffer needed.
  222.     int nSize = DocumentProperties(NULL, hPrinter, PrinterName, NULL, NULL, 0);
  223.  
  224.     DEVMODE * pDevMode = (DEVMODE *) new char[nSize];
  225.     
  226.     if ( pDevMode==NULL )
  227.         return NULL;
  228.  
  229.     // ask driver to initialize a devmode structure
  230.     DocumentProperties(NULL, hPrinter, PrinterName, pDevMode, NULL, DM_OUT_BUFFER);
  231.  
  232.     // show property sheet to allow user modification
  233.     BOOL rslt = TRUE;
  234.     switch ( nPrompt )
  235.     {
  236.         case 1:
  237.             rslt = AdvancedDocumentProperties(NULL, hPrinter, PrinterName, pDevMode, pDevMode) == IDOK;
  238.             break;
  239.  
  240.         case 2:
  241.             rslt = ( DocumentProperties(NULL, hPrinter, PrinterName, pDevMode, pDevMode, 
  242.                         DM_IN_PROMPT | DM_OUT_BUFFER | DM_IN_BUFFER ) == IDOK );
  243.             break;
  244.     }
  245.  
  246.     ClosePrinter(hPrinter);
  247.  
  248.     if ( rslt )
  249.         return pDevMode;
  250.     else
  251.     {
  252.         delete [] (BYTE *) pDevMode;
  253.         return NULL;
  254.     }
  255. }
  256.  
  257. class KProperty : public KDialog
  258. {
  259.     KListView      m_list;
  260.     KOutputSetup * m_pSetup;
  261.     int             * m_pControlID;
  262.  
  263.     void AddRow(const TCHAR * one, const TCHAR * two)
  264.     {
  265.         m_list.AddItem(0, one);
  266.         m_list.AddItem(1, two);
  267.     }
  268.  
  269.     void AddRow(const TCHAR * one, const TCHAR * format, int p1, int p2=0, int p3=0, int p4=0)
  270.     {
  271.         TCHAR temp[64];
  272.  
  273.         wsprintf(temp, format, p1, p2, p3, p4);
  274.         
  275.         m_list.AddItem(0, one);
  276.         m_list.AddItem(1, temp);
  277.     }
  278.  
  279.     void ShowAttributes(void)
  280.     {
  281.         m_list.FromDlgItem(m_hWnd, m_pControlID[0]);
  282.  
  283.         RECT rect;
  284.         GetWindowRect(m_list.GetHWND(), & rect);
  285.         int width = rect.right - rect.left;
  286.  
  287.         m_list.AddColumn(0, width/2-5, _T("Attribute"));
  288.         m_list.AddColumn(1, width/2-5, _T("Value"));
  289.  
  290.         AddRow(_T("hDevNames->Driver Name"), m_pSetup->GetDriverName());
  291.         AddRow(_T("           Device Name"), m_pSetup->GetDeviceName());
  292.         AddRow(_T("           Output Name"), m_pSetup->GetOutputName());
  293.  
  294.         const DEVMODE * pDevMode = m_pSetup->GetDevMode();
  295.  
  296.         if ( pDevMode )
  297.         {
  298.             AddRow(_T("hDevMode->dmDeviceName"),    (const TCHAR *) pDevMode->dmDeviceName);
  299.             AddRow(_T("          dmSpecVersion"),   _T("0x%x"),            pDevMode->dmSpecVersion);
  300.             AddRow(_T("          dmDriverVersion"), _T("0x%x"),            pDevMode->dmDriverVersion);
  301.             AddRow(_T("          dmSize"),          _T("%d bytes"),        pDevMode->dmSize);
  302.             AddRow(_T("          dmDriverExtra"),   _T("%d bytes"),        pDevMode->dmDriverExtra);
  303.  
  304.             AddRow(_T("          dmOrientation"),   _T("%d"),            pDevMode->dmOrientation);
  305.             AddRow(_T("          dmPaperSize"),     _T("%d"),            pDevMode->dmPaperSize);
  306.             AddRow(_T("          dmPaperLength"),   _T("%d x 100 um"),  pDevMode->dmPaperLength);
  307.             AddRow(_T("          dmPaperWidth"),    _T("%d x 100 um"),  pDevMode->dmPaperWidth);
  308.             AddRow(_T("          dmScale"),         _T("%d %"),         pDevMode->dmScale);
  309.             AddRow(_T("          dmCopies"),        _T("%d copies"),    pDevMode->dmCopies);
  310.             AddRow(_T("          dmDefaultSource"), _T("%d"),           pDevMode->dmDefaultSource);
  311.             AddRow(_T("          dmPrintQuality"),  _T("%d"),           pDevMode->dmPrintQuality);
  312.             AddRow(_T("          dmColor"),         _T("%d"),           pDevMode->dmColor);
  313.             AddRow(_T("          dmDuplex"),        _T("%d"),           pDevMode->dmDuplex);
  314.             AddRow(_T("          dmYResolution"),   _T("%d"),           pDevMode->dmYResolution);
  315.             AddRow(_T("          dmTTOption"),      _T("%d"),           pDevMode->dmTTOption);
  316.             AddRow(_T("          dmCollate"),       _T("%d"),           pDevMode->dmCollate);
  317.             AddRow(_T("          dmFormName"),      (const TCHAR *) pDevMode->dmFormName);
  318.  
  319.             AddRow(_T("          dmLogPixels"),     _T("%d dpi"),       pDevMode->dmLogPixels);
  320.             AddRow(_T("          dmBitsPerPel"),    _T("%d bpp"),       pDevMode->dmBitsPerPel);
  321.             AddRow(_T("          dmPelsWidth"),     _T("%d pixels"),    pDevMode->dmPelsWidth);
  322.             AddRow(_T("          dmPelsHeight"),    _T("%d pixels"),    pDevMode->dmPelsHeight);
  323.             AddRow(_T("          dmNup"),           _T("%d"),           pDevMode->dmNup);
  324.  
  325.             AddRow(_T("          dmICMMethod"),     _T("%d"),           pDevMode->dmICMMethod);
  326.             AddRow(_T("          dmICMIntent"),     _T("%d"),           pDevMode->dmICMIntent);
  327.             AddRow(_T("          dmMediaType"),     _T("%d"),           pDevMode->dmMediaType);
  328.             AddRow(_T("          dmDitherType"),    _T("%d"),           pDevMode->dmDitherType);
  329.         }
  330.  
  331.         POINT sz;
  332.         m_pSetup->GetPaperSize(sz);
  333.         AddRow(_T("PAGESETUPDLG.ptPaperSize"),  _T("{ %d, %d }"),   sz.x, sz.y);
  334.  
  335.         RECT margin;
  336.         m_pSetup->GetMinMargin(margin);
  337.         AddRow(_T("             rtMinMargin"), _T("( %d, %d, %d, %d }"), 
  338.             margin.left,  margin.top, margin.right, margin.bottom);
  339.  
  340.         m_pSetup->GetMargin(margin);
  341.         AddRow(_T("             rtMargin"), _T("( %d, %d, %d, %d }"), 
  342.             margin.left,  margin.top, margin.right, margin.bottom);
  343.  
  344.         HDC hDC = m_pSetup->CreatePrinterDC();
  345.  
  346.         AddDeviceCaps(hDC, _T("HORZSIZE"),   _T("%d mm"), HORZSIZE);
  347.         AddDeviceCaps(hDC, _T("VERTSIZE"),   _T("%d mm"), VERTSIZE);
  348.         AddDeviceCaps(hDC, _T("HORZRES"),    _T("%d pixel"), HORZRES);
  349.         AddDeviceCaps(hDC, _T("VERTRES"),    _T("%d pixel"), VERTRES);
  350.         AddDeviceCaps(hDC, _T("LOGPIXELSX"), _T("%d dpi"), LOGPIXELSX);
  351.         AddDeviceCaps(hDC, _T("LOGPIXELSY"), _T("%d dpi"), LOGPIXELSY);
  352.         AddDeviceCaps(hDC, _T("BITSPIXEL"),  _T("%d bpp"), BITSPIXEL);
  353.         AddDeviceCaps(hDC, _T("PLANES"),     _T("%d"),     PLANES);
  354.  
  355.         AddDeviceCaps(hDC, _T("PHYSICALWIDTH"),   _T("%d pixels"), PHYSICALWIDTH); 
  356.         AddDeviceCaps(hDC, _T("PHYSICALHEIGHT"),  _T("%d pixels"), PHYSICALHEIGHT);
  357.         AddDeviceCaps(hDC, _T("PHYSICALOFFSETX"), _T("%d pixels"), PHYSICALOFFSETX);
  358.         AddDeviceCaps(hDC, _T("PHYSICALOFFSETY"), _T("%d pixels"), PHYSICALOFFSETY);
  359.  
  360.         {
  361.             DWORD ul = CHECKJPEGFORMAT;
  362.                                 
  363.             if ( ExtEscape(hDC, QUERYESCSUPPORT,  sizeof(ul), (char *) &ul, 0, 0) > 0)
  364.                 AddDeviceCaps(hDC, _T("JPEG support"), _T("Yes"), 0);
  365.             else
  366.                 AddDeviceCaps(hDC, _T("JPEG support"), _T("No"), 0);
  367.         }
  368.         
  369.         DeleteDC(hDC);
  370.     }
  371.  
  372.     void ShowProperties(int type)
  373.     {
  374.         HWND hWnd = GetDlgItem(m_hWnd, m_pControlID[2]);
  375.  
  376.         int index = SendMessage(hWnd, LB_GETCURSEL, 0, 0);
  377.  
  378.         if ( index<0 )
  379.             index = 0;
  380.  
  381.         TCHAR PrinterName[MAX_PATH];
  382.  
  383.         PrinterName[0] = 0;
  384.  
  385.         SendMessage(hWnd, LB_GETTEXT, index, (LPARAM) PrinterName);
  386.  
  387.         if ( PrinterName[0]==0 )
  388.             return;
  389.  
  390.         switch ( type )
  391.         {
  392.             case 0:
  393.                 {
  394.                     HANDLE hPrinter;
  395.                     OpenPrinter(PrinterName, & hPrinter, NULL);
  396.                     PrinterProperties(m_hWnd, hPrinter);
  397.                     ClosePrinter(hPrinter);
  398.                 }
  399.                 break;
  400.  
  401.             case 1:
  402.             case 2:
  403.                 {
  404.                     DEVMODE * pDevMode = GetDEVMODE(PrinterName, type);
  405.  
  406.                     if ( pDevMode )
  407.                         delete [] (BYTE *) pDevMode;
  408.                 }
  409.         }
  410.     }
  411.  
  412.     void AddDeviceCaps(HDC hDC, const TCHAR * name, const TCHAR * format, int index)
  413.     {
  414.         int value = GetDeviceCaps(hDC, index);
  415.  
  416.         TCHAR temp[128];
  417.         wsprintf(temp, _T("GetDeviceCaps(%s)"), name);
  418.  
  419.         AddRow(temp, format, value);
  420.     }
  421.  
  422.     virtual BOOL DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  423.     {
  424.         switch (uMsg)
  425.         {
  426.             case WM_INITDIALOG:
  427.                 m_hWnd = hWnd;
  428.  
  429.                 ShowAttributes();
  430.                 
  431.                 {
  432.                     TCHAR temp[MAX_PATH];
  433.  
  434.                     DWORD size = MAX_PATH;
  435.                     GetDefaultPrinter(temp, & size);
  436.                     SetDlgItemText(hWnd, m_pControlID[1], temp);
  437.                 }
  438.  
  439.                 ListPrinters(GetDlgItem(hWnd, m_pControlID[2]));
  440.                 return TRUE;
  441.  
  442.             case WM_COMMAND:
  443.                 if ( LOWORD(wParam)==m_pControlID[3] )
  444.                     ShowProperties(0);
  445.                 else if ( LOWORD(wParam)==m_pControlID[4] )
  446.                     ShowProperties(1);
  447.                 else if ( LOWORD(wParam)==m_pControlID[5] )
  448.                     ShowProperties(2);
  449.                 else switch ( LOWORD(wParam) )
  450.                 {
  451.                     case IDOK: 
  452.                         EndDialog(hWnd, LOWORD(wParam));
  453.                         return TRUE;
  454.                 }
  455.         }
  456.  
  457.         return FALSE;
  458.     }
  459.  
  460. public:
  461.     
  462.     KProperty(KOutputSetup & setup, int nControlID[])
  463.     {
  464.         m_pSetup         = & setup;
  465.         m_pControlID     = nControlID;
  466.     }
  467. };
  468.  
  469.  
  470. void ShowProperty(KOutputSetup & setup, HINSTANCE hInst, int nControlID[], int dialogres)
  471. {
  472.     KProperty property(setup, nControlID);
  473.  
  474.     property.Dialogbox(hInst, MAKEINTRESOURCE(dialogres));
  475. }
  476.