|
|
1.1 root 1: /****************************************************************************
2: *
3: *
4: * PROGRAM: CmnDlg.c
5: *
6: * PURPOSE: Sample demonstrating the use of the common dialogs in Windows
7: *
8: * FUNCTIONS:
9: *
10: * WinMain() - calls initialization function, processes message loop
11: * InitApplication() - initializes window data and registers window
12: * InitInstance() - saves instance handle and creates main window
13: * MainWndProc() - processes messages
14: * About() - processes messages for "About" dialog box
15: * OpenNewFile() - opens a new file
16: * SaveToFile() - saves the current text buffer to the current filename
17: * SaveAs() - saves the current text buffer to a new file name
18: * EnterNew() - to enter new text into the text buffer
19: * FileOpenHookProc() - Hook procedure for GetOpenFileName() common dialog
20: * FileSaveHookProc() - Hook procedure for GetSaveFileName() common dialog
21: * ChooseFontHookProc() - Hook procedure for ChooseFont() common dialog
22: * FindTextHookProc() - Hook procedure for FindText() common dialog
23: * ReplaceTextHookProc() - Hook procedure for the ReplaceText() common dialog
24: * PrintDlgHookProc() - Hook procedure for the PrintDlg() common dialog
25: * PrintSetupHookProc() - Hook procedure for the PrintDlg() setup common dialog
26: * SearchFile() - Searches for the specified text in the file buffer
27: * ChooseNewFont() - chooses a new font for display
28: * ChooseNewColor() - chooses a new color for display
29: * PrintFile() - prints the current text in the file buffer
30: * CallFindText() - calls the FindText() common dialog function
31: * CallReplaceText() - calls the ReplaceText() common dialog function
32: * ProcessCDError() - uses CommonDialogExtendedError() to output useful error messages
33: *
34: * COMMENTS:
35: *
36: *
37: * The common dialog APIs demonstrated in the sample include:
38: *
39: * ChooseColor()
40: * ChooseFont()
41: * FindText()
42: * GetOpenFileName()
43: * GetSaveFileName()
44: * PrintDlg()
45: * ReplaceText()
46: *
47: *
48: * Each dialog box is demonstrated being used in three different ways:
49: * standard, using a modified template and using a hook function.
50: * Currently, a hook procedure will not work with the ChooseColor()
51: * common dialog, so this option is disabled when the user chooses
52: * either Hook or Custom as their current mode.
53: *
54: *
55: ****************************************************************************/
56:
57: #include <windows.h> // includes basic windows functionality
58: #include <commdlg.h> // includes common dialog functionality
59: #include <dlgs.h> // includes common dialog template defines
60: #include <stdio.h> // includes standard file i/o functionality
61: #include <string.h> // includes string functions
62: #include <cderr.h> // includes the common dialog error codes
63: #include "cmndlg.h" // includes my common dialog functions
64:
65: HANDLE hInst;
66: OPENFILENAME OpenFileName;
67: CHAR szDirName[256] = "";
68: CHAR szFile[256] = "\0";
69: CHAR szFileTitle[256];
70:
71: // Filter specification for the OPENFILENAME struct
72: // This is portable for i386 and MIPS
73: // Leaving out the \0 terminator will cause improper DWORD alignment
74: // and cause a failure under MIPS
75: CHAR szFilter[] = "Text Files (*.TXT)\0*.TXT\0All Files (*.*)\0*.*\0";
76:
77: CHAR FileBuf[FILE_LEN];
78: DWORD dwFileSize;
79: UINT FindReplaceMsg;
80: CHAR szFindString[64] = "";
81: CHAR szReplaceString[64] = "";
82: FINDREPLACE frText;
83: LPFINDREPLACE lpFR;
84: CHAR * BufPtr;
85: CHOOSEFONT chf;
86: CHOOSECOLOR chsclr;
87: COLORREF crColor;
88: LOGFONT lf;
89: WORD wMode = IDM_STANDARD;
90: HWND hDlgFR;
91: PRINTDLG pd;
92:
93: /****************************************************************************
94: *
95: * FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
96: *
97: * PURPOSE: calls initialization function, processes message loop
98: *
99: * COMMENTS:
100: *
101: *
102: ****************************************************************************/
103:
104: int APIENTRY WinMain(
105: HANDLE hInstance,
106: HANDLE hPrevInstance,
107: LPSTR lpCmdLine,
108: int nCmdShow
109: )
110: {
111:
112: MSG msg; /* message */
113:
114: if (!hPrevInstance) /* Other instances of app running? */
115: if (!InitApplication(hInstance)) /* Initialize shared things */
116: return (FALSE); /* Exits if unable to initialize */
117:
118: hInst = hInstance;
119:
120: /* Perform initializations that apply to a specific instance */
121:
122: if (!InitInstance(hInstance, nCmdShow))
123: return (FALSE);
124:
125: // register window message for FindText() and ReplaceText() hook procs
126: FindReplaceMsg = RegisterWindowMessage( (LPSTR) FINDMSGSTRING );
127:
128: /* Acquire and dispatch messages until a WM_QUIT message is received. */
129:
130: while (GetMessage(&msg, /* message structure */
131: NULL, /* handle of window receiving the message */
132: NULL, /* lowest message to examine */
133: NULL)) /* highest message to examine */
134: {
135: TranslateMessage(&msg); /* Translates virtual key codes */
136: DispatchMessage(&msg); /* Dispatches message to window */
137: }
138: return (msg.wParam); /* Returns the value from PostQuitMessage */
139:
140: // avoid compiler warnings at W3
141: lpCmdLine;
142: }
143:
144:
145: /****************************************************************************
146: *
147: * FUNCTION: InitApplication(HANDLE)
148: *
149: * PURPOSE: Initializes window data and registers window class
150: *
151: * COMMENTS:
152: *
153: * In this function, we initialize a window class by filling out a data
154: * structure of type WNDCLASS and calling the Windows RegisterClass()
155: * function.
156: *
157: ****************************************************************************/
158:
159: BOOL InitApplication(HANDLE hInstance) /* current instance */
160: {
161: WNDCLASS wc;
162:
163: /* Fill in window class structure with parameters that describe the */
164: /* main window. */
165:
166: wc.style = NULL; /* Class style(s). */
167: wc.lpfnWndProc = (WNDPROC)MainWndProc; /* Function to retrieve messages for */
168: /* windows of this class. */
169: wc.cbClsExtra = 0; /* No per-class extra data. */
170: wc.cbWndExtra = 0; /* No per-window extra data. */
171: wc.hInstance = hInstance; /* Application that owns the class. */
172: wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
173: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
174: wc.hbrBackground = GetStockObject(WHITE_BRUSH);
175: wc.lpszMenuName = "CmnDlgMenu"; /* Name of menu resource in .RC file. */
176: wc.lpszClassName = "CmnDlgWClass"; /* Name used in call to CreateWindow. */
177:
178: /* Register the window class and return success/failure code. */
179:
180: return (RegisterClass(&wc));
181:
182: }
183:
184:
185: /****************************************************************************
186: *
187: * FUNCTION: InitInstance(HANDLE, int)
188: *
189: * PURPOSE: Saves instance handle and creates main window
190: *
191: * COMMENTS:
192: *
193: * In this function, we save the instance handle in a static variable and
194: * create and display the main program window.
195: *
196: ****************************************************************************/
197:
198: BOOL InitInstance(
199: HANDLE hInstance, /* Current instance identifier. */
200: int nCmdShow) /* Param for first ShowWindow() call. */
201: {
202: HWND hWnd; /* Main window handle. */
203:
204: /* Save the instance handle in static variable, which will be used in */
205: /* many subsequence calls from this application to Windows. */
206:
207: hInst = hInstance;
208:
209: /* Create a main window for this application instance. */
210:
211: hWnd = CreateWindow(
212: "CmnDlgWClass", /* See RegisterClass() call. */
213: "Common Dialogs Sample Application", /* Text for window title bar. */
214: WS_OVERLAPPEDWINDOW, /* Window style. */
215: CW_USEDEFAULT, /* Default horizontal position. */
216: CW_USEDEFAULT, /* Default vertical position. */
217: CW_USEDEFAULT, /* Default width. */
218: CW_USEDEFAULT, /* Default height. */
219: NULL, /* Overlapped windows have no parent. */
220: NULL, /* Use the window class menu. */
221: hInstance, /* This instance owns this window. */
222: NULL /* Pointer not needed. */
223: );
224:
225: /* If window could not be created, return "failure" */
226:
227: if (!hWnd)
228: return (FALSE);
229:
230: /* Make the window visible; update its client area; and return "success" */
231:
232: ShowWindow(hWnd, nCmdShow); /* Show the window */
233: UpdateWindow(hWnd); /* Sends WM_PAINT message */
234: return (TRUE); /* Returns the value from PostQuitMessage */
235:
236: }
237:
238: /****************************************************************************
239: *
240: * FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
241: *
242: * PURPOSE: Processes messages
243: *
244: * COMMENTS:
245: *
246: * This function processes all messags sent to the window. When the
247: * user choses one of the options from one of the menus, the command
248: * is processed here and passed onto the function for that command.
249: * This function also processes the special "FindReplace" message that
250: * this application registers for hook processing of the FindText()
251: * and ReplaceText() common dialog functions.
252: *
253: ****************************************************************************/
254:
255: LONG APIENTRY MainWndProc(
256: HWND hWnd, /* window handle */
257: UINT message, /* type of message */
258: UINT wParam, /* additional information */
259: LONG lParam) /* additional information */
260: {
261: FARPROC lpProcAbout; /* pointer to the "About" function */
262: FARPROC lpProcEnterNew; /* pointer to the "EnterNew" function */
263: HDC hDC;
264: PAINTSTRUCT ps;
265: INT nDrawX;
266: INT nDrawY;
267: HFONT hFont;
268: HANDLE Handle;
269: static BOOL NewFont;
270:
271: switch (message) {
272:
273:
274: case WM_CREATE:
275: //initialize the output on the screen
276: strcpy( FileBuf, "Hello World!");
277: dwFileSize = strlen(FileBuf);
278: crColor = 0;
279: NewFont = FALSE;
280: break;
281:
282:
283: case WM_PAINT:
284: /* Set up a display context to begin painting */
285: hDC = BeginPaint (hWnd, &ps);
286:
287: /* Initialize drawing position to 1/4 inch from the top */
288: /* and from the left of the top, left corner of the */
289: /* client area of the main windows. */
290: nDrawX = GetDeviceCaps(hDC, LOGPIXELSX) / 4; /* 1/4 inch */
291: nDrawY = GetDeviceCaps(hDC, LOGPIXELSY) / 4; /* 1/4 inch */
292:
293: if ( NewFont == TRUE )
294: {
295: hFont = CreateFontIndirect( &lf );
296: Handle = SelectObject( hDC, hFont );
297: }
298:
299: SetTextColor( hDC, crColor );
300: TextOut (hDC, nDrawX, nDrawY, (LPSTR)&FileBuf[0], dwFileSize);
301:
302:
303: // end painting and release hDC
304: EndPaint( hWnd, &ps );
305: break;
306:
307:
308: case WM_COMMAND: /* message: command from application menu */
309:
310: switch( LOWORD( wParam ))
311: {
312: case IDM_OPENFILE:
313: if ( OpenNewFile( hWnd ) == TRUE )
314: {
315: // enable the Save As and Print menu items
316: EnableMenuItem( GetMenu( hWnd ), IDM_SAVEFILE,
317: MF_BYCOMMAND | MF_ENABLED );
318: EnableMenuItem( GetMenu( hWnd ), IDM_PRINT,
319: MF_BYCOMMAND | MF_ENABLED );
320: DrawMenuBar( hWnd);
321: // reset the title in the title bar to reflect the
322: // new open file
323: SetWindowText( hWnd, OpenFileName.lpstrFile );
324: // reset the current color and current font to the
325: // default
326: crColor = 0;
327: NewFont = FALSE;
328: InvalidateRect( hWnd, NULL, TRUE );
329: }
330: break;
331:
332: case IDM_SAVEFILE:
333: OpenFileName.Flags = 0L;
334: SaveToFile( hWnd );
335: break;
336:
337: case IDM_SAVEFILEAS:
338: if ( SaveAs( hWnd ) == TRUE )
339: {
340: EnableMenuItem( GetMenu( hWnd ), IDM_SAVEFILE,
341: MF_BYCOMMAND | MF_ENABLED );
342: SetWindowText( hWnd, OpenFileName.lpstrFile );
343: DrawMenuBar( hWnd );
344: }
345: break;
346:
347: case IDM_EXIT:
348: PostQuitMessage(0);
349: break;
350:
351: case IDM_PRINT:
352: PrintFile( hWnd );
353: break;
354:
355: case IDM_CHOOSECOLOR:
356: if (ChooseNewColor( hWnd ))
357: InvalidateRect( hWnd, NULL, TRUE );
358: break;
359:
360: case IDM_CHOOSEFONT:
361: if (NewFont = ChooseNewFont( hWnd ))
362: InvalidateRect( hWnd, NULL, TRUE );
363:
364: break;
365:
366: case IDM_FINDTEXT:
367: CallFindText( hWnd );
368: break;
369:
370: case IDM_REPLACETEXT:
371: CallReplaceText( hWnd );
372: break;
373:
374: case IDM_STANDARD:
375:
376: #ifdef NOTIMPLEMENTED
377: // enable the ChooseColor() option
378: EnableMenuItem(GetMenu(hWnd), IDM_CHOOSECOLOR,
379: MF_BYCOMMAND | MF_ENABLED );
380: // uncheck previous selection
381: CheckMenuItem( GetMenu( hWnd ), wMode, MF_UNCHECKED | MF_BYCOMMAND);
382: //reset mode
383: wMode = LOWORD(wParam);
384: //check new selection
385: CheckMenuItem( GetMenu( hWnd ), wMode, MF_CHECKED | MF_BYCOMMAND);
386: DrawMenuBar( hWnd);
387: break;
388: #endif
389: case IDM_HOOK:
390: case IDM_CUSTOM:
391: #ifdef NOTIMPLEMENTED
392: // disable the ChooseColor() option
393: EnableMenuItem(GetMenu(hWnd), IDM_CHOOSECOLOR,
394: MF_BYCOMMAND | MF_GRAYED );
395: #endif
396: // uncheck previous selection
397: CheckMenuItem( GetMenu( hWnd ), wMode, MF_UNCHECKED | MF_BYCOMMAND);
398: //reset mode
399: wMode = LOWORD(wParam);
400: //check new selection
401: CheckMenuItem( GetMenu( hWnd ), wMode, MF_CHECKED | MF_BYCOMMAND);
402: DrawMenuBar( hWnd);
403: break;
404:
405: case IDM_ENTERNEW:
406: lpProcEnterNew = MakeProcInstance((FARPROC)EnterNew, hInst);
407:
408: if (DialogBox(hInst, /* current instance */
409: "EnterNewBox", /* resource to use */
410: hWnd, /* parent handle */
411: (WNDPROC)lpProcEnterNew) == TRUE)
412:
413: InvalidateRect( hWnd, NULL, TRUE );
414:
415: FreeProcInstance(lpProcEnterNew);
416: break;
417:
418: case IDM_ABOUT:
419: lpProcAbout = MakeProcInstance((FARPROC)About, hInst);
420:
421: DialogBox(hInst, /* current instance */
422: "AboutBox", /* resource to use */
423: hWnd, /* parent handle */
424: (WNDPROC)lpProcAbout); /* About() instance address */
425:
426: FreeProcInstance(lpProcAbout);
427: break;
428:
429: default:
430: return (DefWindowProc(hWnd, message, wParam, lParam));
431:
432: }
433: break;
434:
435: case WM_DESTROY: /* message: window being destroyed */
436: PostQuitMessage(0);
437: break;
438:
439:
440: default:
441: // Handle the special findreplace message (FindReplaceMsg) which
442: // was registered at initialization time.
443: if ( message == FindReplaceMsg )
444: {
445: lpFR = (LPFINDREPLACE) lParam;
446: if (lpFR->Flags & FR_DIALOGTERM ) // terminating dialog
447: return (NULL);
448: SearchFile( lpFR );
449: InvalidateRect( hWnd, NULL, TRUE );
450: return (NULL);
451: }
452:
453: return (DefWindowProc(hWnd, message, wParam, lParam));
454: }
455: return (NULL);
456: }
457:
458:
459: /****************************************************************************
460: *
461: * FUNCTION: EnterNew(HWND, UINT, UINT, LONG)
462: *
463: * PURPOSE: Processes messages for "EnterNew" dialog box
464: *
465: * COMMENTS:
466: *
467: * This function allows the user to enter new text in the current
468: * window. This text is stored in the global current buffer.
469: *
470: ****************************************************************************/
471:
472: BOOL APIENTRY EnterNew(
473: HWND hDlg, /* window handle of the dialog box */
474: UINT message, /* type of message */
475: UINT wParam, /* message-specific information */
476: LONG lParam)
477: {
478: CHAR Buf[FILE_LEN-1];
479:
480: switch (message)
481: {
482: case WM_INITDIALOG: /* message: initialize dialog box */
483: return (TRUE);
484:
485: case WM_COMMAND: /* message: received a command */
486: if (LOWORD(wParam) == IDOK)
487: {
488: GetDlgItemText( hDlg, IDEDIT, Buf, FILE_LEN-1);
489: strcpy( FileBuf, Buf);
490: dwFileSize = strlen(FileBuf);
491: EndDialog( hDlg, TRUE );
492: return (TRUE);
493: }
494: else if (LOWORD(wParam) == IDCANCEL)
495: { /* System menu close command? */
496: EndDialog(hDlg, FALSE); /* Exits the dialog box */
497: return (TRUE);
498: }
499: break;
500: }
501: return (FALSE); /* Didn't process a message */
502:
503: // avoid compiler warnings at W3
504: lParam;
505: }
506:
507:
508: /****************************************************************************
509: *
510: * FUNCTION: About(HWND, UINT, UINT, LONG)
511: *
512: * PURPOSE: Processes messages for "About" dialog box
513: *
514: * COMMENTS:
515: *
516: * No initialization is needed for this particular dialog box, but TRUE
517: * must be returned to Windows.
518: *
519: * Wait for user to click on "Ok" button, then close the dialog box.
520: *
521: ****************************************************************************/
522:
523: BOOL APIENTRY About(
524: HWND hDlg, /* window handle of the dialog box */
525: UINT message, /* type of message */
526: UINT wParam, /* message-specific information */
527: LONG lParam)
528: {
529: switch (message)
530: {
531: case WM_INITDIALOG: /* message: initialize dialog box */
532: return (TRUE);
533:
534: case WM_COMMAND: /* message: received a command */
535: if (LOWORD(wParam) == IDOK /* "OK" box selected? */
536: || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */
537: EndDialog(hDlg, TRUE); /* Exits the dialog box */
538: return (TRUE);
539: }
540: break;
541: }
542: return (FALSE); /* Didn't process a message */
543:
544: // avoid compiler warnings at W3
545: lParam;
546: }
547:
548: /****************************************************************************
549: *
550: * FUNCTION: FileOpenHookProc(HWND, UINT, UINT, LONG)
551: *
552: * PURPOSE: Processes messages for GetFileNameOpen() common dialog box
553: *
554: * COMMENTS:
555: *
556: * This function will prompt the user if they are sure they want
557: * to open the file if the OFN_ENABLEHOOK flag is set.
558: *
559: * If the current option mode is CUSTOM, the user is allowed to check
560: * a box in the dialog prompting them whether or not they would like
561: * the file created. If they check this box, the file is created and
562: * the string 'Empty' is written to it.
563: *
564: * RETURN VALUES:
565: * TRUE - User chose 'Yes' from the "Are you sure message box".
566: * FALSE - User chose 'No'; return to the dialog box.
567: *
568: ****************************************************************************/
569:
570: BOOL APIENTRY FileOpenHookProc(
571: HWND hDlg, /* window handle of the dialog box */
572: UINT message, /* type of message */
573: UINT wParam, /* message-specific information */
574: LONG lParam)
575: {
576:
577: int hFile;
578: CHAR szTempText[256];
579: CHAR szString[256];
580: OFSTRUCT OfStruct;
581:
582: switch (message)
583: {
584:
585: case WM_COMMAND:
586: if (LOWORD(wParam) == IDOK)
587: {
588: GetDlgItemText( hDlg, edt1, szTempText,
589: sizeof( szTempText ) - 1);
590:
591: if ( OpenFileName.Flags & OFN_PATHMUSTEXIST )
592: {
593: sprintf( szString, "Are you sure you want to open %s?",
594: szTempText);
595: if ( MessageBox( hDlg, szString, "Information",
596: MB_YESNO ) == IDYES )
597:
598: break;
599: return (TRUE);
600: }
601:
602: // check to see if the Create File box has been checked
603: if ( (BOOL)(SendMessage( GetDlgItem(hDlg, chx2),
604: BM_GETCHECK, 0, 0L )) == TRUE )
605: {
606: // if so, create the file
607: if ((hFile = OpenFile(szTempText,
608: &OfStruct,
609: OF_CREATE)) == -1)
610: {
611: MessageBox( hDlg,
612: "Directory could not be created.",
613: NULL,
614: MB_OK );
615: return (FALSE);
616: }
617:
618: strcpy(FileBuf, "Empty");
619: dwFileSize = strlen(FileBuf);
620: if (_lwrite( hFile, (LPSTR)&FileBuf[0], dwFileSize)==-1)
621: MessageBox( hDlg, "Error writing file.", NULL, MB_OK );
622:
623: // close the file
624: _lclose( hFile );
625: }
626:
627: }
628: break;
629: }
630: return (FALSE);
631:
632: // avoid compiler warnings at W3
633: lParam;
634:
635: }
636:
637: /****************************************************************************
638: *
639: * FUNCTION: OpenNewFile(HWND)
640: *
641: * PURPOSE: Invokes common dialog function to open a file and opens it.
642: *
643: * COMMENTS:
644: *
645: * This function initializes the OPENFILENAME structure and calls
646: * the GetOpenFileName() common dialog function. This function will
647: * work regardless of the mode: standard, using a hook or using a
648: * customized template.
649: *
650: * RETURN VALUES:
651: * TRUE - The file was opened successfully and read into the buffer.
652: * FALSE - No files were opened.
653: *
654: ****************************************************************************/
655: BOOL OpenNewFile( HWND hWnd )
656: {
657: int hFile;
658: int cBufLen;
659: OFSTRUCT OfStruct;
660: WORD wStyle;
661:
662: strcpy( szFile, "");
663: strcpy( szFileTitle, "");
664:
665: OpenFileName.lStructSize = sizeof(OPENFILENAME);
666: OpenFileName.hwndOwner = hWnd;
667: OpenFileName.hInstance = (HANDLE) hInst;
668: OpenFileName.lpstrFilter = szFilter;
669: OpenFileName.lpstrCustomFilter = (LPSTR) NULL;
670: OpenFileName.nMaxCustFilter = 0L;
671: OpenFileName.nFilterIndex = 1L;
672: OpenFileName.lpstrFile = szFile;
673: OpenFileName.nMaxFile = sizeof(szFile);
674: OpenFileName.lpstrFileTitle = szFileTitle;
675: OpenFileName.nMaxFileTitle = sizeof(szFileTitle);
676: OpenFileName.lpstrInitialDir = NULL;
677: OpenFileName.lpstrTitle = "Open a File";
678: OpenFileName.nFileOffset = 0;
679: OpenFileName.nFileExtension = 0;
680: OpenFileName.lpstrDefExt = "*.txt";
681: OpenFileName.lCustData = 0;
682:
683: switch( wMode )
684: {
685: case IDM_STANDARD:
686: OpenFileName.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
687: OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
688: break;
689:
690: case IDM_HOOK:
691: OpenFileName.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
692: OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK;
693: OpenFileName.lpfnHook = (LPOFNHOOKPROC)MakeProcInstance(FileOpenHookProc, NULL);
694: break;
695:
696: case IDM_CUSTOM:
697: OpenFileName.Flags = OFN_SHOWHELP | OFN_ENABLEHOOK |
698: OFN_HIDEREADONLY | OFN_ENABLETEMPLATE;
699: OpenFileName.lpfnHook = (LPOFNHOOKPROC)MakeProcInstance(FileOpenHookProc, NULL);
700: OpenFileName.lpTemplateName = (LPSTR)MAKEINTRESOURCE(FILEOPENORD);
701: break;
702: }
703:
704: if (GetOpenFileName(&OpenFileName))
705: {
706: if (OpenFileName.Flags & OFN_READONLY )
707: wStyle = OF_READ;
708: else
709: wStyle = OF_READWRITE;
710:
711: // open the file
712: hFile = OpenFile(OpenFileName.lpstrFile, &OfStruct, wStyle );
713: if (hFile == -1)
714: {
715: MessageBox( hWnd, "File open failed.", NULL, MB_OK );
716: return FALSE;
717: }
718: // read it's contents into a buffer
719: cBufLen = _lread( hFile, FileBuf, FILE_LEN );
720:
721: if (cBufLen == -1)
722: {
723: MessageBox( hWnd, "Zero bytes read.", NULL, MB_OK );
724: return FALSE;
725: }
726: // close the file
727: _lclose( hFile );
728:
729: dwFileSize = cBufLen;
730: }
731: else
732: {
733: ProcessCDError(CommDlgExtendedError(), hWnd );
734: return FALSE;
735: }
736: return TRUE;
737: }
738:
739: /****************************************************************************
740: *
741: * FUNCTION: SaveToFile( HWND )
742: *
743: * PURPOSE: Saves the current buffer to the current file.
744: *
745: * COMMENTS:
746: *
747: * This function will save the current text buffer into the file
748: * specified from the GetSaveFileName() common dialog function.
749: *
750: * RETURN VALUES:
751: * TRUE - The file was saved successfully.
752: * FALSE - The buffer was not saved to a file.
753: *
754: ****************************************************************************/
755: BOOL SaveToFile( HWND hWnd )
756: {
757: int hFile;
758: OFSTRUCT OfStruct;
759: WORD wStyle;
760: CHAR buf[256];
761:
762: if (OpenFileName.Flags | OFN_FILEMUSTEXIST)
763: wStyle = OF_READWRITE;
764: else
765: wStyle = OF_READWRITE | OF_CREATE;
766:
767: if ((hFile = OpenFile(OpenFileName.lpstrFile, &OfStruct,
768: wStyle)) == -1)
769: {
770: sprintf( buf, "Could not create file %s", OpenFileName.lpstrFile );
771: MessageBox( hWnd, buf, NULL, MB_OK );
772: return FALSE;
773: }
774: // write it's contents into a file
775: if (_lwrite( hFile, (LPSTR)&FileBuf[0], dwFileSize)==-1)
776: {
777: MessageBox( hWnd, "Error writing file.", NULL, MB_OK );
778: return FALSE;
779: }
780:
781: // close the file
782: _lclose( hFile );
783:
784: sprintf( buf, "%s", OpenFileName.lpstrFile );
785: MessageBox( hWnd, buf, "File Saved", MB_OK );
786: return TRUE;
787: }
788:
789:
790: /****************************************************************************
791: *
792: * FUNCTION: FileSaveHookProc(HWND, UINT, UINT, LONG)
793: *
794: * PURPOSE: Processes messages for FileSave common dialog box
795: *
796: * COMMENTS:
797: *
798: * This hook procedure prompts the user if they want to save the
799: * current file. If they choose YES, the file is saved and the dialog
800: * is dismissed. If they choose NO, they are returned to the
801: * GetSaveFileName() common dialog.
802: *
803: * If the current mode calls for a customized template, this function
804: * will test the 'Create File?' checkbox. If the user choses no, the
805: * OFN_FILEMUSTEXIST flag is set.
806: *
807: * RETURN VALUES:
808: * TRUE - User chose 'Yes' from the "Are you sure message box".
809: * FALSE - User chose 'No'; return to the dialog box.
810: *
811: *
812: ****************************************************************************/
813:
814: BOOL APIENTRY FileSaveHookProc(
815: HWND hDlg, /* window handle of the dialog box */
816: UINT message, /* type of message */
817: UINT wParam, /* message-specific information */
818: LONG lParam)
819: {
820: CHAR szTempText[256];
821: CHAR szString[256];
822:
823: switch (message)
824: {
825: case WM_COMMAND:
826: if (LOWORD(wParam) == IDOK)
827: {
828: GetDlgItemText( hDlg, edt1, szTempText,
829: sizeof( szTempText ) - 1);
830: if ( OpenFileName.Flags & OFN_ENABLETEMPLATE )
831: {
832: // check to see if the Create File box has been checked
833: if ( (BOOL)(SendMessage( GetDlgItem(hDlg, chx2),
834: BM_GETCHECK, 0, 0L )) == FALSE )
835: OpenFileName.Flags |= OFN_FILEMUSTEXIST;
836: break;
837:
838: }
839: else
840: {
841: sprintf( szString, "Are you sure you want to save %s?",
842: szTempText);
843: if ( MessageBox( hDlg, szString, "Information",
844: MB_YESNO ) == IDYES )
845: break;
846: return(TRUE);
847: }
848:
849: }
850: break;
851: }
852: return (FALSE);
853:
854: // avoid compiler warnings at W3
855: lParam;
856:
857: }
858:
859: /****************************************************************************
860: *
861: * FUNCTION: SaveAs(HWND)
862: *
863: * PURPOSE: Invokes the common dialog function to save the current
864: * buffer to a file.
865: * COMMENTS:
866: *
867: * This function initializes the OPENFILENAME structure for any
868: * mode selected by the user: standard, using a hook or using a
869: * customized template. It then calls the GetSaveFileName()
870: * common dialog function.
871: *
872: * RETURN VALUES:
873: * TRUE - The file was saved successfully.
874: * FALSE - The buffer was not saved to a file.
875: *
876: ****************************************************************************/
877: BOOL SaveAs( HWND hWnd )
878: {
879:
880: strcpy( szFile, "");
881: strcpy( szFileTitle, "");
882:
883: OpenFileName.lStructSize = sizeof(OPENFILENAME);
884: OpenFileName.hwndOwner = hWnd;
885: OpenFileName.hInstance = (HANDLE) hInst;
886: OpenFileName.lpstrFilter = szFilter;
887: OpenFileName.lpstrCustomFilter = (LPSTR) NULL;
888: OpenFileName.nMaxCustFilter = 0L;
889: OpenFileName.nFilterIndex = 1L;
890: OpenFileName.lpstrFile = szFile;
891: OpenFileName.nMaxFile = sizeof(szFile);
892: OpenFileName.lpstrFileTitle = szFileTitle;
893: OpenFileName.nMaxFileTitle = sizeof(szFileTitle);
894: OpenFileName.lpstrInitialDir = NULL;
895: OpenFileName.lpstrTitle = "Save File As";
896: OpenFileName.nFileOffset = 0;
897: OpenFileName.nFileExtension = 0;
898: OpenFileName.lpstrDefExt = "txt";
899: OpenFileName.lCustData = 0;
900:
901: switch( wMode )
902: {
903: case IDM_STANDARD:
904: OpenFileName.Flags = 0L;
905: OpenFileName.lpfnHook = (LPOFNHOOKPROC)(FARPROC)NULL;
906: OpenFileName.lpTemplateName = (LPSTR)NULL;
907: break;
908:
909: case IDM_HOOK:
910: OpenFileName.Flags = OFN_ENABLEHOOK;
911: OpenFileName.lpfnHook = (LPOFNHOOKPROC)MakeProcInstance(FileSaveHookProc, NULL);
912: OpenFileName.lpTemplateName = (LPSTR)NULL;
913: break;
914:
915: case IDM_CUSTOM:
916: OpenFileName.Flags = OFN_ENABLEHOOK | OFN_ENABLETEMPLATE;
917: OpenFileName.lpfnHook = (LPOFNHOOKPROC)MakeProcInstance(FileSaveHookProc, NULL);
918: OpenFileName.lpTemplateName = (LPSTR)MAKEINTRESOURCE(FILEOPENORD);
919: break;
920: }
921:
922: if ( GetSaveFileName( &OpenFileName ))
923: return(SaveToFile( hWnd ));
924: else
925: {
926: ProcessCDError(CommDlgExtendedError(), hWnd );
927: return FALSE;
928: }
929:
930: return (FALSE);
931: }
932:
933:
934: /****************************************************************************
935: *
936: * FUNCTION: ChooseColorHookProc(HWND, UINT, UINT, LONG)
937: *
938: * PURPOSE: Processes messages for ChooseColor common dialog box
939: *
940: * COMMENTS:
941: *
942: * This hook procedure simply prompts the user whether or not they
943: * want to change the color. if they choose YES, the color of the
944: * text will be changed and the dialog will be dismissed. If they
945: * choose NO, the color will not be changed and the user will be
946: * returned to the dialog
947: *
948: * RETURN VALUES:
949: * TRUE - User chose 'Yes' from the "Are you sure message box".
950: * FALSE - User chose 'No'; return to the dialog box.
951: *
952: ****************************************************************************/
953:
954: BOOL APIENTRY ChooseColorHookProc(
955: HWND hDlg, /* window handle of the dialog box */
956: UINT message, /* type of message */
957: UINT wParam, /* message-specific information */
958: LONG lParam)
959: {
960:
961: switch (message)
962: {
963: case WM_COMMAND:
964: if (LOWORD(wParam) == IDOK)
965: {
966: if (MessageBox( hDlg, "Are you sure you want to change the color?",
967: "Information", MB_YESNO ) == IDYES )
968: break;
969: return (TRUE);
970:
971: }
972: break;
973: }
974: return (FALSE);
975:
976: // avoid compiler warnings at W3
977: lParam;
978:
979: }
980:
981:
982: /****************************************************************************
983: *
984: * FUNCTION: ChooseNewColor(HWND)
985: *
986: * PURPOSE: Invokes common dialog function to chose a new color.
987: *
988: * COMMENTS:
989: * This function initializes the CHOOSECOLOR structure for any
990: * mode the user chooses: standard, using a hook or using a
991: * customized template. It then calls the ChooseColor()
992: * common dialog function.
993: *
994: * Hook procedure in Win 32 for ChoseColor() common dialog is
995: * not implemented yet.
996: *
997: * RETURN VALUES:
998: * TRUE - A new color was chosen.
999: * FALSE - No new color was chosen.
1000: *
1001: ****************************************************************************/
1002: BOOL ChooseNewColor( HWND hWnd )
1003: {
1004:
1005: DWORD dwColor;
1006: DWORD dwCustClrs[16];
1007: BOOL fSetColor = FALSE;
1008: int i;
1009:
1010:
1011: for (i=0; i < 15; i++)
1012: dwCustClrs[i] = RGB( 255, 255, 255);
1013:
1014: dwColor = RGB( 0, 0, 0 );
1015:
1016: chsclr.lStructSize = sizeof(CHOOSECOLOR);
1017: chsclr.hwndOwner = hWnd;
1018: chsclr.hInstance = (HANDLE)hInst;
1019: chsclr.rgbResult = dwColor;
1020: chsclr.lpCustColors = (LPDWORD)dwCustClrs;
1021: chsclr.lCustData = 0L;
1022:
1023: switch( wMode )
1024: {
1025: case IDM_HOOK:
1026: case IDM_CUSTOM:
1027:
1028: #ifdef NOTIMPLEMENTED
1029: // chsclr.Flags = CC_PREVENTFULLOPEN | CC_ENABLEHOOK;
1030: // chsclr.lpfnHook = (FARPROC)MakeProcInstance(ChooseColorHookProc, NULL);
1031: // chsclr.lpTemplateName = (LPSTR)NULL;
1032: // break;
1033: #endif
1034:
1035: case IDM_STANDARD:
1036: chsclr.Flags = CC_PREVENTFULLOPEN;
1037: chsclr.lpfnHook = (LPCCHOOKPROC)(FARPROC)NULL;
1038: chsclr.lpTemplateName = (LPSTR)NULL;
1039: break;
1040:
1041:
1042: }
1043:
1044: if ( fSetColor = ChooseColor( &chsclr ))
1045: {
1046: crColor = chsclr.rgbResult;
1047: return (TRUE);
1048: }
1049: else
1050: {
1051: ProcessCDError(CommDlgExtendedError(), hWnd );
1052: return FALSE;
1053: }
1054: }
1055:
1056:
1057: /****************************************************************************
1058: *
1059: * FUNCTION: ChooseFontHookProc(HWND, UINT, UINT, LONG)
1060: *
1061: * PURPOSE: Processes messages for ChooseFont common dialog box
1062: *
1063: * COMMENTS:
1064: *
1065: * This hook procedure simply prompts the user whether or not they
1066: * want to change the font. if they choose YES, the color of the
1067: * font will be changed and the dialog will be dismissed. If they
1068: * choose NO, the font will not be changed and the user will be
1069: * returned to the dialog
1070: *
1071: * If the current mode is set to use a customized template, the
1072: * color drop down combo box is hidden.
1073: *
1074: * RETURN VALUES:
1075: * TRUE - Change the font.
1076: * FALSE - Return to the dialog box.
1077: *
1078: ****************************************************************************/
1079:
1080: BOOL APIENTRY ChooseFontHookProc(
1081: HWND hDlg, /* window handle of the dialog box */
1082: UINT message, /* type of message */
1083: UINT wParam, /* message-specific information */
1084: LONG lParam)
1085: {
1086:
1087: switch (message)
1088: {
1089: case WM_INITDIALOG:
1090: if (chf.Flags & CF_ENABLETEMPLATE)
1091: {
1092: ShowWindow(GetDlgItem(hDlg, stc4), SW_HIDE);
1093: ShowWindow(GetDlgItem(hDlg, cmb4), SW_HIDE);
1094: }
1095: break;
1096:
1097: case WM_COMMAND:
1098: if (LOWORD(wParam) == IDOK)
1099: {
1100: if (MessageBox( hDlg, "Are you sure you want to change the font?",
1101: "Information", MB_YESNO ) == IDYES )
1102: break;
1103: return (TRUE);
1104:
1105: }
1106: break;
1107: }
1108: return (FALSE);
1109:
1110: // avoid compiler warnings at W3
1111: lParam;
1112:
1113: }
1114:
1115:
1116: /****************************************************************************
1117: *
1118: * FUNCTION: ChooseNewFont(HWND)
1119: *
1120: * PURPOSE: Invokes common dialog function to chose a new font.
1121: *
1122: * COMMENTS:
1123: *
1124: * This function initializes the CHOOSEFONT structure for any mode
1125: * the user chooses: standard, using a hook or using a customized
1126: * template. It then calls the ChooseFont() common dialog function.
1127: *
1128: * RETURN VALUES:
1129: * TRUE - A new font was chosen.
1130: * FALSE - No new font was chosen.
1131: *
1132: ****************************************************************************/
1133: BOOL ChooseNewFont( HWND hWnd )
1134: {
1135:
1136: HDC hDC;
1137:
1138: hDC = GetDC( hWnd );
1139: chf.hDC = CreateCompatibleDC( hDC );
1140: ReleaseDC( hWnd, hDC );
1141: chf.lStructSize = sizeof(CHOOSEFONT);
1142: chf.hwndOwner = hWnd;
1143: chf.lpLogFont = &lf;
1144: chf.Flags = CF_SCREENFONTS | CF_EFFECTS;
1145: chf.rgbColors = RGB(0, 255, 255);
1146: chf.lCustData = 0;
1147: chf.hInstance = (HANDLE)hInst;
1148: chf.lpszStyle = (LPSTR)NULL;
1149: chf.nFontType = SCREEN_FONTTYPE;
1150: chf.nSizeMin = 0;
1151: chf.nSizeMax = 0;
1152:
1153: switch( wMode )
1154: {
1155: case IDM_STANDARD:
1156: chf.Flags = CF_SCREENFONTS | CF_EFFECTS;
1157: chf.lpfnHook = (LPCFHOOKPROC)(FARPROC)NULL;
1158: chf.lpTemplateName = (LPSTR)NULL;
1159: break;
1160:
1161: case IDM_HOOK:
1162: chf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_ENABLEHOOK;
1163: chf.lpfnHook = (LPCFHOOKPROC)MakeProcInstance(ChooseFontHookProc, NULL);
1164: chf.lpTemplateName = (LPSTR)NULL;
1165: break;
1166:
1167: case IDM_CUSTOM:
1168: chf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_ENABLEHOOK |
1169: CF_ENABLETEMPLATE;
1170: chf.lpfnHook = (LPCFHOOKPROC)MakeProcInstance(ChooseFontHookProc, NULL);
1171: chf.lpTemplateName = (LPSTR)MAKEINTRESOURCE(FORMATDLGORD31);
1172: break;
1173: }
1174:
1175:
1176: if( ChooseFont( &chf ) == FALSE )
1177: {
1178: DeleteDC( hDC );
1179: ProcessCDError(CommDlgExtendedError(), hWnd );
1180: return FALSE;
1181: }
1182:
1183:
1184: DeleteDC( hDC );
1185:
1186: return (TRUE);
1187: }
1188:
1189: /****************************************************************************
1190: *
1191: * FUNCTION: PrintSetupHookProc(HWND, UINT, UINT, LONG)
1192: *
1193: * PURPOSE: Processes messages for PrintDlg setup common dialog box
1194: *
1195: * COMMENTS:
1196: *
1197: * This function processes the hook and customized template for the
1198: * print setup common dialog box. If the customized template has
1199: * been provided, the 'Options' pushbutton is hidden. If the hook only mode
1200: * is chosen, a message box is displayed informing the user that the
1201: * hook has been installed.
1202: *
1203: * RETURN VALUES:
1204: * TRUE - Continue.
1205: * FALSE - Return to the dialog box.
1206: *
1207: ****************************************************************************/
1208:
1209: BOOL APIENTRY PrintSetupHookProc(
1210: HWND hDlg, /* window handle of the dialog box */
1211: UINT message, /* type of message */
1212: UINT wParam, /* message-specific information */
1213: LONG lParam)
1214: {
1215:
1216: switch (message)
1217: {
1218: case WM_INITDIALOG:
1219: if (pd.Flags & PD_ENABLESETUPTEMPLATE )
1220: {
1221: ShowWindow( GetDlgItem(hDlg, psh1), SW_HIDE );
1222: return(TRUE);
1223: }
1224: MessageBox( hDlg,
1225: "Hook installed.",
1226: "Information", MB_OK );
1227: return (TRUE);
1228: }
1229: return (FALSE);
1230:
1231: // avoid compiler warnings at W3
1232: lParam;
1233: wParam;
1234: }
1235:
1236:
1237:
1238: /****************************************************************************
1239: *
1240: * FUNCTION: PrintDlgHookProc(HWND, UINT, UINT, LONG)
1241: *
1242: * PURPOSE: Processes messages for PrintDlg common dialog box
1243: *
1244: * COMMENTS:
1245: *
1246: * This hook procedure simply prompts the user whether or not they
1247: * want to print. if they choose YES, the text buf will be printed
1248: * and the dialog will be dismissed. If they choose NO, the text buf
1249: * will not be printeded and the user will be returned to the dialog.
1250: *
1251: * If the current mode is 'custom', the 'Print to file' and 'Collate
1252: * Copies' options are hidden.
1253: *
1254: * RETURN VALUES:
1255: * TRUE - Continue.
1256: * FALSE - Return to the dialog box.
1257: *
1258: ****************************************************************************/
1259:
1260: BOOL APIENTRY PrintDlgHookProc(
1261: HWND hDlg, /* window handle of the dialog box */
1262: UINT message, /* type of message */
1263: UINT wParam, /* message-specific information */
1264: LONG lParam)
1265: {
1266:
1267: switch (message)
1268: {
1269: case WM_INITDIALOG:
1270: if (pd.Flags & PD_ENABLEPRINTTEMPLATE )
1271: {
1272: ShowWindow( GetDlgItem(hDlg, chx1), SW_HIDE );
1273: ShowWindow( GetDlgItem(hDlg, chx2), SW_HIDE );
1274: return(TRUE);
1275: }
1276: MessageBox( hDlg,
1277: "Hook installed.",
1278: "Information", MB_OK );
1279: return (TRUE);
1280:
1281: case WM_COMMAND:
1282: if (LOWORD(wParam) == IDOK)
1283: {
1284: if (MessageBox( hDlg, "Are you sure you want to print?",
1285: "Information", MB_YESNO ) == IDYES )
1286: break;
1287: return (TRUE);
1288:
1289: }
1290: break;
1291: }
1292: return (FALSE);
1293:
1294: // avoid compiler warnings at W3
1295: lParam;
1296:
1297: }
1298:
1299:
1300: /****************************************************************************
1301: *
1302: * FUNCTION: PrintFile(HWND)
1303: *
1304: * PURPOSE: Invokes common dialog function to print.
1305: *
1306: * COMMENTS:
1307: *
1308: * This function initializes the PRINTDLG structure for all modes
1309: * possible: standard, using a hook or using a customized template.
1310: * When hook mode is chosen, a hook is installed for both the
1311: * Print dialog and the Print Setup dialog. When custom mode is
1312: * chosen, the templates are enabled for both the print dialog and
1313: * the Print Setup dialog boxes.
1314: *
1315: * If the PrintDlg() common dialog returns TRUE, the current
1316: * text buffer is printed out.
1317: *
1318: *
1319: * RETURN VALUES:
1320: * void.
1321: *
1322: ****************************************************************************/
1323: void PrintFile( HWND hWnd )
1324: {
1325:
1326:
1327: // initialize PRINTDLG structure
1328: pd.lStructSize = sizeof(PRINTDLG);
1329: pd.hwndOwner = hWnd;
1330: pd.hDevMode = (HANDLE)NULL;
1331: pd.hDevNames = (HANDLE)NULL;
1332: pd.nFromPage = 0;
1333: pd.nToPage = 0;
1334: pd.nMinPage = 0;
1335: pd.nMaxPage = 0;
1336: pd.nCopies = 0;
1337: pd.hInstance = (HANDLE)hInst;
1338:
1339:
1340: switch( wMode )
1341: {
1342: case IDM_STANDARD:
1343: pd.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_PRINTSETUP;
1344: pd.lpfnSetupHook = (LPSETUPHOOKPROC)(FARPROC)NULL;
1345: pd.lpSetupTemplateName = (LPSTR)NULL;
1346: pd.lpfnPrintHook = (LPPRINTHOOKPROC)(FARPROC)NULL;
1347: pd.lpPrintTemplateName = (LPSTR)NULL;
1348: break;
1349:
1350: case IDM_HOOK:
1351: pd.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION |
1352: PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK | PD_PRINTSETUP;
1353: pd.lpfnSetupHook = (LPSETUPHOOKPROC)MakeProcInstance(PrintSetupHookProc, NULL);
1354: pd.lpSetupTemplateName = (LPSTR)NULL;
1355: pd.lpfnPrintHook = (LPPRINTHOOKPROC)MakeProcInstance(PrintDlgHookProc, NULL);
1356: pd.lpPrintTemplateName = (LPSTR)NULL;
1357: break;
1358:
1359: case IDM_CUSTOM:
1360: pd.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION |
1361: PD_ENABLEPRINTHOOK | PD_ENABLEPRINTTEMPLATE |
1362: PD_ENABLESETUPHOOK | PD_ENABLESETUPTEMPLATE | PD_PRINTSETUP;
1363: pd.lpfnSetupHook = (LPSETUPHOOKPROC)MakeProcInstance(PrintSetupHookProc, NULL);
1364: pd.lpSetupTemplateName = (LPSTR)MAKEINTRESOURCE(PRNSETUPDLGORD);
1365: pd.lpfnPrintHook = (LPPRINTHOOKPROC)MakeProcInstance(PrintDlgHookProc, NULL);
1366: pd.lpPrintTemplateName = (LPSTR)MAKEINTRESOURCE(PRINTDLGORD);
1367: break;
1368:
1369: }
1370:
1371: //print a test page if successful
1372: if (PrintDlg(&pd) == TRUE)
1373: {
1374: Escape(pd.hDC, STARTDOC, 8, "Test-Doc", NULL);
1375:
1376: //Print text
1377: TextOut(pd.hDC, 5, 5, FileBuf, strlen(FileBuf));
1378:
1379: Escape(pd.hDC, NEWFRAME, 0, NULL, NULL);
1380: Escape(pd.hDC, ENDDOC, 0, NULL, NULL );
1381: DeleteDC(pd.hDC);
1382: if (pd.hDevMode)
1383: GlobalFree(pd.hDevMode);
1384: if (pd.hDevNames)
1385: GlobalFree(pd.hDevNames);
1386: }
1387: else
1388: ProcessCDError(CommDlgExtendedError(), hWnd );
1389: }
1390:
1391:
1392: /****************************************************************************
1393: *
1394: * FUNCTION: ReplaceTextHookProc(HWND, UINT, UINT, LONG)
1395: *
1396: * PURPOSE: Processes messages for ReplaceText common dialog box
1397: *
1398: * COMMENTS:
1399: *
1400: * Puts up a message stating that the hook is active if hook
1401: * only active. Otherwise, if template enabled, hides the
1402: * Replace All pushbutton, plus the 'Match case' and
1403: * 'Match whole word' check box options.
1404: *
1405: * RETURN VALUES:
1406: * TRUE - Continue.
1407: * FALSE - Return to the dialog box.
1408: *
1409: ****************************************************************************/
1410:
1411: BOOL APIENTRY ReplaceTextHookProc(
1412: HWND hDlg, /* window handle of the dialog box */
1413: UINT message, /* type of message */
1414: UINT wParam, /* message-specific information */
1415: LONG lParam)
1416: {
1417:
1418: switch (message)
1419: {
1420: case WM_INITDIALOG:
1421: if (frText.Flags & FR_ENABLETEMPLATE )
1422: {
1423: ShowWindow( GetDlgItem(hDlg, psh2), SW_HIDE );
1424: ShowWindow( GetDlgItem(hDlg, chx1), SW_HIDE );
1425: ShowWindow( GetDlgItem(hDlg, chx2), SW_HIDE );
1426: return(TRUE);
1427: }
1428: MessageBox( hDlg,
1429: "Hook installed.",
1430: "Information", MB_OK );
1431: return (TRUE);
1432:
1433:
1434: default:
1435: break;
1436: }
1437: return (FALSE);
1438:
1439: // avoid compiler warnings at W3
1440: lParam;
1441: wParam;
1442: }
1443:
1444: /****************************************************************************
1445: *
1446: * FUNCTION: FindTextHookProc(HWND, UINT, UINT, LONG)
1447: *
1448: * PURPOSE: Processes messages for FindText common dialog box
1449: *
1450: * COMMENTS:
1451: *
1452: * Puts up a message stating that the hook is active if hook
1453: * only enabled. If custom template, hides the 'Match case'
1454: * and 'Match whole word' options, hides the group box 'Direction'
1455: * with the radio buttons 'Up' and 'Down'.
1456: *
1457: * RETURN VALUES:
1458: * TRUE - Continue.
1459: * FALSE - Return to the dialog box.
1460: *
1461: ****************************************************************************/
1462:
1463: BOOL APIENTRY FindTextHookProc(
1464: HWND hDlg, /* window handle of the dialog box */
1465: UINT message, /* type of message */
1466: UINT wParam, /* message-specific information */
1467: LONG lParam)
1468: {
1469:
1470: switch (message)
1471: {
1472: case WM_INITDIALOG:
1473: if (frText.Flags & FR_ENABLETEMPLATE )
1474: {
1475: ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE);
1476: ShowWindow(GetDlgItem(hDlg, grp1), SW_HIDE);
1477: ShowWindow(GetDlgItem(hDlg, chx2), SW_HIDE);
1478: ShowWindow(GetDlgItem(hDlg, rad1), SW_HIDE);
1479: ShowWindow(GetDlgItem(hDlg, rad2), SW_HIDE);
1480: return(TRUE);
1481: }
1482: MessageBox( hDlg,
1483: "Hook installed.",
1484: "Information", MB_OK );
1485: return (TRUE);
1486:
1487:
1488: default:
1489: break;
1490: }
1491: return (FALSE);
1492:
1493: // avoid compiler warnings at W3
1494: lParam;
1495: wParam;
1496: }
1497:
1498:
1499: /****************************************************************************
1500: *
1501: * FUNCTION: CallFindText( HWND )
1502: *
1503: * PURPOSE: Initializes and calls the FindText()
1504: * common dialog.
1505: *
1506: * COMMENTS:
1507: *
1508: * This function initialzes the FINDREPLACE structure for any mode:
1509: * standard, using a hook or using a customized template. It then
1510: * calls the FindText() common dialog function.
1511: *
1512: * RETURN VALUES:
1513: * void.
1514: *
1515: ****************************************************************************/
1516: void CallFindText( HWND hWnd )
1517: {
1518:
1519: frText.lStructSize = sizeof( frText );
1520: frText.hwndOwner = hWnd;
1521: frText.hInstance = (HANDLE)hInst;
1522: frText.lpstrFindWhat = szFindString;
1523: frText.lpstrReplaceWith = (LPSTR)NULL;
1524: frText.wFindWhatLen = sizeof(szFindString);
1525: frText.wReplaceWithLen = 0;
1526: frText.lCustData = 0;
1527:
1528: switch( wMode )
1529: {
1530: case IDM_STANDARD:
1531: frText.Flags = FR_NOMATCHCASE | FR_NOUPDOWN | FR_NOWHOLEWORD;
1532: frText.lpfnHook = (LPFRHOOKPROC)(FARPROC)NULL;
1533: frText.lpTemplateName = (LPSTR)NULL;
1534: break;
1535:
1536: case IDM_HOOK:
1537: frText.Flags = FR_NOMATCHCASE | FR_NOUPDOWN | FR_NOWHOLEWORD |
1538: FR_ENABLEHOOK;
1539: frText.lpfnHook = (LPFRHOOKPROC)MakeProcInstance(FindTextHookProc, NULL);
1540: frText.lpTemplateName = (LPSTR)NULL;
1541: break;
1542:
1543: case IDM_CUSTOM:
1544: frText.Flags = FR_NOMATCHCASE | FR_NOUPDOWN | FR_NOWHOLEWORD |
1545: FR_ENABLEHOOK | FR_ENABLETEMPLATE;
1546: frText.lpfnHook = (LPFRHOOKPROC)MakeProcInstance(FindTextHookProc, NULL);
1547: frText.lpTemplateName = (LPSTR)MAKEINTRESOURCE(FINDDLGORD);
1548: break;
1549: }
1550:
1551: if ((hDlgFR = FindText(&frText)) == NULL)
1552: ProcessCDError(CommDlgExtendedError(), hWnd );
1553:
1554: }
1555:
1556:
1557: /****************************************************************************
1558: *
1559: * FUNCTION: CallReplaceText( HWND )
1560: *
1561: * PURPOSE: Initializes and calls the ReplaceText()
1562: * common dialog.
1563: *
1564: * COMMENTS:
1565: *
1566: * This function initialzes the FINDREPLACE structure for any mode:
1567: * standard, using a hook or using a customized template. It then
1568: * calls the ReplaceText() common dialog function.
1569: *
1570: * RETURN VALUES:
1571: * void.
1572: *
1573: ****************************************************************************/
1574: void CallReplaceText( HWND hWnd )
1575: {
1576: frText.lStructSize = sizeof( frText );
1577: frText.hwndOwner = hWnd;
1578: frText.hInstance = (HANDLE)hInst;
1579: frText.lpstrFindWhat = szFindString;
1580: frText.lpstrReplaceWith = szReplaceString;
1581: frText.wFindWhatLen = sizeof(szFindString);
1582: frText.wReplaceWithLen = sizeof( szReplaceString );
1583: frText.lCustData = 0;
1584:
1585: switch( wMode )
1586: {
1587: case IDM_STANDARD:
1588: frText.Flags = FR_NOMATCHCASE | FR_NOUPDOWN | FR_NOWHOLEWORD;
1589: frText.lpfnHook = (LPFRHOOKPROC)(FARPROC)NULL;
1590: frText.lpTemplateName = (LPSTR)NULL;
1591: break;
1592:
1593: case IDM_HOOK:
1594: frText.Flags = FR_NOMATCHCASE | FR_NOUPDOWN | FR_NOWHOLEWORD |
1595: FR_ENABLEHOOK;
1596: frText.lpfnHook = (LPFRHOOKPROC)MakeProcInstance(ReplaceTextHookProc, NULL);
1597: frText.lpTemplateName = (LPSTR)NULL;
1598: break;
1599:
1600: case IDM_CUSTOM:
1601: frText.Flags = FR_NOMATCHCASE | FR_NOUPDOWN | FR_NOWHOLEWORD |
1602: FR_ENABLEHOOK | FR_ENABLETEMPLATE;
1603: frText.lpfnHook = (LPFRHOOKPROC)MakeProcInstance(ReplaceTextHookProc, NULL);
1604: frText.lpTemplateName = (LPSTR)MAKEINTRESOURCE(REPLACEDLGORD);
1605: break;
1606: }
1607:
1608: if ((hDlgFR = ReplaceText( &frText )) == NULL)
1609: ProcessCDError(CommDlgExtendedError(), hWnd );
1610:
1611: }
1612:
1613: /****************************************************************************
1614: *
1615: * FUNCTION: SearchFile(LPFINDREPLACE)
1616: *
1617: * PURPOSE: Does the find/replace specified by the Find/ReplaceText
1618: * common dialog.
1619: *
1620: * COMMENTS:
1621: *
1622: * This function does the lease necessary to implement find and
1623: * replace by calling existing c-runtime functions. It is in
1624: * no way intended to demonstrate either correct or efficient
1625: * methods for doing textual search or replacement.
1626: *
1627: * RETURN VALUES:
1628: * void.
1629: *
1630: ****************************************************************************/
1631: void SearchFile( LPFINDREPLACE lpFR )
1632: {
1633:
1634: CHAR Buf[FILE_LEN];
1635: CHAR *pStr;
1636: int count;
1637:
1638:
1639: strnset(Buf, '\0', FILE_LEN -1);
1640: if ((pStr = strstr( FileBuf, lpFR->lpstrFindWhat )) == NULL)
1641: {
1642: sprintf( Buf, "%s not found.", lpFR->lpstrFindWhat );
1643: MessageBox( lpFR->hwndOwner, Buf, "No luck", MB_OK | MB_TASKMODAL);
1644: }
1645:
1646: else
1647: {
1648: if ( lpFR->wReplaceWithLen == 0)
1649: {
1650: sprintf( Buf, "%s found!", lpFR->lpstrFindWhat );
1651: MessageBox( lpFR->hwndOwner, Buf, "Success!", MB_OK | MB_TASKMODAL );
1652: }
1653: else
1654: {
1655: // replace string specified in the replace with found string
1656: // copy up to found string into new buffer
1657: for (count=0; ; count++)
1658: if (*pStr == *(FileBuf+count))
1659: break;
1660: strncpy( Buf, FileBuf, count );
1661: // concatenate new string
1662: strcat( Buf, lpFR->lpstrReplaceWith );
1663: // copy rest of string (less the found string)
1664: count += strlen(lpFR->lpstrFindWhat);
1665: strcat( Buf, &FileBuf[count]);
1666: strcpy( FileBuf, Buf );
1667: dwFileSize = strlen(FileBuf);
1668: MessageBox( lpFR->hwndOwner, Buf, "Success!", MB_OK | MB_TASKMODAL );
1669: }
1670: }
1671: EndDialog( hDlgFR, FALSE );
1672: }
1673:
1674:
1675: /****************************************************************************
1676: *
1677: * FUNCTION: ProcessCDError(DWORD)
1678: *
1679: * PURPOSE: Processes errors from the common dialog functions.
1680: *
1681: * COMMENTS:
1682: *
1683: * This function is called whenever a common dialog function
1684: * fails. The CommonDialogExtendedError() value is passed to
1685: * the function which maps the error value to a string table.
1686: * The string is loaded and displayed for the user.
1687: *
1688: * RETURN VALUES:
1689: * void.
1690: *
1691: ****************************************************************************/
1692: void ProcessCDError(DWORD dwErrorCode, HWND hWnd)
1693: {
1694: WORD wStringID;
1695: CHAR buf[256];
1696:
1697: switch(dwErrorCode)
1698: {
1699: case CDERR_DIALOGFAILURE: wStringID=IDS_DIALOGFAILURE; break;
1700: case CDERR_STRUCTSIZE: wStringID=IDS_STRUCTSIZE; break;
1701: case CDERR_INITIALIZATION: wStringID=IDS_INITIALIZATION; break;
1702: case CDERR_NOTEMPLATE: wStringID=IDS_NOTEMPLATE; break;
1703: case CDERR_NOHINSTANCE: wStringID=IDS_NOHINSTANCE; break;
1704: case CDERR_LOADSTRFAILURE: wStringID=IDS_LOADSTRFAILURE; break;
1705: case CDERR_FINDRESFAILURE: wStringID=IDS_FINDRESFAILURE; break;
1706: case CDERR_LOADRESFAILURE: wStringID=IDS_LOADRESFAILURE; break;
1707: case CDERR_LOCKRESFAILURE: wStringID=IDS_LOCKRESFAILURE; break;
1708: case CDERR_MEMALLOCFAILURE: wStringID=IDS_MEMALLOCFAILURE; break;
1709: case CDERR_MEMLOCKFAILURE: wStringID=IDS_MEMLOCKFAILURE; break;
1710: case CDERR_NOHOOK: wStringID=IDS_NOHOOK; break;
1711: case PDERR_SETUPFAILURE: wStringID=IDS_SETUPFAILURE; break;
1712: case PDERR_PARSEFAILURE: wStringID=IDS_PARSEFAILURE; break;
1713: case PDERR_RETDEFFAILURE: wStringID=IDS_RETDEFFAILURE; break;
1714: case PDERR_LOADDRVFAILURE: wStringID=IDS_LOADDRVFAILURE; break;
1715: case PDERR_GETDEVMODEFAIL: wStringID=IDS_GETDEVMODEFAIL; break;
1716: case PDERR_INITFAILURE: wStringID=IDS_INITFAILURE; break;
1717: case PDERR_NODEVICES: wStringID=IDS_NODEVICES; break;
1718: case PDERR_NODEFAULTPRN: wStringID=IDS_NODEFAULTPRN; break;
1719: case PDERR_DNDMMISMATCH: wStringID=IDS_DNDMMISMATCH; break;
1720: case PDERR_CREATEICFAILURE: wStringID=IDS_CREATEICFAILURE; break;
1721: case PDERR_PRINTERNOTFOUND: wStringID=IDS_PRINTERNOTFOUND; break;
1722: case CFERR_NOFONTS: wStringID=IDS_NOFONTS; break;
1723: case FNERR_SUBCLASSFAILURE: wStringID=IDS_SUBCLASSFAILURE; break;
1724: case FNERR_INVALIDFILENAME: wStringID=IDS_INVALIDFILENAME; break;
1725: case FNERR_BUFFERTOOSMALL: wStringID=IDS_BUFFERTOOSMALL; break;
1726:
1727: case 0: //User may have hit CANCEL or we got a *very* random error
1728: return;
1729:
1730: default:
1731: wStringID=IDS_UNKNOWNERROR;
1732: }
1733:
1734: LoadString(NULL, wStringID, buf, sizeof(buf));
1735: MessageBox(hWnd, buf, NULL, MB_OK);
1736: return;
1737: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.