home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / cmddlg / cdtest / print.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-17  |  35.6 KB  |  1,357 lines

  1. /************************************************************************
  2.  
  3.   File: print.c
  4.  
  5.   Purpose:  To manage CDTEST's print dialog box.
  6.  
  7.  
  8.   Functions:
  9.  
  10.     DoPrintDlg()            -- Creates CDTEST's print dialog box.
  11.  
  12.     PrintProc()             -- Callback function for CDTEST's print dialog box.
  13.  
  14.     DevnamesProc()          -- Callback function for CDTESTS Devnames dlg box.
  15.  
  16.     DevmodeProc()           -- Callback function for CDTESTS Devmode dlg box.
  17.  
  18.     InitPrintStruct()       -- Fills a PRINTDLG struct with some default values.
  19.  
  20.     FillPrintDlg()          -- Fills CDTEST's print dialog with contents of a
  21.                                PRINTDLG structure.
  22.  
  23.     GetPrintDlg()           -- Retrieves the users edits from CDTEST's print dlg.
  24.  
  25.     FillDevnamesDlg()       -- Fills CDTEST's Devnames dialog with the contents
  26.                                of a DEVNAMES structure.
  27.  
  28.     GetDevnamesDlg()        -- Retrieves the user's edits from CDTEST's devnames dlg.
  29.  
  30.     FillDevmodeDlg()        -- Fills CDTEST's devmode dialog with the contents of
  31.                                a DEVMODE structure.
  32.  
  33.     GetDevmodeDlg()         -- Retrieves the user's edits from CDTEST's devmode dlg.
  34.  
  35.     GetPrintDlgHandle()     -- Loads and returns a handle to a Print dlg custom template.
  36.  
  37.     GetSetupDlgHandle()     -- Loads and returns a handle to a Setup dlg custom template.
  38.  
  39.     PrintHookProc()         -- Callback function for PRINTDLG->lpfnPrintHook and
  40.                                for PRINTDLG->lpfnSetupHook
  41.  
  42.     PrintMultiProc1()       -- Starting address for multithread option thread 1
  43.  
  44.     PrintMultiProc2()       -- Starting address for multithread option thread 2
  45.  
  46.     MultiThreadPrintDlg()   -- Creates two threads which each call PrintDlg()
  47.  
  48.     EnablePrintControls()   -- Enables or disables CDTEST's print dlg controls.
  49.  
  50.     DoPrintDlgStuff()       -- Calls PrintDlg()
  51.  
  52. ************************************************************************/
  53.  
  54.  
  55. #include <windows.h>
  56. #include <commdlg.h>
  57. #include <stdlib.h>
  58. #include <winnls.h>
  59. #include "cdtest.h"
  60. #include "print.h"
  61. #include "devnames.h"
  62. #include "devmode.h"
  63. #include "dlgs.h"
  64.  
  65.  
  66.  
  67. /* Externs, prototypes, variable declarations for print.c */
  68.  
  69. extern UINT uMode ;
  70. extern LONG MyAtol(LPTSTR, BOOL, LPBOOL) ;
  71. UINT APIENTRY PrintHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) ;
  72. void InitPrintStruct(HWND, LPPRINTDLG) ;
  73. void FillPrintDlg(HWND, LPPRINTDLG) ;
  74. void GetPrintDlg(HWND, LPPRINTDLG) ;
  75. void FillDevnamesDlg(HWND, LPPRINTDLG) ;
  76. void GetDevnamesDlg(HWND, LPPRINTDLG) ;
  77. void FillDevmodeDlg(HWND, LPPRINTDLG) ;
  78. void GetDevmodeDlg(HWND, LPPRINTDLG) ;
  79. HANDLE GetPrintDlgHandle(void) ;
  80. HANDLE GetSetupDlgHandle(void) ;
  81. void DoPrintDlgStuff(HWND, LPPRINTDLG) ;
  82.  
  83. HANDLE hResPrint ;
  84. HANDLE hDialogPrint ;
  85. PRINTDLG pd ;
  86. HANDLE hDevNames ;
  87. HANDLE hDevMode ;
  88.  
  89. TCHAR szDriverOffset[100] ;
  90. TCHAR szDeviceOffset[100] ;
  91. TCHAR szOutputOffset[100] ;
  92. TCHAR szPrintTempName[40] ;
  93. TCHAR szSetupTempName[40] ;
  94.  
  95.  
  96. /* Multithreading function declarations, variables */
  97.  
  98. DWORD PrintMultiProc1(LPDWORD) ;
  99. DWORD PrintMultiProc2(LPDWORD) ;
  100. void MultiThreadPrintDlg(void) ;
  101. void EnablePrintControls(HWND, BOOL) ;
  102.  
  103. HANDLE hPrintThread1 ;
  104. HANDLE hPrintThread2 ;
  105. DWORD dwPrintThreadID1 ;
  106. DWORD dwPrintThreadID2 ;
  107. DWORD dwPrintThreadParm1 ;
  108. DWORD dwPrintThreadParm2 ;
  109. PRINTDLG pdThread1 ;
  110. PRINTDLG pdThread2 ;
  111. HWND hwndMainPrint ;
  112. int nOpenDialogCount ;
  113.  
  114. HBRUSH hBrushDlg ;
  115. HBRUSH hBrushEdit ;    //brush handles for new colors done with hook proc
  116. HBRUSH hBrushButton ;
  117.  
  118.  
  119.  
  120.  
  121.  
  122. /************************************************************************
  123.  
  124.   Function: DoPrintDialog(HWND)
  125.  
  126.   Purpose:  Creates CDTEST's print dialog box.
  127.  
  128.   Returns:  Nothing.
  129.  
  130.   Comments: There is only one dialog for both Print Setup and Print Print.
  131.             The Print Print dialog is the default.  To create the Print
  132.             Setup dialog, enter the value for PD_PRINTSETUP into the
  133.             "Flags" edit box and click OK.
  134.  
  135. ************************************************************************/
  136.  
  137. void DoPrintDialog(HWND hwnd)
  138. {
  139.  
  140.  
  141.   DialogBox(hInst, MAKEINTRESOURCE(ID_PRINTDIALOG),
  142.             hwnd, PrintProc) ;
  143.  
  144. }
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152. /************************************************************************
  153.  
  154.   Function: PrintProc(HWND, UINT, UINT, LONG)
  155.  
  156.   Purpose:  Callback function for CDTEST's print dialog box.
  157.  
  158.   Returns:  TRUE or FALSE depending on the situation/message.
  159.  
  160.   Comments:
  161.  
  162. ************************************************************************/
  163.  
  164. BOOL APIENTRY PrintProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  165. {
  166.   switch (msg)
  167.   {
  168.     case WM_INITDIALOG:
  169.  
  170.         InitPrintStruct(hwnd, &pd) ;
  171.         FillPrintDlg(hwnd, &pd) ;
  172.  
  173.         *(&pdThread1) = *(&pdThread2) = *(&pd) ;
  174.  
  175.         hwndMainPrint = hwnd ;
  176.  
  177.         nOpenDialogCount = 0 ;
  178.  
  179.         SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEP)) ;
  180.  
  181.         break ;
  182.  
  183.  
  184.     case UMSG_DECREMENTDLGCOUNT: //user defined message that is send when
  185.                                  //each thread created when multithreading ends
  186.         nOpenDialogCount-- ;
  187.  
  188.         if (nOpenDialogCount == 0)               //once both multitheading dlgs
  189.             EnablePrintControls(hwnd, TRUE) ;   //are done, enable the controls again
  190.  
  191.         break ;
  192.  
  193.  
  194.     case WM_COMMAND:
  195.     {
  196.         switch (LOWORD(wParam))
  197.         {
  198.           case IDOK:
  199.             GetPrintDlg(hwnd, &pd) ;
  200.             DoPrintDlgStuff(hwnd, &pd) ;
  201.             break ;
  202.  
  203.           case IDCANCEL:
  204.  
  205.             if (pd.hDC)
  206.               ReleaseDC(hwnd, pd.hDC) ;
  207.  
  208.             EndDialog(hwnd, FALSE) ;
  209.             break ;
  210.  
  211.           case ID_RESETPRINT:
  212.             SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEP)) ;
  213.             InitPrintStruct(hwnd, &pd) ;
  214.             FillPrintDlg(hwnd, &pd) ;
  215.             SendDlgItemMessage(hwnd, ID_PRESETUPP,   BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
  216.             SendDlgItemMessage(hwnd, ID_PREPRINTP,   BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
  217.             SendDlgItemMessage(hwnd, ID_NULLSTRUCTP, BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
  218.             break ;
  219.  
  220.           case ID_EDITDEVNAMES:
  221.             DialogBox(hInst, MAKEINTRESOURCE(ID_DEVNAMESDIALOG),
  222.                       hwnd, DevnamesProc) ;
  223.             break ;
  224.  
  225.           case ID_EDITDEVMODE:
  226.             DialogBox(hInst, MAKEINTRESOURCE(ID_DEVMODEDIALOG),
  227.                       hwnd, DevmodeProc) ;
  228.             break ;
  229.  
  230.           case ID_MULTITHREADPRINT:
  231.             nOpenDialogCount = 2 ;
  232.             EnablePrintControls(hwnd, FALSE) ;
  233.             MultiThreadPrintDlg() ;
  234.             break ;
  235.  
  236.           default: break ;
  237.         }
  238.     }
  239.  
  240.     default:
  241.  
  242.       /* If the help button is pressed in the PrintDlg() dialog box,
  243.          it will send a message Registered with RegisterWindowMessage()
  244.          to the parent window.  The message nHelpMessage was registered
  245.          at application startup */
  246.  
  247.       if (msg == nHelpMessage)
  248.         MessageBox(GetForegroundWindow(), TEXT("Hello from the help button"),
  249.                    TEXT("Print Help Button"), MB_OK | MB_APPLMODAL) ;
  250.       break ;
  251.   }
  252.  
  253.   return FALSE ;
  254. }
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263. /************************************************************************
  264.  
  265.   Function: DevnamesProc(HWND, UINT, UINT, LONG)
  266.  
  267.   Purpose:  Callback function for the Devnames dialog box
  268.  
  269.   Returns:  TRUE or FALSE depending on situation / message
  270.  
  271.   Comments:
  272.  
  273. ************************************************************************/
  274.  
  275. BOOL APIENTRY DevnamesProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  276. {
  277.   switch (msg)
  278.   {
  279.     case WM_INITDIALOG:
  280.         FillDevnamesDlg(hwnd, &pd) ;
  281.         break ;
  282.  
  283.     case WM_COMMAND:
  284.     {
  285.         switch (LOWORD(wParam))
  286.         {
  287.           case IDOK:
  288.             GetDevnamesDlg(hwnd, &pd) ;
  289.             EndDialog(hwnd, TRUE) ;
  290.             break ;
  291.  
  292.           case IDCANCEL:
  293.             EndDialog(hwnd, FALSE) ;
  294.             break ;
  295.  
  296.           default: break ;
  297.         }
  298.     }
  299.  
  300.     default: break ;
  301.   }
  302.  
  303.   return FALSE ;
  304. }
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311. /************************************************************************
  312.  
  313.   Function: DevmodeProc(HWND, UINT, UINT, LONG)
  314.  
  315.   Purpose:  Callback function for the Devmode dialog box
  316.  
  317.   Returns:  TRUE or FALSE depending on situation / message
  318.  
  319.   Comments:
  320.  
  321. ************************************************************************/
  322.  
  323. BOOL APIENTRY DevmodeProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  324. {
  325.   switch (msg)
  326.   {
  327.     case WM_INITDIALOG:
  328.         FillDevmodeDlg(hwnd, &pd) ;
  329.         break ;
  330.  
  331.     case WM_COMMAND:
  332.     {
  333.         switch (LOWORD(wParam))
  334.         {
  335.           case IDOK:
  336.             GetDevmodeDlg(hwnd, &pd) ;
  337.             EndDialog(hwnd, TRUE) ;
  338.             break ;
  339.  
  340.           case IDCANCEL:
  341.             EndDialog(hwnd, FALSE) ;
  342.             break ;
  343.  
  344.           default: break ;
  345.         }
  346.     }
  347.  
  348.     default: break ;
  349.   }
  350.  
  351.   return FALSE ;
  352. }
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361. /************************************************************************
  362.  
  363.   Function: InitPrintStruct(HWND, LPPRINTDLG)
  364.  
  365.   Purpose:  Fills a PRINTDLG structure with some default values.
  366.  
  367.   Returns:  Nothing.
  368.  
  369.   Comments:
  370.  
  371.     In order to fill in the hDevMode and hDevNames PRINTDLG structure
  372.     elements, a call to PrintDlg() must be made with the
  373.     (PD_RETURNDEFAULT | PD_RETURNDC) flag bits set.
  374.  
  375. ************************************************************************/
  376.  
  377. void InitPrintStruct(HWND hwnd, LPPRINTDLG ppd)
  378. {
  379.   DWORD dwTempFlags = 0 ;
  380.  
  381.   ppd->lStructSize = sizeof(PRINTDLG) ;
  382.   ppd->hwndOwner = hwnd ;
  383.   ppd->hDevMode = (HANDLE) 0 ;
  384.   ppd->hDevNames = (HANDLE) 0 ;
  385.   ppd->hDC = (HDC) 0 ;
  386.   ppd->Flags = PD_RETURNDC | PD_COLLATE | PD_SHOWHELP | PD_PAGENUMS ;
  387.   ppd->nFromPage = 1 ;
  388.   ppd->nToPage = 10 ;
  389.   ppd->nMinPage = 0 ;
  390.   ppd->nMaxPage = 9 ;
  391.   ppd->nCopies = 1000 ;
  392.   ppd->hInstance = (HANDLE) hInst ;
  393.   ppd->lCustData = 0L ;
  394.  
  395.   ppd->lpfnPrintHook = PrintHookProc ;
  396.   ppd->lpfnSetupHook = PrintHookProc ;
  397.  
  398.   lstrcpy(szPrintTempName, TEXT("prtemp1")) ;
  399.   ppd->lpPrintTemplateName = szPrintTempName ;
  400.  
  401.   lstrcpy(szSetupTempName, TEXT("prtemp2")) ;
  402.   ppd->lpSetupTemplateName = szSetupTempName ;
  403.  
  404.   ppd->hPrintTemplate = (HANDLE) 0 ;   //these are unknown right now
  405.   ppd->hSetupTemplate = (HANDLE) 0 ;
  406.  
  407.  
  408.   /* Let's fill the hDevMode and hDevNames structures. */
  409.   /* This call should just return handles to structures of this */
  410.   /* type filled with the info for the default printer */
  411.  
  412.   dwTempFlags = ppd->Flags ;
  413.   ppd->Flags = PD_RETURNDEFAULT | PD_RETURNDC ;
  414.   PrintDlg(ppd) ;
  415.  
  416.   ppd->Flags = dwTempFlags ;
  417. }
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425. /************************************************************************
  426.  
  427.   Function: FillPrintDlg(HWND, LPPRINTDLG)
  428.  
  429.   Purpose:  Fills CDTEST's print dialog with the contents of a
  430.             PRINTDLG structure.
  431.  
  432.   Returns:  Nothing.
  433.  
  434.   Comments:
  435.  
  436. ************************************************************************/
  437.  
  438.  
  439. void FillPrintDlg(HWND hwnd, LPPRINTDLG ppd)
  440. {
  441.   wsprintf(szTemp, szLongFilter, ppd->lStructSize) ;
  442.   SetDlgItemText(hwnd, ID_STRUCTSIZEP, szTemp) ;
  443.  
  444.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hwndOwner) ;
  445.   SetDlgItemText(hwnd, ID_HWNDOWNERP, szTemp) ;
  446.  
  447.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDevMode) ;
  448.   SetDlgItemText(hwnd, ID_HDEVMODEP, szTemp) ;
  449.  
  450.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDevNames) ;
  451.   SetDlgItemText(hwnd, ID_HDEVNAMESP, szTemp) ;
  452.  
  453.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDC) ;
  454.   SetDlgItemText(hwnd, ID_HDCP, szTemp) ;
  455.  
  456.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->Flags) ;
  457.   SetDlgItemText(hwnd, ID_FLAGSP, szTemp) ;
  458.  
  459.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->nFromPage) ;
  460.   SetDlgItemText(hwnd, ID_FROMPAGEP, szTemp) ;
  461.  
  462.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->nToPage) ;
  463.   SetDlgItemText(hwnd, ID_TOPAGEP, szTemp) ;
  464.  
  465.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->nMinPage) ;
  466.   SetDlgItemText(hwnd, ID_MINPAGEP, szTemp) ;
  467.  
  468.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->nMaxPage) ;
  469.   SetDlgItemText(hwnd, ID_MAXPAGEP, szTemp) ;
  470.  
  471.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->nCopies) ;
  472.   SetDlgItemText(hwnd, ID_COPIESP, szTemp) ;
  473.  
  474.   wsprintf(szTemp, szLongFilter, ppd->hInstance) ;
  475.   SetDlgItemText(hwnd, ID_HINSTANCEP, szTemp) ;
  476.  
  477.   wsprintf(szTemp, szLongFilter, ppd->lCustData) ;
  478.   SetDlgItemText(hwnd, ID_CUSTDATAP, szTemp) ;
  479.  
  480.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->lpfnPrintHook) ;
  481.   SetDlgItemText(hwnd, ID_PRINTHOOKP, szTemp) ;
  482.  
  483.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->lpfnSetupHook) ;
  484.   SetDlgItemText(hwnd, ID_SETUPHOOKP, szTemp) ;
  485.  
  486.   SetDlgItemText(hwnd, ID_LPPRINTTEMPP, ppd->lpPrintTemplateName) ;
  487.  
  488.   SetDlgItemText(hwnd, ID_LPSETUPTEMPP, ppd->lpSetupTemplateName) ;
  489.  
  490.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hPrintTemplate) ;
  491.   SetDlgItemText(hwnd, ID_HPRINTTEMPP, szTemp) ;
  492.  
  493.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hSetupTemplate) ;
  494.   SetDlgItemText(hwnd, ID_HSETUPTEMPP, szTemp) ;
  495. }
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505. /************************************************************************
  506.  
  507.   Function: GetPrintDlg(HWND, LPPRINTDLG)
  508.  
  509.   Purpose:  Fills a PRINTDLG structure with the users choices in CDTEST's
  510.             print dialog box.
  511.  
  512.   Returns:  Nothing.
  513.  
  514.   Comments:
  515.  
  516. ************************************************************************/
  517.  
  518. void GetPrintDlg(HWND hwnd, LPPRINTDLG ppd)
  519. {
  520.   BOOL b ;
  521.   TCHAR szNum[20] ;
  522.  
  523.   #define WMAX 20
  524.  
  525.   GetDlgItemText(hwnd, ID_STRUCTSIZEP, szNum, WMAX) ;
  526.   ppd->lStructSize = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  527.  
  528.   GetDlgItemText(hwnd, ID_HWNDOWNERP, szNum, WMAX) ;
  529.   ppd->hwndOwner = (HWND) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  530.  
  531.   GetDlgItemText(hwnd, ID_HDEVMODEP, szNum, WMAX) ;
  532.   ppd->hDevMode = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  533.  
  534.   GetDlgItemText(hwnd, ID_HDEVNAMESP, szNum, WMAX) ;
  535.   ppd->hDevNames = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  536.  
  537.   GetDlgItemText(hwnd, ID_HDCP, szNum, WMAX) ;
  538.   ppd->hDC = (HDC) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  539.  
  540.   GetDlgItemText(hwnd, ID_FLAGSP, szNum, WMAX) ;
  541.   ppd->Flags = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  542.  
  543.   GetDlgItemText(hwnd, ID_FROMPAGEP, szNum, WMAX) ;
  544.   ppd->nFromPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  545.  
  546.   GetDlgItemText(hwnd, ID_TOPAGEP, szNum, WMAX) ;
  547.   ppd->nToPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  548.  
  549.   GetDlgItemText(hwnd, ID_MINPAGEP, szNum, WMAX) ;
  550.   ppd->nMinPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  551.  
  552.   GetDlgItemText(hwnd, ID_MAXPAGEP, szNum, WMAX) ;
  553.   ppd->nMaxPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  554.  
  555.   GetDlgItemText(hwnd, ID_COPIESP, szNum, WMAX) ;
  556.   ppd->nCopies = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  557.  
  558.   GetDlgItemText(hwnd, ID_HINSTANCEP, szNum, WMAX) ;
  559.   ppd->hInstance = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  560.  
  561.   GetDlgItemText(hwnd, ID_CUSTDATAP, szNum, WMAX) ;
  562.   ppd->lCustData = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  563.  
  564.   GetDlgItemText(hwnd, ID_PRINTHOOKP, szNum, WMAX) ;
  565.   ppd->lpfnPrintHook = (LPPRINTHOOKPROC) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  566.  
  567.   GetDlgItemText(hwnd, ID_SETUPHOOKP, szNum, WMAX) ;
  568.   ppd->lpfnSetupHook = (LPSETUPHOOKPROC) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  569.  
  570.   GetDlgItemText(hwnd, ID_LPPRINTTEMPP, szPrintTempName, 100) ;
  571.  
  572.   GetDlgItemText(hwnd, ID_LPSETUPTEMPP, szSetupTempName, 100) ;
  573.  
  574.   GetDlgItemText(hwnd, ID_HPRINTTEMPP, szNum, WMAX) ;
  575.   ppd->hPrintTemplate = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  576.  
  577.   GetDlgItemText(hwnd, ID_HSETUPTEMPP, szNum, WMAX) ;
  578.   ppd->hSetupTemplate = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  579.  
  580. }
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589. /************************************************************************
  590.  
  591.   Function: FillDevnamesDlg(HWND, LPPRINTDLG)
  592.  
  593.   Purpose:  Fills CDTEST's devnames dialog box with the values in
  594.             The hDevNames structure member of a PRINTDLG structure.
  595.  
  596.   Returns:  Nothing.
  597.  
  598.   Comments:
  599.  
  600. ************************************************************************/
  601.  
  602.  
  603. void FillDevnamesDlg(HWND hwnd, LPPRINTDLG ppd)
  604. {
  605.   LPDEVNAMES pn = (LPDEVNAMES) 0 ;
  606.  
  607.   if (ppd->hDevNames == (HANDLE) 0)
  608.     return ;
  609.  
  610.   pn = (LPDEVNAMES) GlobalLock(ppd->hDevNames) ;
  611.   if (pn == (LPDEVNAMES) NULL) return ;
  612.  
  613.  
  614.   /* To find the strings in this block of memory, add the correct
  615.      offset to the original pointer returned by GlobalLock() */
  616.  
  617.   SetDlgItemText(hwnd, ID_WDRIVEROFF, (LPTSTR) pn + pn->wDriverOffset) ;
  618.  
  619.   SetDlgItemText(hwnd, ID_WDEVICEOFF, (LPTSTR) pn + pn->wDeviceOffset) ;
  620.  
  621.   SetDlgItemText(hwnd, ID_WOUTPUTOFF, (LPTSTR) pn + pn->wOutputOffset) ;
  622.  
  623.  
  624.   wsprintf(szTemp, szShortFilter, (int) pn->wDefault) ;
  625.   SetDlgItemText(hwnd, ID_WDEFAULT, szTemp) ;
  626.  
  627.  
  628.   GlobalUnlock(ppd->hDevNames) ;
  629. }
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637. /************************************************************************
  638.  
  639.   Function: GetDevnamesDlg(HWND, LPPRINTDLG)
  640.  
  641.   Purpose:  Retrieves the user's choices in CDTEST's devnames dialog box,
  642.             Allocates some memory to hold a new DEVNAMES structure, fills
  643.             the users choices into the new DEVNAMES structure, and sets
  644.             the hDevNames member of a PRINTDLG structure to this new
  645.             memory handle.
  646.  
  647.  
  648.   Returns:  Nothing.
  649.  
  650.   Comments:
  651.  
  652. ************************************************************************/
  653.  
  654. void GetDevnamesDlg(HWND hwnd, LPPRINTDLG ppd)
  655. {
  656.   BOOL b ;
  657.   TCHAR szNum[30] ;
  658.   LPDEVNAMES pn ;
  659.   TCHAR sz1[100] ;
  660.   TCHAR sz2[100] ;
  661.   TCHAR sz3[100] ;
  662.   DWORD dwSize ;
  663.   int n1, n2, n3 ;
  664.  
  665.   GetDlgItemText(hwnd, ID_WDRIVEROFF, sz1, 100) ;
  666.   GetDlgItemText(hwnd, ID_WDEVICEOFF, sz2, 100) ;
  667.   GetDlgItemText(hwnd, ID_WOUTPUTOFF, sz3, 100) ;
  668.  
  669.   n1 = lstrlen(sz1) ;
  670.   n2 = lstrlen(sz2) ;
  671.   n3 = lstrlen(sz3) ;
  672.  
  673.   if (hDevNames)
  674.   {
  675.     GlobalFree(hDevNames) ;
  676.     hDevNames = (HANDLE) 0 ;
  677.   }
  678.  
  679.  
  680.   /* allocate size of everything + 5 extra bytes for zeroes */
  681.  
  682.   dwSize = sizeof(DEVNAMES) + ((n1+n2+n3+5) * sizeof(TCHAR)) ;
  683.  
  684.  
  685.   /* Allocate the memory and lock it down */
  686.  
  687.   if (!(hDevNames = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize)))
  688.   {
  689.     MessageBox(hwnd, TEXT("Can't Alloc memory for hDevNames!"),
  690.                TEXT("Fatal Error!"), MB_OK | MB_APPLMODAL) ;
  691.     return ;
  692.   }
  693.  
  694.   if (!(pn = (LPDEVNAMES) GlobalLock(hDevNames)))
  695.   {
  696.     MessageBox(hwnd, TEXT("Can't Lock New hDevNames memory!"),
  697.                TEXT("Fatal Error"), MB_OK | MB_APPLMODAL) ;
  698.  
  699.     GlobalFree(hDevNames) ;
  700.  
  701.     hDevNames = (HANDLE) 0 ;
  702.  
  703.     return ;
  704.   }
  705.  
  706.  
  707.   /* skip over devnames and copy string 1 there.  Make sure to
  708.      divide by sizeof(TCHAR) or the compiler will create a pointer
  709.      that points too far if you compile as a UNICODE program */
  710.  
  711.   pn->wDriverOffset = sizeof(DEVNAMES) / sizeof(TCHAR) ;
  712.   lstrcpy((LPTSTR) pn + pn->wDriverOffset, (LPTSTR) sz1) ;
  713.  
  714.  
  715.  
  716.   /* skip over string 1 and add string 1 with a zero between them */
  717.  
  718.   pn->wDeviceOffset = pn->wDriverOffset + n1 + 1 ;
  719.   lstrcpy((LPTSTR) pn + pn->wDeviceOffset, (LPTSTR) sz2) ;
  720.  
  721.  
  722.  
  723.   /* skip over string 2 and put string 3 there with a zero between them */
  724.  
  725.   pn->wOutputOffset = pn->wDeviceOffset + n2 + 1 ;
  726.   lstrcpy((LPTSTR) pn + pn->wOutputOffset, (LPTSTR) sz3) ;
  727.  
  728.  
  729.   GetDlgItemText(hwnd, ID_WDEFAULT, szNum, 30) ;
  730.   pn->wDefault = (WORD) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  731.  
  732.   GlobalUnlock(hDevNames) ;
  733.  
  734.   ppd->hDevNames = hDevNames ;
  735.  
  736.   wsprintf(szTemp, szLongFilter, ppd->hDevNames) ;
  737.   SetDlgItemText(GetParent(hwnd), ID_HDEVNAMESP, szTemp) ;
  738.  
  739. }
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746. /************************************************************************
  747.  
  748.   Function: FillDevmodeDlg(HWND, LPPRINTDLG)
  749.  
  750.   Purpose: Fills CDTEST's devmode dialog with the contents of the DEVMODE
  751.            structure handle of a PRINTDLG structure.
  752.  
  753.  
  754.   Returns:  Nothing.
  755.  
  756.   Comments:
  757.  
  758. ************************************************************************/
  759.  
  760. void FillDevmodeDlg(HWND hwnd, LPPRINTDLG ppd)
  761. {
  762.   LPDEVMODE p ;
  763.  
  764.   if (ppd->hDevMode == (HANDLE) 0)
  765.     return ;
  766.  
  767.   p = (LPDEVMODE) GlobalLock(ppd->hDevMode) ;
  768.   if (p == (LPDEVMODE) NULL) return ;
  769.  
  770.   SetDlgItemText(hwnd, ID_DMDEVNAME, (LPTSTR) p->dmDeviceName) ;
  771.  
  772.   wsprintf(szTemp, szShortFilter, (int) p->dmSpecVersion) ;
  773.   SetDlgItemText(hwnd, ID_DMSPECVER, szTemp) ;
  774.  
  775.   wsprintf(szTemp, szShortFilter, (int) p->dmDriverVersion) ;
  776.   SetDlgItemText(hwnd, ID_DMDRIVERVER, szTemp) ;
  777.  
  778.   wsprintf(szTemp, szShortFilter, (int) p->dmSize) ;
  779.   SetDlgItemText(hwnd, ID_DMSIZEDEV, szTemp) ;
  780.  
  781.   wsprintf(szTemp, szShortFilter, (int) p->dmDriverExtra) ;
  782.   SetDlgItemText(hwnd, ID_DMDRIVEREXTRA, szTemp) ;
  783.  
  784.   wsprintf(szTemp, szShortFilter, (int) p->dmFields) ;
  785.   SetDlgItemText(hwnd, ID_DMFIELDS, szTemp) ;
  786.  
  787.   wsprintf(szTemp, szShortFilter, (int) p->dmOrientation) ;
  788.   SetDlgItemText(hwnd, ID_DMORIENTATION, szTemp) ;
  789.  
  790.   wsprintf(szTemp, szShortFilter, (int) p->dmPaperSize) ;
  791.   SetDlgItemText(hwnd, ID_DMPAPERSIZE, szTemp) ;
  792.  
  793.   wsprintf(szTemp, szLongFilter, p->dmPaperLength) ;
  794.   SetDlgItemText(hwnd, ID_DMPAPERLENGTH, szTemp) ;
  795.  
  796.   wsprintf(szTemp, szLongFilter, p->dmPaperWidth) ;
  797.   SetDlgItemText(hwnd, ID_DMPAPERWIDTH, szTemp) ;
  798.  
  799.   wsprintf(szTemp, szLongFilter, p->dmScale) ;
  800.   SetDlgItemText(hwnd, ID_DMSCALE, szTemp) ;
  801.  
  802.   wsprintf(szTemp, szLongFilter, p->dmCopies) ;
  803.   SetDlgItemText(hwnd, ID_DMCOPIES, szTemp) ;
  804.  
  805.   wsprintf(szTemp, szLongFilter, p->dmDefaultSource) ;
  806.   SetDlgItemText(hwnd, ID_DMDEFAULTSOURCE, szTemp) ;
  807.  
  808.   wsprintf(szTemp, szLongFilter, p->dmPrintQuality) ;
  809.   SetDlgItemText(hwnd, ID_DMPRINTQUALITY, szTemp) ;
  810.  
  811.   wsprintf(szTemp, szLongFilter, p->dmColor) ;
  812.   SetDlgItemText(hwnd, ID_DMCOLOR, szTemp) ;
  813.  
  814.   wsprintf(szTemp, szLongFilter, p->dmDuplex) ;
  815.   SetDlgItemText(hwnd, ID_DMDUPLEX, szTemp) ;
  816.  
  817.   wsprintf(szTemp, szLongFilter, p->dmCollate) ;
  818.   SetDlgItemText(hwnd, ID_DMCOLLATE, szTemp) ;
  819.  
  820.   SetDlgItemText(hwnd, ID_DMFORMNAME, (LPTSTR) p->dmFormName) ;
  821.  
  822.   wsprintf(szTemp, szLongFilter, p->dmBitsPerPel) ;
  823.   SetDlgItemText(hwnd, ID_DMBITSPERPEL, szTemp) ;
  824.  
  825.   wsprintf(szTemp, szLongFilter, p->dmPelsWidth) ;
  826.   SetDlgItemText(hwnd, ID_DMPELSWIDTH, szTemp) ;
  827.  
  828.   wsprintf(szTemp, szLongFilter, p->dmPelsHeight) ;
  829.   SetDlgItemText(hwnd, ID_DMPELSHEIGHT, szTemp) ;
  830.  
  831.   wsprintf(szTemp, szLongFilter, p->dmDisplayFrequency) ;
  832.   SetDlgItemText(hwnd, ID_DMDISPLAYFREQ, szTemp) ;
  833.  
  834.   GlobalUnlock(ppd->hDevMode) ;
  835. }
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845. /************************************************************************
  846.  
  847.   Function: GetDevmodeDlg(HWND, LPPRINTDLG)
  848.  
  849.   Purpose:  Retrieves the user's edits in CDTEST's DEVMODE dialog box,
  850.             allocates memory for a new DEVMODE structure, fills that
  851.             memory with the user's edits, and puts a handle to that
  852.             memory in the hDevMode member of a PRINTDLG structure.
  853.  
  854.   Returns:  Nothing.
  855.  
  856.   Comments:
  857.  
  858. ************************************************************************/
  859.  
  860. void GetDevmodeDlg(HWND hwnd, LPPRINTDLG ppd)
  861. {
  862.   LPDEVMODE p ;
  863.   BOOL b ;
  864.   TCHAR szNum[30] ;
  865.  
  866.   #define WMAXDEV 30
  867.  
  868.   if (hDevMode)
  869.   {
  870.     GlobalFree(hDevMode) ;
  871.     hDevMode = (HANDLE) 0 ;
  872.   }
  873.  
  874.   if (!(hDevMode = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE, sizeof(DEVMODE))))
  875.   {
  876.     MessageBox(hwnd, TEXT("Can't allocate memory for hDevMode"),
  877.                TEXT("Fatal Error"), MB_OK | MB_APPLMODAL) ;
  878.     return ;
  879.   }
  880.  
  881.   if (!(p = (LPDEVMODE) GlobalLock(hDevMode)))
  882.   {
  883.     MessageBox(hwnd, TEXT("Can't lock memory for hDevMode"),
  884.                TEXT("Fatal Error"), MB_OK | MB_APPLMODAL) ;
  885.  
  886.     GlobalFree(hDevMode) ;
  887.     hDevMode = (HANDLE) 0 ;
  888.  
  889.     return ;
  890.   }
  891.  
  892.   GetDlgItemText(hwnd, ID_DMDEVNAME, p->dmDeviceName, 32) ;
  893.  
  894.   GetDlgItemText(hwnd, ID_DMSPECVER, szNum, WMAXDEV) ;
  895.   p->dmSpecVersion = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  896.  
  897.   GetDlgItemText(hwnd, ID_DMDRIVERVER, szNum, WMAXDEV) ;
  898.   p->dmDriverVersion = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  899.  
  900.   GetDlgItemText(hwnd, ID_DMSIZEDEV, szNum, WMAXDEV) ;
  901.   p->dmSize = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  902.  
  903.   GetDlgItemText(hwnd, ID_DMDRIVEREXTRA, szNum, WMAXDEV) ;
  904.   p->dmDriverExtra = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  905.  
  906.   GetDlgItemText(hwnd, ID_DMFIELDS, szNum, WMAXDEV) ;
  907.   p->dmFields = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  908.  
  909.   GetDlgItemText(hwnd, ID_DMORIENTATION, szNum, WMAXDEV) ;
  910.   p->dmOrientation = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  911.  
  912.   GetDlgItemText(hwnd, ID_DMPAPERSIZE, szNum, WMAXDEV) ;
  913.   p->dmPaperSize = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  914.  
  915.   GetDlgItemText(hwnd, ID_DMPAPERLENGTH, szNum, WMAXDEV) ;
  916.   p->dmPaperLength = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  917.  
  918.   GetDlgItemText(hwnd, ID_DMPAPERWIDTH, szNum, WMAXDEV) ;
  919.   p->dmPaperWidth = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  920.  
  921.   GetDlgItemText(hwnd, ID_DMSCALE, szNum, WMAXDEV) ;
  922.   p->dmScale = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  923.  
  924.   GetDlgItemText(hwnd, ID_DMCOPIES, szNum, WMAXDEV) ;
  925.   p->dmCopies = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  926.  
  927.   GetDlgItemText(hwnd, ID_DMDEFAULTSOURCE, szNum, WMAXDEV) ;
  928.   p->dmDefaultSource = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  929.  
  930.   GetDlgItemText(hwnd, ID_DMPRINTQUALITY, szNum, WMAXDEV) ;
  931.   p->dmPrintQuality = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  932.  
  933.   GetDlgItemText(hwnd, ID_DMCOLOR, szNum, WMAXDEV) ;
  934.   p->dmColor = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  935.  
  936.   GetDlgItemText(hwnd, ID_DMDUPLEX, szNum, WMAXDEV) ;
  937.   p->dmDuplex = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  938.  
  939.   GetDlgItemText(hwnd, ID_DMCOLLATE, szNum, WMAXDEV) ;
  940.   p->dmCollate = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  941.  
  942.   GetDlgItemText(hwnd, ID_DMFORMNAME, p->dmFormName, 32) ;
  943.  
  944.   GetDlgItemText(hwnd, ID_DMBITSPERPEL, szNum, WMAXDEV) ;
  945.   p->dmBitsPerPel = (USHORT) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  946.  
  947.   GetDlgItemText(hwnd, ID_DMPELSWIDTH, szNum, WMAXDEV) ;
  948.   p->dmPelsWidth = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  949.  
  950.   GetDlgItemText(hwnd, ID_DMPELSHEIGHT, szNum, WMAXDEV) ;
  951.   p->dmPelsHeight = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  952.  
  953.   GetDlgItemText(hwnd, ID_DMDISPLAYFREQ, szNum, WMAXDEV) ;
  954.   p->dmDisplayFrequency = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  955.  
  956.   GlobalUnlock(hDevMode) ;
  957.   ppd->hDevMode = hDevMode ;
  958.  
  959.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDevMode) ;
  960.   SetDlgItemText(GetParent(hwnd), ID_HDEVMODEP, szTemp) ;
  961. }
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968. /************************************************************************
  969.  
  970.   Function: GetPrintDlgHandle(void)
  971.  
  972.   Purpose:  Finds the custom Print dialog template in the EXE, loads it
  973.             into a handle, and returns the handle.
  974.  
  975.   Returns:  Nothing.
  976.  
  977.   Comments:
  978.  
  979. ************************************************************************/
  980.  
  981. HANDLE GetPrintDlgHandle(void)
  982. {
  983.   hResPrint = FindResource(hInst, TEXT("prtemp1"), RT_DIALOG) ;
  984.  
  985.   hDialogPrint = LoadResource(hInst, hResPrint) ;
  986.  
  987.  
  988.   return hDialogPrint ;
  989. }
  990.  
  991.  
  992.  
  993.  
  994.  
  995.  
  996.  
  997.  
  998. /************************************************************************
  999.  
  1000.   Function: GetSetupDlgHandle(void)
  1001.  
  1002.   Purpose:  Finds the custom Setup dialog template in the EXE, loads it
  1003.             into a handle, and returns the handle.
  1004.  
  1005.   Returns:  Nothing.
  1006.  
  1007.   Comments:
  1008.  
  1009. ************************************************************************/
  1010.  
  1011. HANDLE GetSetupDlgHandle(void)
  1012. {
  1013.   hResPrint = FindResource(hInst, TEXT("prtemp2"), RT_DIALOG) ;
  1014.  
  1015.   hDialogPrint = LoadResource(hInst, hResPrint) ;
  1016.  
  1017.   return hDialogPrint ;
  1018. }
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027. /************************************************************************
  1028.  
  1029.   Function: PrintHookProc(HWND, UINT, UINT, LONG)
  1030.  
  1031.   Purpose:  A callback function that will receive messages intended for
  1032.             the PrintDlg() dialog boxes before the normal common dialog
  1033.             routine receives them.
  1034.  
  1035.  
  1036.   Returns:  FALSE to allow the common dialogs to process the message
  1037.             with its normal logic.  TRUE to discard the message.
  1038.  
  1039.   Comments:
  1040.  
  1041.      To enable this function for the Print dialog in CDTEST, enter the
  1042.      value for PD_ENABLEPRINTHOOK in the "Flags" edit box.
  1043.  
  1044.      To enable this function for the Setup dialog in CDTEST, enter the
  1045.      value for (PD_ENABLESETUPHOOK | PD_PRINTSETUP) in the "Flags" edit box.
  1046.  
  1047. ************************************************************************/
  1048.  
  1049. UINT APIENTRY PrintHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  1050. {
  1051.   LPPRINTDLG pPr ;
  1052.   TCHAR szMsg[50] ;
  1053.  
  1054.   switch(msg)
  1055.   {
  1056.     case WM_INITDIALOG:
  1057.  
  1058.       pPr = (LPPRINTDLG) lParam ;
  1059.  
  1060.       if (pPr->lCustData != 0)
  1061.       {
  1062.         wsprintf(szMsg, TEXT("PRINTDLG->lCustData is: %ld"), pPr->lCustData) ;
  1063.  
  1064.         MessageBox(hwnd, szMsg, TEXT("lCustData Sent!"), MB_OK | MB_APPLMODAL) ;
  1065.       }
  1066.  
  1067.       SetWindowText(hwnd, TEXT("Print Hook Proc Dialog")) ;
  1068.  
  1069.       break ;
  1070.  
  1071.     /* use the WM_CTLCOLOR* messages to change the color of the Open
  1072.        dialog */
  1073.  
  1074.     case WM_CTLCOLORDLG:
  1075.  
  1076.         if (!hBrushDlg)
  1077.             hBrushDlg = GetStockObject(LTGRAY_BRUSH) ;
  1078.  
  1079.         return (UINT) hBrushDlg ;
  1080.  
  1081.         break ;
  1082.  
  1083.  
  1084.     case WM_CTLCOLORBTN:
  1085.  
  1086.         SetBkMode((HDC) wParam, TRANSPARENT) ;   //sets background color
  1087.                                                  //for push and check box
  1088.                                                  //buttons...
  1089.  
  1090.         if (!hBrushButton)
  1091.             hBrushButton = GetStockObject(LTGRAY_BRUSH) ;
  1092.  
  1093.         return (UINT) hBrushButton ;
  1094.  
  1095.         break ;
  1096.  
  1097.  
  1098.     case WM_CTLCOLORSTATIC:
  1099.  
  1100.         SetTextColor((HDC) wParam, RGB(0x00, 0xff, 0x00)) ;  //green
  1101.         SetBkMode((HDC) wParam, TRANSPARENT) ;               //transparent text
  1102.  
  1103.         if (!hBrushDlg)
  1104.             hBrushDlg = GetStockObject(LTGRAY_BRUSH) ;
  1105.  
  1106.         return (UINT) hBrushDlg ;
  1107.  
  1108.         break ;
  1109.  
  1110.  
  1111.     default:
  1112.       break ;
  1113.   }
  1114.  
  1115.   return FALSE ;   //send msg to the common dialog code
  1116. }
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125. /************************************************************************
  1126.  
  1127.   Function: PrintMultiProc1(LPDWORD)
  1128.  
  1129.   Purpose:  Is the starting address for the first new thread when
  1130.             multithreading.
  1131.  
  1132.   Returns:  Any DWORD value.
  1133.  
  1134.   Comments:
  1135.             The new thread will start executing here and will end when
  1136.             the PrintDlg() function returns and it has posted a message
  1137.             to the CDTEST's print dialog window saying that one of the
  1138.             two multithreading dialogs been terminated.
  1139.  
  1140. ************************************************************************/
  1141.  
  1142. DWORD PrintMultiProc1(LPDWORD pdw)
  1143. {
  1144.   GetPrintDlg(hwndMainPrint, &pdThread1) ;
  1145.  
  1146.   DoPrintDlgStuff(hwndMainPrint, &pdThread1) ;
  1147.  
  1148.   PostMessage(hwndMainPrint, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
  1149.  
  1150.   return 0L ;
  1151. }
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161. /************************************************************************
  1162.  
  1163.   Function: PrintMultiProc2(LPDWORD)
  1164.  
  1165.   Purpose:  Is the starting address for the second new thread when
  1166.             multithreading.
  1167.  
  1168.   Returns:  Any DWORD value.
  1169.  
  1170.   Comments:
  1171.             The new thread will start executing here and will end when
  1172.             the PrintDlg() function returns and it has posted a message
  1173.             to the CDTEST's print dialog window saying that one of the
  1174.             two multithreading dialogs been terminated.
  1175.  
  1176. ************************************************************************/
  1177.  
  1178. DWORD PrintMultiProc2(LPDWORD pdw)
  1179. {
  1180.   GetPrintDlg(hwndMainPrint, &pdThread2) ;
  1181.  
  1182.   DoPrintDlgStuff(hwndMainPrint, &pdThread2) ;
  1183.  
  1184.   PostMessage(hwndMainPrint, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
  1185.  
  1186.   return 0L ;
  1187. }
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196. /************************************************************************
  1197.  
  1198.   Function: MultiThreadPrintDlg(void)
  1199.  
  1200.   Purpose:  Is the starting address for the first new thread when
  1201.             multithreading.
  1202.  
  1203.   Returns:  Any DWORD value.
  1204.  
  1205.   Comments:
  1206.             The new thread will start executing here and will end when
  1207.             the PrintDlg() function returns and it has posted a message
  1208.             to the CDTEST's print dialog window saying that one of the
  1209.             two multithreading dialogs been terminated.
  1210.  
  1211. ************************************************************************/
  1212.  
  1213. void MultiThreadPrintDlg(void)
  1214. {
  1215.  
  1216.   dwPrintThreadParm1 = dwPrintThreadParm2 = 0L ;
  1217.  
  1218.   if (!(hPrintThread1 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
  1219.                                      (LPTHREAD_START_ROUTINE) PrintMultiProc1,
  1220.                                      &dwPrintThreadParm1, CREATE_SUSPENDED, &dwPrintThreadID1)))
  1221.  
  1222.   {
  1223.     MessageBox(GetForegroundWindow(), TEXT("Error creating thread 1"), NULL,
  1224.                MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  1225.  
  1226.     nOpenDialogCount = 0 ;
  1227.  
  1228.     EnablePrintControls(hwndMainPrint, TRUE) ;
  1229.  
  1230.     return ;
  1231.   }
  1232.  
  1233.  
  1234.   if (!(hPrintThread2 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
  1235.                                      (LPTHREAD_START_ROUTINE) PrintMultiProc2,
  1236.                                      &dwPrintThreadParm2, CREATE_SUSPENDED, &dwPrintThreadID2)))
  1237.   {
  1238.     MessageBox(GetForegroundWindow(), TEXT("Error creating thread 2"), NULL,
  1239.                MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  1240.  
  1241.     nOpenDialogCount = 0 ;
  1242.  
  1243.     EnablePrintControls(hwndMainPrint, TRUE) ;
  1244.  
  1245.     return ;
  1246.   }
  1247.  
  1248.   ResumeThread(hPrintThread1) ;
  1249.  
  1250.   ResumeThread(hPrintThread2) ;
  1251.  
  1252.   return ;
  1253. }
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261. /************************************************************************
  1262.  
  1263.   Function: EnablePrintControls(HWND, BOOL)
  1264.  
  1265.   Purpose:  Enable or disable CDTEST's print dialog's controls.
  1266.  
  1267.   Returns:  Nothing.
  1268.  
  1269.   Comments: This is necessary when CDTEST is multithreading.
  1270.  
  1271. ************************************************************************/
  1272.  
  1273. void EnablePrintControls(HWND hwnd, BOOL bEnable)
  1274. {
  1275.   EnableWindow(GetDlgItem(hwnd, IDOK), bEnable) ;
  1276.   EnableWindow(GetDlgItem(hwnd, IDCANCEL), bEnable) ;
  1277.   EnableWindow(GetDlgItem(hwnd, ID_RESETPRINT), bEnable) ;
  1278.   EnableWindow(GetDlgItem(hwnd, ID_MULTITHREADPRINT), bEnable) ;
  1279.   EnableWindow(GetDlgItem(hwnd, ID_EDITDEVMODE), bEnable) ;
  1280.   EnableWindow(GetDlgItem(hwnd, ID_EDITDEVNAMES), bEnable) ;
  1281. }
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288. /************************************************************************
  1289.  
  1290.   Function: DoPrintDlgStuff(HWND, LPPRINTDLG)
  1291.  
  1292.   Purpose:  Calls PrintDlg() with the correct parameters.
  1293.  
  1294.   Returns:  Nothing.
  1295.  
  1296.   Comments:
  1297.  
  1298. ************************************************************************/
  1299.  
  1300.  
  1301. void DoPrintDlgStuff(HWND hwnd, LPPRINTDLG ppd)
  1302. {
  1303.   BOOL bRet = FALSE ;
  1304.  
  1305.  
  1306.   /* Figure out how the user want's to call PrintDlg() */
  1307.  
  1308.   if (IsDlgButtonChecked(hwnd, ID_PREPRINTP) == 1)
  1309.     ppd->hPrintTemplate = GetPrintDlgHandle() ;
  1310.  
  1311.   if (IsDlgButtonChecked(hwnd, ID_PRESETUPP) == 1)
  1312.     ppd->hSetupTemplate = GetSetupDlgHandle() ;
  1313.  
  1314.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hPrintTemplate) ;
  1315.   SetDlgItemText(hwnd, ID_HPRINTTEMPP, szTemp) ;
  1316.  
  1317.   wsprintf(szTemp, szLongFilter, (DWORD) ppd->hSetupTemplate) ;
  1318.   SetDlgItemText(hwnd, ID_HSETUPTEMPP, szTemp) ;
  1319.  
  1320.  
  1321.  
  1322.   /* Call the function */
  1323.  
  1324.   if (IsDlgButtonChecked(hwnd, ID_NULLSTRUCTP) == 1)
  1325.     bRet = PrintDlg((LPPRINTDLG) NULL) ;
  1326.   else
  1327.     bRet = PrintDlg(ppd) ;
  1328.  
  1329.  
  1330.  
  1331.   /* Clean up and show results */
  1332.  
  1333.   wsprintf(szTemp, szLongFilter, CommDlgExtendedError()) ;
  1334.   SetDlgItemText(hwnd, ID_ERRORP, szTemp) ;
  1335.  
  1336.   SetDlgItemInt(hwnd, ID_RETURNP, bRet, TRUE) ;
  1337.  
  1338.   if (hDialogPrint)
  1339.   {
  1340.     FreeResource(hDialogPrint) ; //obsolete call, but
  1341.     hDialogPrint = (HANDLE) 0 ;  //it's possible that this
  1342.     hResPrint = (HANDLE) 0 ;    //might be recompiled for win 3.x
  1343.   }
  1344.  
  1345.   pd.hDevMode = ppd->hDevMode ;    //need to fix this so that FillDevnamesDlg()
  1346.   pd.hDevNames = ppd->hDevNames ;  //and FillDevmodeDlg() work...
  1347.  
  1348.   FillPrintDlg(hwnd, ppd) ;
  1349.  
  1350.   if (ppd->hDC)  //release the HDC after its value is
  1351.                  //returned to the test app
  1352.   {
  1353.     ReleaseDC(ppd->hwndOwner, ppd->hDC) ;
  1354.     ppd->hDC = (HDC) 0 ;
  1355.   }
  1356. }
  1357.