Annotation of q_a/samples/cmndlg/cmndlg.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.