|
|
1.1 root 1: #include "PortTool.h"
2:
3: HWND hCancelDlg = 0;
4:
5:
6: // get default printer configuration and save in hWnd extra bytes for use later
7: BOOL WINAPI GetPrinterConfig (
8: HWND hWnd)
9: {
10: char lpszAppName[25];
11: char lpszDeviceName[25];
12: char lpszDefPtr[MAXPTRDEFINITION];
13: char lpszDevice[MAXPTRDEVICE];
14: char lpszDriver[MAXPTRDRIVER];
15: char lpszPort[MAXPTRPORT];
16: HANDLE hDevNames;
17:
18: LoadString ((HANDLE)GetModuleHandle (NULL),
19: IDS_WINDOWSAPPNAME,
20: lpszAppName,
21: sizeof (lpszAppName));
22: LoadString ((HANDLE)GetModuleHandle (NULL),
23: IDS_DEVICENAME,
24: lpszDeviceName,
25: sizeof (lpszDeviceName));
26:
27: // get default printer from WIN.INI and parse into separate strings
28: if(GetProfileString (lpszAppName, lpszDeviceName, "", lpszDefPtr, sizeof (lpszDefPtr)))
29: {
30: strcpy (lpszDevice, strtok (lpszDefPtr, ","));
31: strcpy (lpszDriver, strtok (lpszDefPtr, ","));
32: strcpy (lpszPort, strtok (lpszDefPtr, ""));
33: }
34:
35: // if invalid strings, remove config and exit
36: if (!*lpszDevice || !*lpszDriver || !*lpszPort)
37: {
38: if (hDevNames = (HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES))
39: {
40: LocalFree (hDevNames);
41: SetWindowLong (hWnd, WL_HPTRDEVNAMES, NULL);
42: }
43: return FALSE;
44: }
45:
46: // allocate memory for DEVNAMES structure and strings
47: if (hDevNames = (HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES))
48: hDevNames = LocalReAlloc (hDevNames,
49: strlen (lpszDevice) + 1 +
50: strlen (lpszDriver) + 1 +
51: strlen (lpszPort) + 1 +
52: sizeof (DEVNAMES),
53: LHND);
54: else
55: hDevNames = LocalAlloc (LHND,
56: strlen (lpszDevice) + 1 +
57: strlen (lpszDriver) + 1 +
58: strlen (lpszPort) + 1 +
59: sizeof (DEVNAMES));
60:
61: // fill out DEVNAMES structure and keep in window extra bytes
62: if (hDevNames)
63: {
64: DEVNAMES *lpdn;
65: char *lpsz;
66:
67: lpdn = (DEVNAMES *)LocalLock (hDevNames);
68: lpdn->wDeviceOffset = 0;
69: lpdn->wDriverOffset = lpdn->wDeviceOffset + sizeof (lpszDevice) + 1;
70: lpdn->wOutputOffset = lpdn->wDriverOffset + sizeof (lpszDriver) + 1;
71: lpdn->wDefault = 1;
72: lpsz = (char *)(lpdn++);
73: strcpy (lpsz, lpszDevice);
74: lpsz++;
75: strcpy (lpsz, lpszDriver);
76: lpsz++;
77: strcpy (lpsz, lpszPort);
78:
79: LocalUnlock (hDevNames);
80: SetWindowLong (hWnd, WL_HPTRDEVNAMES, (LONG)hDevNames);
81: }
82: else
83: {
84: SetWindowLong (hWnd, WL_HPTRDEVNAMES, NULL);
85: return FALSE;
86: }
87:
88: return TRUE;
89: }
90:
91:
92:
93: // abort proc called by gdi during print download process
94: int WINAPI AbortProc (
95: HDC hdc,
96: int nErr)
97: {
98: BOOL fContinue = TRUE;
99: MSG msg;
100:
101: // process messages for cancel dialog and other apps
102: while (PeekMessage (&msg, NULL, NULL, NULL, PM_REMOVE))
103: {
104: if (msg.message == UM_CANCELPRINT)
105: {
106: fContinue = FALSE;
107: break;
108: }
109:
110: else if (!hCancelDlg || !IsDialogMessage (hCancelDlg, &msg))
111: {
112: TranslateMessage (&msg);
113: DispatchMessage (&msg);
114: }
115: }
116:
117: return fContinue;
118: }
119:
120:
121:
122:
123: BOOL WINAPI CancelDlgProc (
124: HWND hWnd,
125: UINT uMsg,
126: UINT uParam,
127: LONG lParam)
128: {
129:
130: switch (uMsg)
131: {
132: case WM_INITDIALOG:
133: {
134: char *lpdn;
135: char lpszTitle[MAX_PATH];
136:
137: // initialize dialog control information
138: lpdn = LocalLock ((HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES));
139: SetDlgItemText (hWnd,
140: IDC_PRINTDEVICE,
141: lpdn + sizeof (DEVNAMES) +
142: ((DEVNAMES *)lpdn)->wDeviceOffset);
143: SetDlgItemText (hWnd,
144: IDC_PRINTPORT,
145: lpdn + sizeof (DEVNAMES) +
146: ((DEVNAMES *)lpdn)->wOutputOffset);
147: LocalUnlock ((HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES));
148: GetWindowText (hWnd, lpszTitle, sizeof (lpszTitle));
149: SetDlgItemText (hWnd, IDC_PRINTTITLE, lpszTitle);
150: }
151: break;
152:
153: case WM_COMMAND:
154: // if cancel button selected, post message to cancel print job
155: if (LOWORD (uParam) == IDCANCEL)
156: {
157: PostMessage (GetParent (hWnd), UM_CANCELPRINT, 0, 0);
158: DestroyWindow (hWnd);
159: }
160: break;
161:
162: default:
163: return FALSE;
164: }
165: return TRUE;
166: }
167:
168:
169:
170: // put up the print common dialog, and print
171: int WINAPI PrintFile (
172: HWND hWnd)
173: {
174: char *lpEditData;
175: HANDLE hEditData;
176: SIZE sLine;
177: int yLineExt;
178: int yExt;
179: int yPageExt;
180: UINT uLine;
181: UINT uNumLines;
182: UINT uOffset;
183: UINT uLineLen;
184: HWND hWndEdit;
185: PRINTDLG pdPrint;
186: DOCINFO diPrint;
187: char lpszJobName[MAX_PATH];
188:
189:
190: // call common print dialog to get initialized printer DC
191: pdPrint.lStructSize = sizeof (PRINTDLG);
192: pdPrint.hwndOwner = hWnd;
193: pdPrint.hDevMode = NULL;
194: pdPrint.hDevNames = (HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES);
195: pdPrint.hDC = NULL;
196: pdPrint.Flags = PD_RETURNDC;
197: pdPrint.nFromPage = 0;
198: pdPrint.nToPage = 0;
199: pdPrint.nMinPage = 0;
200: pdPrint.nMaxPage = 0;
201: pdPrint.nCopies = 0;
202: pdPrint.hInstance = (HANDLE)GetModuleHandle (NULL);
203: pdPrint.lCustData = NULL;
204: pdPrint.lpfnPrintHook = NULL;
205: pdPrint.lpfnSetupHook = NULL;
206: pdPrint.lpPrintTemplateName = NULL;
207: pdPrint.lpSetupTemplateName = NULL;
208: pdPrint.hPrintTemplate = NULL;
209: pdPrint.hSetupTemplate = NULL;
210:
211: // call common print dialog
212: if (!PrintDlg (&pdPrint))
213: return IDS_PTRCOMMDLGFAILED;
214:
215: // start cancel dialog box
216: hCancelDlg = CreateDialog ((HANDLE)GetModuleHandle (NULL),
217: IDD_CANCELDLG,
218: hWnd,
219: CancelDlgProc);
220:
221:
222: if (!hCancelDlg)
223: return IDS_CANCELDLGFAILED;
224:
225: ShowWindow (hCancelDlg, SW_SHOW);
226: UpdateWindow (hCancelDlg);
227:
228: // set AbortProc callback
229: if (SetAbortProc (pdPrint.hDC, (PROC)AbortProc) < 0)
230: {
231: // on error, clean up and go away
232: DestroyWindow (hCancelDlg);
233: DeleteDC (pdPrint.hDC);
234: return IDS_SETABORTPROCFAILED;
235: }
236:
237: // initialize printer for job
238: GetWindowText (hWnd, lpszJobName, sizeof (lpszJobName));
239: diPrint.cbSize = sizeof (DOCINFO);
240: diPrint.lpszDocName = lpszJobName;
241: diPrint.lpszOutput = NULL;
242: if (StartDoc (pdPrint.hDC, &diPrint) == SP_ERROR)
243: {
244: // on error, clean up and go away
245: DestroyWindow (hCancelDlg);
246: DeleteDC (pdPrint.hDC);
247: return IDS_STARTDOCFAILED;
248: }
249:
250: // job started, so display cancel dialog
251: ShowWindow (hCancelDlg, SW_SHOW);
252: UpdateWindow (hCancelDlg);
253:
254: // retrieve dimensions for printing and init loop variables
255: hWndEdit = (HWND)GetWindowLong(hWnd, WL_HWNDEDIT);
256: hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0L);
257: uNumLines = (WORD)SendMessage (hWndEdit, EM_GETLINECOUNT, 0, 0L);
258: GetTextExtentPoint (pdPrint.hDC, "CC", 2, &sLine);
259: yLineExt = sLine.cy;
260: yPageExt = GetDeviceCaps (pdPrint.hDC, VERTRES);
261: yExt = 0;
262: uLine = 0;
263:
264: // print text line by line from top to bottom
265: while (uLine < uNumLines)
266: {
267: // if at end of page, start a new page
268: if ((yExt + yLineExt) > yPageExt)
269: {
270: if (!EndPage (pdPrint.hDC))
271: {
272: DestroyWindow (hCancelDlg);
273: DeleteDC (pdPrint.hDC);
274: return IDS_PRINTABORTED;
275: }
276: yExt = 0;
277: }
278:
279: // determine buffer offset for current line and line length
280: uOffset = SendMessage (hWndEdit, EM_LINEINDEX, uLine, 0);
281: uLineLen = SendMessage (hWndEdit, EM_LINELENGTH, uOffset, 0);
282: lpEditData = (char *)LocalLock (hEditData) + uOffset;
283:
284: // print current the line and unlock the text handle
285: TextOut (pdPrint.hDC, 0, yExt, lpEditData, uLineLen);
286: LocalUnlock (hEditData);
287:
288: // increment page position
289: yExt += yLineExt;
290: uLine++;
291: }
292:
293: // end the last page and document
294: EndPage (pdPrint.hDC);
295: EndDoc (pdPrint.hDC);
296:
297: // end cancel dialog box, clean up and exit
298: DestroyWindow (hCancelDlg);
299: DeleteDC(pdPrint.hDC);
300: return TRUE;
301: }
302:
303:
304:
305: // printer setup common dialog
306: int WINAPI PrinterSetup (
307: HWND hWnd)
308: {
309: PRINTDLG pdPrint;
310:
311: // call common print dialog to get initialized printer DC
312: pdPrint.lStructSize = sizeof (PRINTDLG);
313: pdPrint.hwndOwner = hWnd;
314: pdPrint.hDevMode = NULL;
315: pdPrint.hDevNames = (HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES);
316: pdPrint.hDC = NULL;
317: pdPrint.Flags = PD_PRINTSETUP;
318: pdPrint.nFromPage = 0;
319: pdPrint.nToPage = 0;
320: pdPrint.nMinPage = 0;
321: pdPrint.nMaxPage = 0;
322: pdPrint.nCopies = 0;
323: pdPrint.hInstance = (HANDLE)GetModuleHandle (NULL);
324: pdPrint.lCustData = NULL;
325: pdPrint.lpfnPrintHook = NULL;
326: pdPrint.lpfnSetupHook = NULL;
327: pdPrint.lpPrintTemplateName = NULL;
328: pdPrint.lpSetupTemplateName = NULL;
329: pdPrint.hPrintTemplate = NULL;
330: pdPrint.hSetupTemplate = NULL;
331:
332: // call common print dialog
333: if (!PrintDlg (&pdPrint) && CommDlgExtendedError ())
334: return IDS_PTRCOMMDLGFAILED;
335: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.