Annotation of mstools/samples/cdtest/print.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.