|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.