|
|
1.1 root 1: /*******************************************************************************
2: * *
3: * MODULE : Print.c *
4: * *
5: * DESCRIPTION : Routines used for printing. *
6: * *
7: * FUNCTIONS : GetPrinterDC() - Gets default printer from WIN.INI and *
8: * creates a DC for it. *
9: * *
10: * InitPrinting() - Initializes print job. *
11: * *
12: * TermPrinting() - Terminates print job. *
13: * *
14: * PrintDlgProc() - Dialog function for the "Cancel Printing" *
15: * dialog. *
16: * *
17: * AbortProc() - Peeks at message queue for messages from *
18: * the print dialog. *
19: * *
20: *******************************************************************************/
21:
22: #include <windows.h>
23: #include <string.h>
24: #include "showdib.h"
25:
26: FARPROC lpfnAbortProc = NULL;
27: FARPROC lpfnPrintDlgProc = NULL;
28: HWND hWndParent = NULL;
29: HWND hDlgPrint = NULL;
30: BOOL bError;
31: BOOL bUserAbort;
32:
33:
34: BOOL APIENTRY AbortProc (HDC, SHORT);
35: BOOL APIENTRY PrintDlgProc (HWND, WORD, UINT, DWORD);
36:
37: /****************************************************************************
38: * *
39: * FUNCTION : GetPrinterDC() *
40: * *
41: * PURPOSE : Read WIN.INI for default printer and create a DC for it. *
42: * *
43: * RETURNS : A handle to the DC if successful or NULL otherwise. *
44: * *
45: ****************************************************************************/
46: HDC PASCAL GetPrinterDC()
47: {
48: static CHAR szPrinter [80];
49: CHAR *szDevice, *szDriver, *szOutput;
50:
51: GetProfileString ("windows", "device", "", szPrinter, sizeof(szPrinter));
52:
53: if ((szDevice = strtok (szPrinter, "," )) &&
54: (szDriver = strtok (NULL, ", ")) &&
55: (szOutput = strtok (NULL, ", ")))
56:
57: return CreateDC (szDriver, szDevice, szOutput, NULL) ;
58:
59: return NULL;
60: }
61: /****************************************************************************
62: * *
63: * FUNCTION : InitPrinting(HDC hDC, HWND hWnd, HANDLE hInst, LPSTR msg) *
64: * *
65: * PURPOSE : Makes preliminary driver calls to set up print job. *
66: * *
67: * RETURNS : TRUE - if successful. *
68: * FALSE - otherwise. *
69: * *
70: ****************************************************************************/
71: BOOL PASCAL InitPrinting(HDC hDC, HWND hWnd, HANDLE hInst, LPSTR msg)
72: {
73:
74: bError = FALSE; /* no errors yet */
75: bUserAbort = FALSE; /* user hasn't aborted */
76:
77: hWndParent = hWnd; /* save for Enable at Term time */
78:
79: #ifdef WIN16
80: lpfnPrintDlgProc = MakeProcInstance (PrintDlgProc, hInst);
81: lpfnAbortProc = MakeProcInstance (AbortProc, hInst);
82: #endif
83: hDlgPrint = CreateDialog (hInst, "PRTDLG", hWndParent, (WNDPROC)lpfnPrintDlgProc);
84:
85: if (!hDlgPrint)
86: return FALSE;
87:
88: SetWindowText (hDlgPrint, msg);
89: EnableWindow (hWndParent, FALSE); /* disable parent */
90:
91: if ((Escape (hDC, SETABORTPROC, 0, (LPSTR)lpfnAbortProc, NULL) > 0) &&
92: (Escape (hDC, STARTDOC, lstrlen(msg), msg, NULL) > 0))
93: bError = FALSE;
94: else
95: bError = TRUE;
96:
97: /* might want to call the abort proc here to allow the user to
98: * abort just before printing begins */
99: return TRUE;
100: }
101: /****************************************************************************
102: * *
103: * FUNCTION : TermPrinting(HDC hDC) *
104: * *
105: * PURPOSE : Terminates print job. *
106: * *
107: ****************************************************************************/
108: VOID PASCAL TermPrinting(HDC hDC)
109: {
110: if (!bError)
111: Escape(hDC, ENDDOC, 0, NULL, NULL);
112:
113: if (bUserAbort)
114: Escape (hDC, ABORTDOC, 0, NULL, NULL) ;
115: else {
116: EnableWindow(hWndParent, TRUE);
117: DestroyWindow(hDlgPrint);
118: }
119:
120: FreeProcInstance(lpfnAbortProc);
121: FreeProcInstance(lpfnPrintDlgProc);
122: }
123: /****************************************************************************
124: * *
125: * FUNCTION :PrintDlgProc (HWND, unsigned , WORD , DWORD ) *
126: * *
127: * PURPOSE :Dialog function for the "Cancel Printing" dialog. It sets *
128: * the abort flag if the user presses <Cancel>. *
129: * *
130: ****************************************************************************/
131: BOOL APIENTRY PrintDlgProc (HWND hDlg, WORD iMessage, UINT wParam, DWORD lParam)
132: {
133: switch (iMessage) {
134: case WM_INITDIALOG:
135:
136: EnableMenuItem (GetSystemMenu (hDlg, FALSE), (WORD)SC_CLOSE, (WORD)MF_GRAYED);
137: break;
138:
139: case WM_COMMAND:
140: bUserAbort = TRUE;
141: EnableWindow (hWndParent, TRUE);
142: DestroyWindow (hDlg);
143: hDlgPrint = 0;
144: break;
145:
146: default:
147: return FALSE;
148: }
149: return TRUE;
150: UNREFERENCED_PARAMETER(wParam);
151: UNREFERENCED_PARAMETER(lParam);
152: }
153:
154: /****************************************************************************
155: * *
156: * FUNCTION :AbortProc (HDC hPrnDC, short nCode) *
157: * *
158: * PURPOSE :Checks message queue for messages from the "Cancel Printing"*
159: * dialog. If it sees a message, (this will be from a print *
160: * cancel command), it terminates. *
161: * *
162: * RETURNS :Inverse of Abort flag *
163: * *
164: ****************************************************************************/
165: BOOL APIENTRY AbortProc (HDC hPrnDC, SHORT nCode)
166: {
167: MSG msg;
168:
169: while (!bUserAbort && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
170: if (!hDlgPrint || !IsDialogMessage(hDlgPrint, &msg)) {
171: TranslateMessage (&msg);
172: DispatchMessage (&msg);
173: }
174: }
175: return !bUserAbort;
176: UNREFERENCED_PARAMETER(hPrnDC);
177: UNREFERENCED_PARAMETER(nCode);
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.