source: trunk/dll/printer.c@ 689

Last change on this file since 689 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: printer.c 574 2007-03-23 22:37:07Z gyoung $
5
6 Print file list
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2006 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 17 Jul 06 SHL Use Runtime_Error
13 03 Nov 06 SHL Renames
14 03 Nov 06 SHL Count thread usage
15 22 Mar 07 GKY Use QWL_USER
16
17***********************************************************************/
18
19#define INCL_DOS
20#define INCL_WIN
21
22#include <os2.h>
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26#include <stdio.h>
27#include <io.h>
28#include <share.h>
29#include <string.h>
30#include "fm3dll.h"
31#include "fm3dlg.h"
32#include "fm3str.h"
33
34#pragma data_seg(DATA1)
35
36static PSZ pszSrcFile = __FILE__;
37
38#pragma alloc_text(PRINTER,PrinterReady,SayPrinterReady)
39#pragma alloc_text(PRINTER2,PrintListThread)
40#pragma alloc_text(PRINTER3,PrintDlgProc)
41
42static HMTX PrintSem = 0;
43
44BOOL PrinterReady(CHAR * printdevname)
45{
46 FILE *printhandle;
47 CHAR param = 0, data = 0;
48 ULONG datalen = 1L, parmlen = 1L, htype, flagword;
49
50 if (!fWorkPlace) /* assume spooler is active */
51 return TRUE;
52 DosError(FERR_DISABLEHARDERR);
53 printhandle = xfopen(printdevname, "a+", pszSrcFile, __LINE__);
54 if (printhandle) {
55 if (!strnicmp(printdevname, "COM", 3) && isdigit(printdevname[3])) {
56 fclose(printhandle);
57 return TRUE;
58 }
59 if (!DosQueryHType(fileno(printhandle), &htype, &flagword) &&
60 !(htype & 7)) {
61 fclose(printhandle);
62 return TRUE;
63 }
64 if (DosDevIOCtl(fileno(printhandle), 5L, 0x00000066, (PVOID) & param,
65 1L, &parmlen, (PVOID) & data, 1L,
66 &datalen) != 0x00000100) {
67 fclose(printhandle);
68 return FALSE;
69 }
70 fclose(printhandle);
71 if (data & 32) /* bit 5 is out of paper */
72 return FALSE;
73 return TRUE;
74 }
75 return FALSE;
76}
77
78BOOL SayPrinterReady(HWND hwnd)
79{
80 if (!hwnd)
81 hwnd = HWND_DESKTOP;
82 if (!PrinterReady(printer)) {
83 saymsg(MB_ENTER | MB_ICONEXCLAMATION,
84 hwnd,
85 GetPString(IDS_NOTETEXT), GetPString(IDS_PRINTERNOTREADYTEXT));
86 return FALSE;
87 }
88 return TRUE;
89}
90
91//=== PrintListThread - background-print a list of files ===
92
93VOID PrintListThread(VOID * arg)
94{
95 HAB hab2;
96 HMQ hmq2;
97 LISTINFO *li = (LISTINFO *) arg;
98 register INT x;
99 FILE *fpi, *fpo;
100 CHAR s[CCHMAXPATH + 80];
101 FILESTATUS3 fs3;
102 LONG cols, lines, pages, z, lmargin, rmargin;
103 BOOL endline, endpage, startpage, skipping, firstpass;
104 int c;
105 APIRET rc = MBID_YES;
106
107 if (StopPrinting)
108 goto Abort;
109 if (!PrintSem) {
110 if (DosCreateMutexSem(NULL, &PrintSem, 0, FALSE)) {
111 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
112 "DosCreateMutexSem");
113 goto Abort;
114 }
115 }
116 priority_normal();
117 hab2 = WinInitialize(0);
118 if (hab2) {
119 hmq2 = WinCreateMsgQueue(hab2, 0);
120 if (hmq2) {
121 WinCancelShutdown(hmq2, TRUE);
122 IncrThreadUsage();
123 if (li && li->list && li->list[0]) {
124 AddNote(GetPString(IDS_PRINTINGLISTTEXT));
125 for (x = 0; li->list[x]; x++) {
126 if (rc == MBID_CANCEL)
127 break;
128 DosError(FERR_DISABLEHARDERR);
129 if (DosQueryPathInfo
130 (li->list[x], FIL_STANDARD, &fs3, (ULONG) sizeof(fs3))
131 || (fs3.attrFile & FILE_DIRECTORY) || !fs3.cbFile)
132 continue;
133 if (StopPrinting)
134 break;
135 DosRequestMutexSem(PrintSem, 240000L);
136 if (StopPrinting)
137 break;
138 if (!PrinterReady(li->targetpath))
139 Runtime_Error(pszSrcFile, __LINE__, "printer %s error",
140 li->targetpath);
141 else {
142 fpi = _fsopen(li->list[x], "r", SH_DENYWR);
143 if (!fpi)
144 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
145 li->list[x]);
146 else {
147 fpo = _fsopen(li->targetpath, "a+", SH_DENYRW);
148 if (!fpo)
149 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
150 li->targetpath);
151 else {
152 sprintf(s, GetPString(IDS_PRINTINGTEXT), li->list[x]);
153 AddNote(s);
154 firstpass = TRUE;
155 skipping = FALSE;
156 lmargin = prnlmargin;
157 rmargin = prnrmargin;
158 if (prnformfeedbefore) {
159 if (!skipping)
160 fputc('\x0c', fpo);
161 }
162 Again:
163 cols = lines = pages = 0;
164 endline = endpage = FALSE;
165 startpage = TRUE;
166 while ((c = fgetc(fpi)) != EOF) {
167 if (StopPrinting || ferror(fpo))
168 break;
169 if (prnformat) {
170 if (startpage) {
171 pages++;
172 if (prnpagenums) {
173 if (!skipping)
174 fprintf(fpo, "%*.*s#%lu",
175 lmargin, lmargin, " ", pages);
176 }
177 for (z = 0; z < prntmargin; z++) {
178 if (!skipping)
179 fputc('\n', fpo);
180 }
181 lines = prntmargin;
182 endline = endpage = FALSE;
183 cols = 0;
184 startpage = FALSE;
185 }
186 if (!cols) {
187 for (z = 0; z < lmargin; z++) {
188 if (!skipping)
189 fputc(' ', fpo);
190 }
191 cols = lmargin;
192 }
193 if (!skipping) {
194 if (c == '\t') {
195 for (z = 0; z < prntabspaces &&
196 cols + z < prnwidth - rmargin; z++)
197 fputc(' ', fpo);
198 }
199 else
200 fputc(c, fpo);
201 }
202 if (c == '\x0c')
203 endpage = TRUE;
204 else if (c == '\n') {
205 lines++;
206 cols = 0;
207 for (z = 1; z < prnspacing; z++) {
208 if (prnlength - lines <= prnbmargin)
209 break;
210 if (!skipping)
211 fputc('\n', fpo);
212 lines++;
213 }
214 if (prnlength - lines <= prnbmargin)
215 endpage = TRUE;
216 }
217 else {
218 cols++;
219 if (c == '\t')
220 c += prntabspaces;
221 if (prnwidth - cols <= rmargin) {
222 endline = TRUE;
223 if (!skipping)
224 fputc('\n', fpo);
225 lines++;
226 }
227 for (z = 1; z < prnspacing; z++) {
228 if (prnlength - lines <= prnbmargin)
229 break;
230 if (!skipping)
231 fputc('\n', fpo);
232 lines++;
233 }
234 }
235 if (endline) {
236 do {
237 c = fgetc(fpi);
238 if (c == '\n')
239 break;
240 } while (isspace(c) && c != EOF);
241 if (c == EOF)
242 break;
243 if (!isspace(c))
244 ungetc(c, fpi);
245 endline = FALSE;
246 cols = 0;
247 if (prnlength - lines <= prnbmargin)
248 endpage = TRUE;
249 }
250 if (endpage) {
251 if (prnbmargin) {
252 if (c != '\x0c') {
253 if (!skipping)
254 fputc('\r\x0c', fpo);
255 }
256 }
257 lines = cols = 0;
258 endpage = FALSE;
259 startpage = TRUE;
260 do {
261 c = fgetc(fpi);
262 } while (c == '\n');
263 if (c == EOF)
264 break;
265 ungetc(c, fpi);
266 if (prnformat && prnalt)
267 skipping = (skipping) ? FALSE : TRUE;
268 DosSleep(1L);
269 }
270 }
271 else
272 fputc(c, fpo);
273 }
274 if (prnalt && prnformat && firstpass && pages > 1) {
275 fclose(fpo);
276 fpo = _fsopen(li->targetpath, "a+", SH_DENYRW);
277 if (fpo) {
278 rewind(fpi);
279 firstpass = FALSE;
280 skipping = TRUE;
281 rc = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
282 HWND_DESKTOP,
283 GetPString(IDS_PRINTTITLETEXT),
284 GetPString(IDS_PRINTEVENTEXT), li->list[x]);
285 if (rc == MBID_YES) {
286 lmargin = prnrmargin;
287 rmargin = prnlmargin;
288 fputc('\x0c', fpo);
289 goto Again;
290 }
291 }
292 else
293 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
294 HWND_DESKTOP,
295 GetPString(IDS_PRINTTITLETEXT),
296 GetPString(IDS_PRINTCANTREOPENTEXT),
297 li->targetpath);
298 }
299 if (prnformfeedafter)
300 fputc('\x0c', fpo);
301 if (!StopPrinting) {
302 sprintf(s, GetPString(IDS_PRINTEDTEXT), li->list[x]);
303 AddNote(s);
304 }
305 fclose(fpo);
306 }
307 fclose(fpi);
308 }
309 }
310 DosReleaseMutexSem(PrintSem);
311 DosSleep(1L);
312 }
313 if (!StopPrinting)
314 AddNote(GetPString(IDS_PRINTEDLISTTEXT));
315 }
316 WinDestroyMsgQueue(hmq2);
317 }
318 DecrThreadUsage();
319 WinTerminate(hab2);
320 }
321Abort:
322 if (li)
323 FreeListInfo(li);
324}
325
326MRESULT EXPENTRY PrintDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
327{
328 LISTINFO *li;
329
330 switch (msg) {
331 case WM_INITDLG:
332 if (!mp2)
333 WinDismissDlg(hwnd, 0);
334 else {
335 WinSetWindowPtr(hwnd, QWL_USER, mp2);
336 WinSendDlgItemMsg(hwnd, PRN_WIDTH, EM_SETTEXTLIMIT,
337 MPFROM2SHORT(3, 0), MPVOID);
338 WinSendDlgItemMsg(hwnd, PRN_LENGTH, EM_SETTEXTLIMIT,
339 MPFROM2SHORT(3, 0), MPVOID);
340 WinSendDlgItemMsg(hwnd, PRN_LMARGIN, EM_SETTEXTLIMIT,
341 MPFROM2SHORT(2, 0), MPVOID);
342 WinSendDlgItemMsg(hwnd, PRN_RMARGIN, EM_SETTEXTLIMIT,
343 MPFROM2SHORT(2, 0), MPVOID);
344 WinSendDlgItemMsg(hwnd, PRN_TMARGIN, EM_SETTEXTLIMIT,
345 MPFROM2SHORT(2, 0), MPVOID);
346 WinSendDlgItemMsg(hwnd, PRN_BMARGIN, EM_SETTEXTLIMIT,
347 MPFROM2SHORT(2, 0), MPVOID);
348 WinSendDlgItemMsg(hwnd, PRN_SPACING, EM_SETTEXTLIMIT,
349 MPFROM2SHORT(1, 0), MPVOID);
350 WinSendDlgItemMsg(hwnd, PRN_TABSPACES, EM_SETTEXTLIMIT,
351 MPFROM2SHORT(2, 0), MPVOID);
352 WinSendDlgItemMsg(hwnd, PRN_PRINTER, EM_SETTEXTLIMIT,
353 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
354 WinSendMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
355 PosOverOkay(hwnd);
356 }
357 break;
358
359 case UM_UNDO:
360 WinCheckButton(hwnd, PRN_FORMAT, prnformat);
361 WinCheckButton(hwnd, PRN_ALT, prnalt);
362 WinCheckButton(hwnd, PRN_PAGENUMS, prnpagenums);
363 WinCheckButton(hwnd, PRN_FORMBEFORE, prnformfeedbefore);
364 WinCheckButton(hwnd, PRN_FORMAFTER, prnformfeedafter);
365 {
366 CHAR s[33];
367
368 sprintf(s, "%lu", prnwidth);
369 WinSetDlgItemText(hwnd, PRN_WIDTH, s);
370 sprintf(s, "%lu", prnlength);
371 WinSetDlgItemText(hwnd, PRN_LENGTH, s);
372 sprintf(s, "%lu", prnlmargin);
373 WinSetDlgItemText(hwnd, PRN_LMARGIN, s);
374 sprintf(s, "%lu", prnrmargin);
375 WinSetDlgItemText(hwnd, PRN_RMARGIN, s);
376 sprintf(s, "%lu", prntmargin);
377 WinSetDlgItemText(hwnd, PRN_TMARGIN, s);
378 sprintf(s, "%lu", prnbmargin);
379 WinSetDlgItemText(hwnd, PRN_BMARGIN, s);
380 sprintf(s, "%lu", prnspacing);
381 WinSetDlgItemText(hwnd, PRN_SPACING, s);
382 sprintf(s, "%lu", prntabspaces);
383 WinSetDlgItemText(hwnd, PRN_TABSPACES, s);
384 }
385 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
386 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
387 li = WinQueryWindowPtr(hwnd, QWL_USER);
388 if (!li)
389 Runtime_Error(pszSrcFile, __LINE__, "no data");
390 else {
391 INT x;
392
393 for (x = 0; li->list[x]; x++) {
394 if (IsFile(li->list[x]) == 1) {
395 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_INSERTITEM,
396 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
397 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_SELECTITEM,
398 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
399 }
400 }
401 if (!(SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMCOUNT,
402 MPVOID, MPVOID)) {
403 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
404 hwnd,
405 GetPString(IDS_TWIDDLETEXT), GetPString(IDS_NOPRINTABLETEXT));
406 WinDismissDlg(hwnd, 0);
407 }
408 }
409 return 0;
410
411 case WM_CONTROL:
412 switch (SHORT1FROMMP(mp1)) {
413 case PRN_LISTBOX:
414 if (SHORT2FROMMP(mp1) == LN_ENTER) {
415
416 SHORT x;
417 CHAR szBuffer[CCHMAXPATH];
418
419 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
420 MPFROMSHORT(LIT_FIRST), MPVOID);
421 if (x >= 0) {
422 *szBuffer = 0;
423 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
424 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
425 if (*szBuffer)
426 QuickView(hwnd, szBuffer);
427 }
428 }
429 }
430 return 0;
431
432 case WM_COMMAND:
433 switch (SHORT1FROMMP(mp1)) {
434 case DID_OK:
435 li = WinQueryWindowPtr(hwnd, QWL_USER);
436 if (!li)
437 Runtime_Error(pszSrcFile, __LINE__, "no data");
438 else {
439 prnformat = WinQueryButtonCheckstate(hwnd, PRN_FORMAT);
440 PrfWriteProfileData(fmprof, FM3Str, "Prnformat",
441 (PVOID) & prnformat, sizeof(prnformat));
442 prnalt = WinQueryButtonCheckstate(hwnd, PRN_ALT);
443 PrfWriteProfileData(fmprof, FM3Str, "Prnalt",
444 (PVOID) & prnalt, sizeof(prnalt));
445 prnpagenums = WinQueryButtonCheckstate(hwnd, PRN_PAGENUMS);
446 PrfWriteProfileData(fmprof, FM3Str, "Prnpagenums",
447 (PVOID) & prnpagenums, sizeof(prnpagenums));
448 prnformfeedbefore = WinQueryButtonCheckstate(hwnd, PRN_FORMBEFORE);
449 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedbefore",
450 (PVOID) & prnformfeedbefore,
451 sizeof(prnformfeedbefore));
452 prnformfeedafter = WinQueryButtonCheckstate(hwnd, PRN_FORMAFTER);
453 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedafter",
454 (PVOID) & prnformfeedafter,
455 sizeof(prnformfeedafter));
456 {
457 CHAR s[33];
458
459 *s = 0;
460 WinQueryDlgItemText(hwnd, PRN_WIDTH, sizeof(s), s);
461 if (atol(s) < 24 || atol(s) > 4096) {
462 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_WIDTH));
463 DosBeep(50, 100);
464 break;
465 }
466 prnwidth = atol(s);
467 PrfWriteProfileData(fmprof, FM3Str, "Prnwidth",
468 (PVOID) & prnwidth, sizeof(prnwidth));
469 *s = 0;
470 WinQueryDlgItemText(hwnd, PRN_LENGTH, sizeof(s), s);
471 if (atol(s) < 24 || atol(s) > 4096) {
472 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LENGTH));
473 DosBeep(50, 100);
474 break;
475 }
476 prnlength = atol(s);
477 PrfWriteProfileData(fmprof, FM3Str, "Prnlength",
478 (PVOID) & prnlength, sizeof(prnlength));
479 *s = 0;
480 WinQueryDlgItemText(hwnd, PRN_LMARGIN, sizeof(s), s);
481 if (atol(s) < 0 || atol(s) > prnwidth - 1) {
482 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LMARGIN));
483 DosBeep(50, 100);
484 break;
485 }
486 prnlmargin = atol(s);
487 PrfWriteProfileData(fmprof, FM3Str, "Prnlmargin",
488 (PVOID) & prnlmargin, sizeof(prnlmargin));
489 *s = 0;
490 WinQueryDlgItemText(hwnd, PRN_RMARGIN, sizeof(s), s);
491 if (atol(s) < 0 || atol(s) > (prnwidth - prnlmargin) - 1) {
492 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_RMARGIN));
493 DosBeep(50, 100);
494 break;
495 }
496 prnrmargin = atol(s);
497 PrfWriteProfileData(fmprof, FM3Str, "Prnrmargin",
498 (PVOID) & prnrmargin, sizeof(prnrmargin));
499 *s = 0;
500 WinQueryDlgItemText(hwnd, PRN_TABSPACES, sizeof(s), s);
501 if (atol(s) < 1 ||
502 atol(s) > prnwidth - ((prnlmargin + prnrmargin) - 1)) {
503 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TABSPACES));
504 DosBeep(50, 100);
505 break;
506 }
507 prntabspaces = atol(s);
508 PrfWriteProfileData(fmprof, FM3Str, "Prntabspaces",
509 (PVOID) & prntabspaces, sizeof(prntabspaces));
510 *s = 0;
511 WinQueryDlgItemText(hwnd, PRN_TMARGIN, sizeof(s), s);
512 if (atol(s) < 0 || atol(s) > prnlength - 1) {
513 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TMARGIN));
514 DosBeep(50, 100);
515 break;
516 }
517 prntmargin = atol(s);
518 PrfWriteProfileData(fmprof, FM3Str, "Prntmargin",
519 (PVOID) & prntmargin, sizeof(prntmargin));
520 *s = 0;
521 WinQueryDlgItemText(hwnd, PRN_BMARGIN, sizeof(s), s);
522 if (atol(s) < 0 || atol(s) > (prnlength - prntmargin) - 1) {
523 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_BMARGIN));
524 DosBeep(50, 100);
525 break;
526 }
527 prnbmargin = atol(s);
528 PrfWriteProfileData(fmprof, FM3Str, "Prnbmargin",
529 (PVOID) & prnbmargin, sizeof(prnbmargin));
530 *s = 0;
531 WinQueryDlgItemText(hwnd, PRN_SPACING, sizeof(s), s);
532 if (atol(s) < 1 ||
533 atol(s) > ((prnlength - prntmargin) - prnbmargin) - 1) {
534 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_SPACING));
535 DosBeep(50, 100);
536 break;
537 }
538 prnspacing = atol(s);
539 PrfWriteProfileData(fmprof, FM3Str, "Prnspacing",
540 (PVOID) & prnspacing, sizeof(prnspacing));
541 WinQueryDlgItemText(hwnd, PRN_PRINTER, sizeof(printer), printer);
542 bstrip(printer);
543 if (!*printer)
544 strcpy(printer, "PRN");
545 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
546 PrfWriteProfileString(fmprof, appname, "Printer", printer);
547 SayPrinterReady(hwnd);
548 }
549 {
550 CHAR szBuffer[CCHMAXPATH + 1];
551 INT numfiles = 0, numalloc = 0, error;
552 SHORT x;
553
554 if (li->list)
555 FreeList(li->list);
556 li->list = NULL;
557 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
558 MPFROMSHORT(LIT_FIRST), MPVOID);
559 if (x >= 0) {
560 do {
561 *szBuffer = 0;
562 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
563 MPFROM2SHORT(x, CCHMAXPATH),
564 MPFROMP(szBuffer));
565 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
566 if (error) {
567 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
568 break;
569 }
570 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX,
571 LM_QUERYSELECTION,
572 MPFROMSHORT(x), MPVOID);
573 } while (x >= 0);
574 }
575 }
576 if (!li->list || !li->list[0])
577 WinDismissDlg(hwnd, 0);
578 else
579 WinDismissDlg(hwnd, 1);
580 }
581 break;
582 case DID_CANCEL:
583 WinDismissDlg(hwnd, 0);
584 break;
585 case IDM_HELP:
586 if (hwndHelp)
587 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
588 MPFROM2SHORT(HELP_PRINT, 0), MPFROMSHORT(HM_RESOURCEID));
589 break;
590 case IDM_UNDO:
591 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
592 break;
593 }
594 return 0;
595 }
596 return WinDefDlgProc(hwnd, msg, mp1, mp2);
597}
Note: See TracBrowser for help on using the repository browser.