Annotation of mstools/samples/porttool/porttool.c, revision 1.1.1.1

1.1       root        1: #include "porttool.h"
                      2: #include "port.h"
                      3: 
                      4: // forward declarations of helper functions in this module
                      5: HWND   WINAPI StartInteractive (HANDLE, char *, int);
                      6: HANDLE WINAPI StartBackground (HANDLE, HWND, char *);
                      7: VOID   WINAPI InitializeMenu (HWND, HANDLE);
                      8: LONG   WINAPI CommandHandler (HWND, UINT, LONG);
                      9: int    WINAPI SetWrap (HWND);
                     10: BOOL   WINAPI GetCmdLine (char *, char *, BOOL *);
                     11: int    WINAPI Save_YNC (HWND);
                     12: VOID   WINAPI SetWindowTitle (HWND, char*);
                     13: VOID   WINAPI GetEditSubString (HWND, PUINT, PUINT, char *);
                     14: 
                     15: UINT   uSearchMsg;
                     16: HWND   hDlgPortStatus;
                     17: HWND   hDlgPort;
                     18: 
                     19: 
                     20: // test case static variables for background porting
                     21: HANDLE             hEvents[nBKPORTEVENTS];
                     22: BKPORTFILESTRUCT    BkPort;
                     23: 
                     24: 
                     25: 
                     26: // entry point ot this executable
                     27: int WINAPI WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow)
                     28:     HANDLE hInstance;
                     29:     HANDLE hPrevInstance;
                     30:     LPSTR  lpCmdLine;
                     31:     int    nCmdShow;
                     32: {
                     33:     MSG        msg;
                     34:     HWND       hWnd;
                     35:     HANDLE     hAccel;
                     36:     BOOL       bBkgnd = 0;
                     37:     char       *lpszBuff = NULL;
                     38:     char       *lpszCmdLine = NULL;
                     39:     char       *lpCL;
                     40: 
                     41: 
                     42:     // previous instances do not exist in Win32
                     43:     if (hPrevInstance)
                     44:        return 0;
                     45: 
                     46:     // parse and copy command line parameters to local memory
                     47:     lpCL = GetCommandLine ();
                     48:     if (lpszCmdLine = (char *)LocalAlloc (LPTR, strlen (lpCL) + 1))
                     49:        GetCmdLine (lpCL, lpszCmdLine, &bBkgnd);
                     50: 
                     51:     // if /b switch, start background porting session
                     52:     if (bBkgnd)
                     53:        {
                     54:        // invoke background port status dialog
                     55:        if (!(hDlgPortStatus = StartBackground (hInstance, NULL, lpszCmdLine)))
                     56:            return FALSE;
                     57:        }
                     58: 
                     59:     // start interactive porting session
                     60:     else
                     61:        {
                     62:        if (!(hWnd = StartInteractive (hInstance, lpszCmdLine, nCmdShow)))
                     63:            return FALSE;
                     64:        }
                     65: 
                     66:     // free memory allocated for pCmdLine
                     67:     if (lpszCmdLine)
                     68:        LocalFree ((HLOCAL)lpszCmdLine);
                     69: 
                     70:     // load main accelerator table
                     71:     hAccel = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDA_PORTTOOL));
                     72: 
                     73:     // main window message loop
                     74:     while (GetMessage (&msg, NULL, 0, 0))
                     75:        {
                     76:        if ((!hDlgSearch     || !IsDialogMessage (hDlgSearch, &msg))     &&
                     77:            (!hDlgPort       || !IsDialogMessage (hDlgPort, &msg))       &&
                     78:            (!hDlgPortStatus || !IsDialogMessage (hDlgPortStatus, &msg)) &&
                     79:            (!hAccel         || !TranslateAccelerator (hWnd, hAccel, &msg)))
                     80:            {
                     81:            TranslateMessage (&msg);
                     82:            DispatchMessage (&msg);
                     83:            }
                     84:        }
                     85: 
                     86:     // return success of application
                     87:     return TRUE;
                     88: }
                     89: 
                     90: 
                     91: 
                     92: 
                     93: // start background port status dialog
                     94: HANDLE WINAPI StartBackground (
                     95:     HANDLE    hModule,
                     96:     HWND      hWndParent,
                     97:     char      *lpszCmdLine)
                     98: {
                     99:     return (CreateDialogParam (hModule,
                    100:                               IDD_BKPORTDIALOG,
                    101:                               hWndParent,
                    102:                               BkPortDlgProc,
                    103:                               (LPARAM)lpszCmdLine));
                    104: }
                    105: 
                    106: 
                    107: 
                    108: 
                    109: // start interactive version of app
                    110: HWND WINAPI StartInteractive (
                    111:     HANDLE    hInstance,
                    112:     char      *lpszCmdLine,
                    113:     int       nCmdShow)
                    114:     {
                    115:     WNDCLASS   wc;
                    116:     char       lpszClass[MAX_PATH];
                    117:     HWND       hWnd;
                    118: 
                    119:     // load resources strings
                    120:     LoadString (hInstance, IDS_APPNAME, lpszClass, sizeof (lpszClass));
                    121: 
                    122:     /* Register the frame class */
                    123:     wc.style        = 0;
                    124:     wc.lpfnWndProc   = (WNDPROC)MainWndProc;
                    125:     wc.cbClsExtra    = 0;
                    126:     wc.cbWndExtra    = CBWNDEXTRA;
                    127:     wc.hInstance     = hInstance;
                    128:     wc.hIcon        = LoadIcon (hInstance, IDPortTool);
                    129:     wc.hCursor      = LoadCursor (NULL,IDC_ARROW);
                    130:     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
                    131:     wc.lpszMenuName  = IDPortTool;
                    132:     wc.lpszClassName = lpszClass;
                    133: 
                    134:     if (!RegisterClass (&wc) )
                    135:        return FALSE;
                    136: 
                    137:     /* Create the frame */
                    138:     hWnd = CreateWindow (lpszClass,
                    139:                         "Win32 Port",
                    140:                         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | DS_LOCALEDIT,
                    141:                         CW_USEDEFAULT,
                    142:                         0,
                    143:                         CW_USEDEFAULT,
                    144:                         0,
                    145:                         NULL,
                    146:                         NULL,
                    147:                         hInstance,
                    148:                         (*lpszCmdLine ? lpszCmdLine : 0));
                    149: 
                    150:     // make sure window was created
                    151:     if (!hWnd)
                    152:        return FALSE;
                    153: 
                    154:     // register search/replace message for common dialog use
                    155:     uSearchMsg = RegisterWindowMessage ((char *)FINDMSGSTRING);
                    156: 
                    157:     // show and update main window
                    158:     ShowWindow (hWnd, nCmdShow);
                    159:     UpdateWindow (hWnd);
                    160: 
                    161:     return hWnd;
                    162: }
                    163: 
                    164: 
                    165: 
                    166: // main window procedure
                    167: LONG WINAPI MainWndProc (
                    168:     HWND    hWnd,
                    169:     UINT    uMsg,
                    170:     UINT    uParam,
                    171:     LONG    lParam)
                    172: {
                    173:        LONG    lRet = 1;
                    174:        int     nResult;
                    175:        RECT    rc;
                    176: 
                    177:     switch (uMsg)
                    178:        {
                    179:        case WM_CREATE:
                    180:            {
                    181:            HWND              hWndEdit;
                    182:            LPCREATESTRUCT    lpcs = (LPCREATESTRUCT)lParam;
                    183:            char              lpszBuff[MAX_PATH];
                    184:            LOGFONT           lfEditFont;
                    185:            HFONT             hFont;
                    186:            HCURSOR           hOldCursor;
                    187: 
                    188:            // put hourglass cursor up
                    189:            hOldCursor = (HCURSOR)SetClassLong (hWnd, GCL_HCURSOR, NULL);
                    190:            SetCursor (LoadCursor (NULL, IDC_WAIT));
                    191: 
                    192:            /* Create an edit control */
                    193:            GetClientRect (hWnd, &rc);
                    194:            hWndEdit = CreateWindow ("edit",
                    195:                                     " ",
                    196:                                     WS_CHILD | WS_VISIBLE | DS_LOCALEDIT |
                    197:                                         WS_HSCROLL | WS_VSCROLL |
                    198:                                         ES_AUTOHSCROLL | ES_AUTOVSCROLL |
                    199:                                         ES_MULTILINE | ES_NOHIDESEL,
                    200:                                     rc.left,
                    201:                                     rc.top,
                    202:                                     rc.right-rc.left,
                    203:                                     rc.bottom-rc.top,
                    204:                                     hWnd,
                    205:                                     (HMENU)IDC_EDIT,
                    206:                                     (HANDLE)GetModuleHandle (NULL),
                    207:                                     0);
                    208: 
                    209:            // if edit control failed, abort aplication
                    210:            if (!IsWindow (hWndEdit))
                    211:                {
                    212:                ErrorNotify (hWnd, IDS_EDITWNDFAILED);
                    213:                return FALSE;
                    214:                }
                    215: 
                    216:            // save edit window handle and init state variables
                    217:            SetWindowLong (hWnd, WL_HWNDEDIT, (LONG) hWndEdit);
                    218:            SetWindowWord (hWnd, WW_SCROLL, TRUE);
                    219:            SetWindowWord (hWnd, WW_UNTITLED, TRUE);
                    220:            SetWindowWord (hWnd, WW_SEARCHCASE, TRUE);
                    221:            SetWindowWord (hWnd, WW_SEARCHDN, TRUE);
                    222:            SetWindowLong (hWnd, WL_HPTRDEVNAMES, 0);
                    223: 
                    224:            // get printer configuration
                    225:            if (!GetPrinterConfig (hWnd))
                    226:                ErrorNotify (hWnd, IDS_PTRCONFIGFAILED);
                    227: 
                    228:            // if initialization file passed, load file now
                    229:            if (lpcs->lpCreateParams)
                    230:                {
                    231:                // load filename passed at initialization
                    232:                if ((nResult = LoadFile (hWnd, lpcs->lpCreateParams)) > 0)
                    233:                    {
                    234:                    // save filename and path in global string
                    235:                    strcpy (lpszFilePath, lpcs->lpCreateParams);
                    236: 
                    237:                    // The file has a title, so reset the UNTITLED flag.
                    238:                    SetWindowWord(hWnd, WW_UNTITLED, FALSE);
                    239: 
                    240:                    // extract filename from path
                    241:                    GetFileFromPath (lpszFilePath, lpszBuff);
                    242: 
                    243:                    // set window text title to be "AppName - filename"
                    244:                    SetWindowTitle (hWnd, lpszBuff);
                    245:                    }
                    246:                else
                    247:                    {
                    248:                    // notify user of error
                    249:                    ErrorNotify (hWnd, nResult);
                    250: 
                    251:                    // set window title to "AppName - Untitled"
                    252:                    LoadString ((HANDLE)GetModuleHandle (NULL),
                    253:                                IDS_UNTITLED,
                    254:                                lpszBuff,
                    255:                                sizeof (lpszBuff));
                    256:                    SetWindowTitle (hWnd, lpszBuff);
                    257:                    }
                    258:                }
                    259:            else
                    260:                {
                    261:                // set window title to "AppName - Untitled"
                    262:                LoadString ((HANDLE)GetModuleHandle (NULL),
                    263:                            IDS_UNTITLED,
                    264:                            lpszBuff,
                    265:                            sizeof (lpszBuff));
                    266:                SetWindowTitle (hWnd, lpszBuff);
                    267: 
                    268:                // set global file and path variables to null
                    269:                *lpszFilePath = 0;
                    270:                }
                    271: 
                    272:            // create fixed pitch font as default font
                    273:            lfEditFont.lfHeight = 16;
                    274:            lfEditFont.lfWidth = 0;
                    275:            lfEditFont.lfEscapement = 0;
                    276:            lfEditFont.lfOrientation = 0;
                    277:            lfEditFont.lfWeight = 400;
                    278:            lfEditFont.lfItalic = FALSE;
                    279:            lfEditFont.lfUnderline = FALSE;
                    280:            lfEditFont.lfStrikeOut = FALSE;
                    281:            lfEditFont.lfCharSet = ANSI_CHARSET;
                    282:            lfEditFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
                    283:            lfEditFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
                    284:            lfEditFont.lfQuality = DEFAULT_QUALITY;
                    285:            lfEditFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
                    286:            *lfEditFont.lfFaceName = 0;
                    287: 
                    288:            // make scroll bars initially visible
                    289:            SetScrollRange (hWndEdit, SB_VERT, 0, 100, TRUE);
                    290:            SetScrollRange (hWndEdit, SB_HORZ, 0, 100, TRUE);
                    291: 
                    292:            // create the logical font
                    293:            if (hFont = CreateFontIndirect (&lfEditFont))
                    294:                SendMessage (hWndEdit, WM_SETFONT, (UINT)hFont, 0);
                    295:            else
                    296:                ErrorNotify (hWnd, IDS_FONTFAILEDTOCREATE);
                    297: 
                    298:            // remove hourglass cursor
                    299:            SetClassLong (hWnd, GCL_HCURSOR, (LONG)hOldCursor);
                    300:            SetCursor (hOldCursor);
                    301: 
                    302:            // set focus to edit window
                    303:            SetFocus (hWndEdit);
                    304:            }
                    305:            break;
                    306: 
                    307:        case WM_SIZE:
                    308:            {
                    309:            RECT    rc;
                    310:            HWND    hWndEdit;
                    311: 
                    312:            // resize the edit control to match the client area
                    313:            hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
                    314:            GetClientRect (hWnd, &rc);
                    315:            MoveWindow (hWndEdit,
                    316:                        rc.left,
                    317:                        rc.top,
                    318:                        rc.right-rc.left,
                    319:                        rc.bottom-rc.top,
                    320:                        TRUE);
                    321:            }
                    322:            break;
                    323: 
                    324:        case WM_SETFOCUS:
                    325:            SetFocus ((HWND)GetWindowLong (hWnd, WL_HWNDEDIT));
                    326:            break;
                    327: 
                    328:        case WM_INITMENU:
                    329:            // initialize menuitems
                    330:            InitializeMenu (hWnd, (HMENU)uParam);
                    331:            break;
                    332: 
                    333:        case WM_WININICHANGE:
                    334:        case WM_DEVMODECHANGE:
                    335:            // get printer configuration
                    336:            GetPrinterConfig (hWnd);
                    337:            break;
                    338: 
                    339:        case WM_COMMAND:
                    340:            // handle all command messages in a localized function
                    341:            lRet = CommandHandler (hWnd, uParam, lParam);
                    342:            break;
                    343: 
                    344:        case WM_CLOSE:
                    345:        case WM_QUERYENDSESSION:
                    346:            {
                    347:            HWND    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
                    348: 
                    349:            // check if there are changes to the edit contents, and offer to save first
                    350:            if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
                    351:                {
                    352:                switch (Save_YNC (hWnd))
                    353:                    {
                    354:                    case IDCANCEL:
                    355:                        // abort exit
                    356:                        return FALSE;
                    357:                    case IDYES:
                    358:                        // save data then continue
                    359:                        if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
                    360:                            return FALSE;
                    361:                    case IDNO:
                    362:                        // just fall through
                    363:                        break;
                    364:                    }
                    365:                }
                    366: 
                    367:            // call destroy window to cleanup and go away
                    368:            DestroyWindow (hWnd);
                    369:            }
                    370:            break;
                    371: 
                    372:        case WM_DESTROY:
                    373:            {
                    374:            HFONT    hFont = (HFONT)SendMessage ((HWND)GetWindowLong (hWnd, WL_HWNDEDIT),
                    375:                                                 WM_GETFONT,
                    376:                                                 0,
                    377:                                                 0);
                    378: 
                    379:            // destroy font handle from edit control if exists
                    380:            if (hFont)
                    381:                DeleteObject (hFont);
                    382: 
                    383:            PostQuitMessage (0);
                    384:            }
                    385:            break;
                    386: 
                    387:        default:
                    388:            // process common dialog search message here, then break
                    389:            if (uMsg == uSearchMsg)
                    390:                {
                    391:                LPFINDREPLACE    lpfr = (LPFINDREPLACE)lParam;
                    392: 
                    393:                if (lpfr->Flags & FR_DIALOGTERM)
                    394:                    {
                    395:                    // save case and direction
                    396:                    SetWindowWord (hWnd, WW_SEARCHCASE, (WORD)(lpfr->Flags & FR_MATCHCASE));
                    397:                    SetWindowWord (hWnd, WW_SEARCHDN, (WORD)(lpfr->Flags & FR_DOWN));
                    398:                    hDlgSearch = NULL;
                    399:                    }
                    400: 
                    401:                else if (lpfr->Flags & FR_FINDNEXT)
                    402:                    if (!LocateText (hWnd,
                    403:                                     (WORD)(lpfr->Flags & FR_MATCHCASE),
                    404:                                     (WORD)(lpfr->Flags & FR_DOWN),
                    405:                                     lpszSearch))
                    406:                        ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
                    407:                break;
                    408:                }
                    409: 
                    410:            // pass all unhandled messages to DefWindowProc
                    411:            lRet = DefWindowProc (hWnd, uMsg, uParam, lParam);
                    412:            break;
                    413:        }
                    414: 
                    415:     // return 1 if handled message, 0 if not
                    416:     return lRet;
                    417: }
                    418: 
                    419: 
                    420: 
                    421: // about box dialog procedure
                    422: BOOL WINAPI AboutDlgProc (
                    423:     HWND    hwnd,
                    424:     UINT    uMsg,
                    425:     UINT    uParam,
                    426:     LONG    lParam)
                    427: {
                    428:     BOOL    bRet = TRUE;
                    429: 
                    430:     switch (uMsg)
                    431:        {
                    432:        case WM_COMMAND:
                    433:            switch (LOWORD (uParam))
                    434:                {
                    435:                // end dialog with TRUE or FALSE for OK or CANCEL
                    436:                case IDOK:
                    437:                case IDCANCEL:
                    438:                    EndDialog(hwnd, (LOWORD (uParam) == IDOK));
                    439:                    break;
                    440: 
                    441:                default:
                    442:                    bRet = FALSE;
                    443:                }
                    444:            break;
                    445: 
                    446:        default:
                    447:            bRet =  FALSE;
                    448:            break;
                    449:        }
                    450:     return bRet;
                    451: }
                    452: 
                    453: 
                    454: 
                    455: // initialize menu function
                    456: VOID WINAPI InitializeMenu (
                    457:     HWND    hWnd,
                    458:     HANDLE  hMenu)
                    459: {
                    460:     WORD    mfStatus;
                    461:     DWORD   dwSel;
                    462:     HWND    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
                    463:     WORD    wScroll;
                    464: 
                    465:     // see if edit control can undo last command
                    466:     if (SendMessage (hWndEdit, EM_CANUNDO, 0, 0L))
                    467:        mfStatus = MF_ENABLED;
                    468:     else
                    469:        mfStatus = MF_GRAYED;
                    470:     EnableMenuItem (hMenu, IDM_EDITUNDO, mfStatus);
                    471: 
                    472:     // enable menuitems CUT, COPY and CLEAR if selected text
                    473:     dwSel = SendMessage (hWndEdit, EM_GETSEL, 0, 0);
                    474:     mfStatus = (WORD)((LOWORD(dwSel) == HIWORD(dwSel))?MF_GRAYED:MF_ENABLED);
                    475:     EnableMenuItem (hMenu, IDM_EDITCUT, mfStatus);
                    476:     EnableMenuItem (hMenu, IDM_EDITCOPY, mfStatus);
                    477:     EnableMenuItem (hMenu, IDM_EDITCLEAR, mfStatus);
                    478: 
                    479:     // if text allow for new file, enable menuitem
                    480:     if (SendMessage (hWndEdit, WM_GETTEXTLENGTH, NULL, NULL))
                    481:        EnableMenuItem (hMenu, IDM_FILENEW, MF_ENABLED);
                    482:     else
                    483:        EnableMenuItem (hMenu, IDM_FILENEW, MF_GRAYED);
                    484: 
                    485:     // if CF_TEXT format data is available in clipboard
                    486:     if (OpenClipboard (hWnd) & IsClipboardFormatAvailable (CF_TEXT))
                    487:        EnableMenuItem (hMenu, IDM_EDITPASTE, MF_ENABLED);
                    488:     else
                    489:        EnableMenuItem (hMenu, IDM_EDITPASTE, MF_GRAYED);
                    490:     CloseClipboard ();
                    491: 
                    492:     // set the scroll bars menuitem
                    493:     wScroll = GetWindowWord (hWnd, WW_SCROLL);
                    494:     CheckMenuItem (hMenu, IDM_EDITSCROLL, (UINT)(wScroll ? MF_CHECKED : MF_UNCHECKED));
                    495: 
                    496:     // set the word wrap state for the window
                    497:     dwSel = GetWindowLong (hWndEdit, GWL_STYLE);
                    498:     CheckMenuItem (hMenu,
                    499:                   IDM_EDITWRAP,
                    500:                   (UINT)((dwSel & ES_AUTOHSCROLL) ? MF_UNCHECKED : MF_CHECKED));
                    501: 
                    502:     // enable search menuitems if a search string exists
                    503:     if (*lpszSearch)
                    504:        {
                    505:        EnableMenuItem (hMenu, IDM_SEARCHNEXT, MF_ENABLED);
                    506:        EnableMenuItem (hMenu, IDM_SEARCHPREV, MF_ENABLED);
                    507:        }
                    508:     else
                    509:        {
                    510:        EnableMenuItem (hMenu, IDM_SEARCHNEXT, MF_GRAYED);
                    511:        EnableMenuItem (hMenu, IDM_SEARCHPREV, MF_GRAYED);
                    512:        }
                    513: 
                    514:     // enable Print menuitems if a printer is available
                    515:     if (GetWindowLong (hWnd, WL_HPTRDEVNAMES))
                    516:        {
                    517:        EnableMenuItem (hMenu, IDM_FILEPRINT, MF_ENABLED);
                    518:        EnableMenuItem ( hMenu, IDM_FILESETUP, MF_ENABLED);
                    519:        }
                    520:     else
                    521:        {
                    522:        EnableMenuItem (hMenu, IDM_FILEPRINT, MF_GRAYED);
                    523:        EnableMenuItem ( hMenu, IDM_FILESETUP, MF_GRAYED);
                    524:        }
                    525: 
                    526:     // menuitems that are always enabled
                    527:     EnableMenuItem(hMenu, IDM_EDITSCROLL, MF_ENABLED);
                    528:     EnableMenuItem(hMenu, IDM_EDITSELECT, MF_ENABLED);
                    529:     EnableMenuItem(hMenu, IDM_EDITWRAP, MF_ENABLED);
                    530:     EnableMenuItem(hMenu, IDM_SEARCHFIND, MF_ENABLED);
                    531: }
                    532: 
                    533: 
                    534: 
                    535: // handle all WM_COMMAND messages here
                    536: LONG WINAPI CommandHandler (
                    537:     HWND    hWnd,
                    538:     UINT    uParam,
                    539:     LONG    lParam)
                    540: {
                    541:     int     nResult;
                    542:     HWND    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
                    543: 
                    544:     switch (LOWORD(uParam))
                    545:        {
                    546:        case IDM_FILENEW:
                    547:            {
                    548:            char    lpszMsg[MAX_PATH];
                    549: 
                    550:            // check if there are changes, and offer to save first
                    551:            if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
                    552:                {
                    553:                switch (Save_YNC (hWnd))
                    554:                    {
                    555:                    case IDCANCEL:
                    556:                        // abort operation
                    557:                        return FALSE;
                    558:                    case IDYES:
                    559:                        // save data then continue if successful
                    560:                        if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
                    561:                            return FALSE;
                    562:                    case IDNO:
                    563:                        // just fall through
                    564:                        break;
                    565:                    }
                    566: 
                    567:                // reset edit changes flag
                    568:                SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
                    569:                }
                    570: 
                    571:            // clear edit control
                    572:            SetWindowText (hWndEdit, "");
                    573: 
                    574:            // set window title to "Untitled"
                    575:            LoadString ((HANDLE)GetModuleHandle (NULL),
                    576:                        IDS_UNTITLED,
                    577:                        lpszMsg,
                    578:                        sizeof (lpszMsg));
                    579:            SetWindowTitle (hWnd, lpszMsg);
                    580:            SetWindowWord (hWnd, WW_UNTITLED, TRUE);
                    581: 
                    582:            // reset caret position by sending WM_KILLFOCUS/WM_SETFOCUS messages
                    583:            SetFocus (NULL);
                    584:            SetFocus (hWndEdit);
                    585:            }
                    586:            break;
                    587: 
                    588:        case IDM_FILEOPEN:
                    589:            {
                    590:            char    lpszFileName[MAX_PATH];
                    591:            int     nResult;
                    592: 
                    593:            // if changes to current file, ask to save first
                    594:            if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
                    595:                {
                    596:                switch (Save_YNC (hWnd))
                    597:                    {
                    598:                    case IDCANCEL:
                    599:                        // abort operation
                    600:                        return FALSE;
                    601:                    case IDYES:
                    602:                        // save data then continue
                    603:                        if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
                    604:                            return FALSE;
                    605:                    case IDNO:
                    606:                        // just fall through
                    607:                        break;
                    608:                    }
                    609: 
                    610:                // reset edit changes flag
                    611:                SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
                    612:                }
                    613: 
                    614:            // get new filename and load into edit control
                    615:            if (GetFileName (hWnd, lpszFileName, lpszFilePath))
                    616:                {
                    617:                if ((nResult = LoadFile (hWnd, lpszFilePath)) < 0)
                    618:                    // notify user of error
                    619:                    ErrorNotify (hWnd, nResult);
                    620:                else
                    621:                    {
                    622:                    // update window text
                    623:                    SetWindowTitle (hWnd, lpszFileName);
                    624:                    SetWindowWord (hWnd, WW_UNTITLED, FALSE);
                    625:                    }
                    626:                }
                    627:            else
                    628:                return FALSE;
                    629:            }
                    630:            break;
                    631: 
                    632:        case IDM_FILESAVEAS:
                    633:            {
                    634:            char    lpszFileTitle[MAX_PATH];
                    635:            int     nResult;
                    636: 
                    637:            // get a valid filename and path
                    638:            if (SaveAsFileName (hWnd, lpszFileTitle, lpszFilePath))
                    639:                {
                    640:                // if file saves okay
                    641:                if ((nResult = SaveFile (hWnd, lpszFilePath)) > 0)
                    642:                    {
                    643:                    // reset changed flag, and window title
                    644:                    SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
                    645:                    SetWindowTitle (hWnd, lpszFileTitle);
                    646:                    SetWindowWord (hWnd, WW_UNTITLED, FALSE);
                    647:                    }
                    648:                else
                    649:                    {
                    650:                    // unable to save file, return error
                    651:                    ErrorNotify (hWnd, nResult);
                    652:                    return FALSE;
                    653:                    }
                    654:                }
                    655:            else
                    656:                return FALSE;
                    657:            }
                    658:            break;
                    659: 
                    660:        case IDM_FILESAVE:
                    661:            {
                    662:            char    lpszFileTitle[MAX_PATH];
                    663:            int     nResult;
                    664: 
                    665:            // if called from menu, check to see if file modified
                    666:            if (!lParam &&
                    667:                SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
                    668:                return FALSE;
                    669: 
                    670:        // user defined msg is sent from Exit, Open and New menuitems
                    671:        case UM_SAVEFILE:
                    672: 
                    673:            // if untitled, get new name
                    674:            if (GetWindowWord (hWnd, WW_UNTITLED) &&
                    675:                !(SaveAsFileName(hWnd, lpszFileTitle, lpszFilePath)))
                    676:                {
                    677:                // make sure no name was saved
                    678:                *lpszFilePath = 0;
                    679:                return FALSE;
                    680:                }
                    681: 
                    682:            // save buffer and reset flag
                    683:            if ((nResult = SaveFile (hWnd, lpszFilePath)) > 0)
                    684:                {
                    685:                // if new file name, set window title
                    686:                if (*lpszFileTitle)
                    687:                    {
                    688:                    SetWindowTitle (hWnd, lpszFileTitle);
                    689:                    SetWindowWord (hWnd, WW_UNTITLED, FALSE);
                    690:                    }
                    691:                SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
                    692:                }
                    693:            else
                    694:                {
                    695:                // unable to save file, return error
                    696:                ErrorNotify (hWnd, nResult);
                    697:                return FALSE;
                    698:                }
                    699:            }
                    700:            break;
                    701: 
                    702:        case IDM_FILEPRINT:
                    703:            {
                    704:            int    nRes;
                    705: 
                    706:            // print the file
                    707:            if ((nRes = PrintFile (hWnd)) < 0)
                    708:                ErrorNotify (hWnd, nRes);
                    709:            }
                    710:            break;
                    711: 
                    712:        case IDM_FILESETUP:
                    713:            {
                    714:            int    nRes;
                    715: 
                    716:            // set up the printer environment
                    717:            if ((nRes = PrinterSetup (hWnd)) < 0)
                    718:                ErrorNotify (hWnd, nRes);
                    719:            }
                    720:            break;
                    721: 
                    722:        case IDM_FILEEXIT:
                    723:            // exit application
                    724:            PostMessage (hWnd, WM_CLOSE, 0, 0L);
                    725:            break;
                    726: 
                    727:        case IDM_FILEABOUT:
                    728:            // call about dialog box
                    729:            DialogBox ((HANDLE)GetModuleHandle (NULL),
                    730:                       (LPSTR)IDD_ABOUT,
                    731:                       hWnd,
                    732:                       AboutDlgProc);
                    733:            break;
                    734: 
                    735: #if EDIT_FIXED
                    736:        case IDM_EDITCOPY:
                    737:        case IDM_EDITCUT:
                    738:        case IDM_EDITCLEAR:
                    739:            SendMessage (hWndEdit, uParam, 0, 0);
                    740:            break;
                    741: #else
                    742:        case IDM_EDITCUT:
                    743:        case IDM_EDITCOPY:
                    744:            {
                    745:            HLOCAL    hEditData, hData;
                    746:            char      *lpEditData, *lpData;
                    747:            DWORD     BegSel, EndSel;
                    748: 
                    749:            // get current selection
                    750:            SendMessage (hWndEdit, EM_GETSEL, (UINT)&BegSel, (UINT)&EndSel);
                    751:            hEditData = (HLOCAL)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
                    752:            lpEditData = LocalLock (hEditData);
                    753: 
                    754:            // allocate buffer to hold cipboard data
                    755:            hData = LocalAlloc (LHND, EndSel-BegSel+1);
                    756:            lpData = LocalLock (hData);
                    757:            strncpy (lpData, lpEditData+BegSel, EndSel-BegSel);
                    758:            lpData[EndSel-BegSel] = 0;
                    759: 
                    760:            // copy data to clipboard
                    761:            OpenClipboard (hWnd);
                    762:            SetClipboardData (CF_TEXT, lpData);
                    763:            CloseClipboard ();
                    764: 
                    765:            // unlock memory and free
                    766:            LocalUnlock (hEditData);
                    767:            LocalUnlock (hData);
                    768:            LocalFree (hData);
                    769:            }
                    770: 
                    771:            // if copying to clipboard, exit here
                    772:            if (uParam == IDM_EDITCOPY)
                    773:                break;
                    774: 
                    775:        case IDM_EDITCLEAR:
                    776:            // replace selection with null
                    777:            SendMessage (hWndEdit, EM_REPLACESEL, 0, (UINT)"");
                    778:            break;
                    779: #endif
                    780: 
                    781:        case IDM_EDITPASTE:
                    782:            SendMessage (hWndEdit, uParam, 0, 0);
                    783:            break;
                    784: 
                    785:        case IDM_EDITSELECT:
                    786:            // 0, -1 selects the entire string
                    787:            SendMessage (hWndEdit, EM_SETSEL, 0, (LONG)(int)-1);
                    788:            break;
                    789: 
                    790:        case IDM_EDITUNDO:
                    791:            SendMessage (hWndEdit, EM_UNDO, 0, 0);
                    792:            break;
                    793: 
                    794:        case IDM_EDITSCROLL:
                    795:            {
                    796:            WORD    wScroll = !GetWindowWord (hWnd, WW_SCROLL);
                    797: 
                    798:            // toggle vertical scroll bar
                    799:            SetScrollRange (hWndEdit, SB_VERT, 0, (int)(wScroll ? 100 : 0), TRUE);
                    800: 
                    801:            // if not word wrap, toggle horizontal scroll
                    802:            if (ES_AUTOHSCROLL & GetWindowLong (hWndEdit, GWL_STYLE))
                    803:                SetScrollRange (hWndEdit, SB_HORZ, 0, (int)(wScroll ? 100 : 0), TRUE);
                    804: 
                    805:            // set scroll flag
                    806:            SetWindowWord (hWnd, WW_SCROLL, wScroll);
                    807:            }
                    808:            break;
                    809: 
                    810:        case IDM_EDITWRAP:
                    811:            // change edit control
                    812:            if ((nResult = SetWrap (hWnd)) < 0)
                    813:                // notify user of error
                    814:                ErrorNotify (hWnd, nResult);
                    815:            break;
                    816: 
                    817:        case IDM_EDITFONT:
                    818:            {
                    819:            CHOOSEFONT    cf;
                    820:            LOGFONT       lfEditFont;
                    821:            HFONT         hEditFont;
                    822:            int           iSize;
                    823: 
                    824:            // get logical font structure from current font
                    825:            if (hEditFont = (HFONT)SendMessage (hWndEdit, WM_GETFONT, 0, 0))
                    826:                {
                    827:                GetObject (hEditFont, sizeof (lfEditFont), &lfEditFont);
                    828:                cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
                    829:                }
                    830:            else
                    831:                cf.Flags = CF_SCREENFONTS;
                    832: 
                    833:            // call common dialog to select a font
                    834:            cf.lStructSize    = sizeof (CHOOSEFONT);
                    835:            cf.hwndOwner      = hWnd;
                    836:            cf.hDC            = NULL;
                    837:            cf.lpLogFont      = &lfEditFont;
                    838:            cf.iPointSize     = iSize;
                    839:            cf.rgbColors      = NULL;
                    840:            cf.lCustData      = NULL;
                    841:            cf.lpfnHook       = NULL;
                    842:            cf.lpTemplateName = NULL;
                    843:            cf.hInstance      = NULL;
                    844:            cf.lpszStyle      = NULL;
                    845:            cf.nFontType      = SCREEN_FONTTYPE;
                    846:            cf.nSizeMin       = NULL;
                    847:            cf.nSizeMax       = NULL;
                    848: 
                    849:            if (ChooseFont (&cf))
                    850:                {
                    851:                // create new font and put in edit control
                    852:                SendMessage (hWndEdit,
                    853:                             WM_SETFONT,
                    854:                             (UINT)CreateFontIndirect
                    855:                             (&lfEditFont),
                    856:                             TRUE);
                    857: 
                    858:                if (hEditFont)
                    859:                    DeleteObject (hEditFont);
                    860:                }
                    861:            }
                    862:            break;
                    863: 
                    864:        case IDM_SEARCHFIND:
                    865:            {
                    866:            UINT    uBegSel, uEndSel;
                    867:            WORD    wCase = GetWindowWord (hWnd, WW_SEARCHCASE);
                    868:            WORD    wDir = GetWindowWord (hWnd, WW_SEARCHDN);
                    869: 
                    870:            // if selected text, replace global search string
                    871:            SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
                    872:            if (uBegSel != uEndSel)
                    873:                GetEditSubString (hWndEdit, &uBegSel, &uEndSel, lpszSearch);
                    874: 
                    875:            // Put up the find dialog box
                    876:            if (!FindDialog (hWnd, wCase, wDir, lpszSearch))
                    877:                ErrorNotify (hWnd, IDS_SEARCHDLGFAILED);
                    878:            }
                    879:            break;
                    880: 
                    881:        case IDM_SEARCHNEXT:
                    882:            // locate next search string in edit control
                    883:            if (!LocateText (hWnd,
                    884:                             GetWindowWord (hWnd, WW_SEARCHCASE),
                    885:                             TRUE,
                    886:                             lpszSearch))
                    887:                ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
                    888:            break;
                    889: 
                    890:        case IDM_SEARCHPREV:
                    891:            // locate previous search string in edit control
                    892:            if (!LocateText (hWnd,
                    893:                             GetWindowWord (hWnd, WW_SEARCHCASE),
                    894:                             FALSE,
                    895:                             lpszSearch))
                    896:                ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
                    897:             break;
                    898: 
                    899:        case IDM_PORTCURFILE:
                    900:            // if untitled, save first
                    901:            if (GetWindowWord (hWnd, WW_UNTITLED) &&
                    902:                !SendMessage (hWnd, WM_COMMAND, IDM_FILEOPEN, 0))
                    903:                {
                    904:                ErrorNotify (hWnd, IDS_NOFILETOPORT);
                    905:                break;
                    906:                }
                    907: 
                    908:            // start port dialog with flags
                    909:            hDlgPort = CreateDialog (GetModuleHandle (NULL),
                    910:                                     IDD_PORTDIALOG,
                    911:                                     hWnd,
                    912:                                     PortDlgProc);
                    913:            break;
                    914: 
                    915:        case IDM_PORTBKGND:
                    916:            if (IsWindow (hDlgPortStatus))
                    917:                ShowWindow (hDlgPortStatus, SW_SHOWNORMAL);
                    918:            else if (!(hDlgPortStatus = StartBackground (GetModuleHandle (NULL),
                    919:                                                         hWnd,
                    920:                                                         NULL)))
                    921:                ErrorNotify (hWnd, IDS_BKPORTSTARTFAILED);
                    922:            break;
                    923:        }
                    924:     return TRUE;
                    925: }
                    926: 
                    927: 
                    928: 
                    929: // change the word wrapping in an edit control
                    930: int WINAPI SetWrap (
                    931:     HWND    hWnd)
                    932: 
                    933: {
                    934:     DWORD   dwStyle;
                    935:     HANDLE  hOldData, hNewData;
                    936:     char    *lpOldData, *lpNewData;
                    937:     HWND    hWndOld = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
                    938:     HWND    hWndNew;
                    939:     RECT    rc;
                    940:     UINT    uLen;
                    941:     UINT    uBegSel, uEndSel;
                    942:     WORD    wScroll = GetWindowWord (hWnd, WW_SCROLL);
                    943:     HFONT   hEditFont = (HFONT)SendMessage (hWndOld, WM_GETFONT, 0, 0);
                    944: 
                    945: 
                    946:     // turn off scroll bars if currently present
                    947:     if (wScroll)
                    948:        {
                    949:        SetScrollRange (hWndOld, SB_VERT, 0, 0, FALSE);
                    950:        SetScrollRange (hWndOld, SB_HORZ, 0, 0, FALSE);
                    951:        }
                    952: 
                    953:     // new edit style = old style XOR ES_AUTOHSCROLL
                    954:     dwStyle = ES_AUTOHSCROLL ^ (DWORD)GetWindowLong (hWndOld, GWL_STYLE);
                    955: 
                    956:     // save text selection
                    957:     SendMessage (hWndOld, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
                    958: 
                    959:     // create a new edit control with the new style
                    960:     GetClientRect (hWnd, &rc);
                    961:     hWndNew = CreateWindow ("edit",
                    962:                            "",
                    963:                            dwStyle,
                    964:                            rc.left,
                    965:                            rc.top,
                    966:                            rc.right-rc.left,
                    967:                            rc.bottom-rc.top,
                    968:                            hWnd,
                    969:                            (HMENU)IDC_EDIT,
                    970:                            (HANDLE)GetModuleHandle (NULL),
                    971:                            0);
                    972: 
                    973:     // check for window created
                    974:     if (!IsWindow (hWndNew))
                    975:        return IDS_EDITWNDFAILED;
                    976: 
                    977:     // reset to no format lines
                    978:     SendMessage (hWndOld, EM_FMTLINES, !(dwStyle & ES_AUTOHSCROLL), 0);
                    979: 
                    980:     // get the data handle of the old control
                    981:     if (!(hOldData = (HANDLE)SendMessage (hWndOld, EM_GETHANDLE, 0, 0)))
                    982:        {
                    983:        // delete new edit window and return error
                    984:        DestroyWindow (hWndNew);
                    985:        return IDS_GETHANDLEFAILED;
                    986:        }
                    987: 
                    988:     // get data handle to new edit control and reallocate to size of old edit text
                    989:     hNewData = (HANDLE)SendMessage (hWndNew, EM_GETHANDLE, 0, 0);
                    990:     uLen = GetWindowTextLength (hWndOld);
                    991:     if (LocalReAlloc(hNewData, uLen+1, LHND) == NULL)
                    992:        {
                    993:        // abort, clean up and return error
                    994:        DestroyWindow (hWndNew);
                    995:        return IDS_REALLOCFAILED;
                    996:        }
                    997: 
                    998:     lpOldData = LocalLock (hOldData);
                    999:     lpNewData = LocalLock (hNewData);
                   1000:     lpNewData[uLen+1] = 0;
                   1001: 
                   1002:     // copy from one buffer to the other
                   1003:     while (uLen-- > 0)
                   1004:        lpNewData[uLen] = lpOldData[uLen];
                   1005: 
                   1006:     // unlock and release data buffers
                   1007:     LocalUnlock (hOldData);
                   1008:     LocalUnlock (hNewData);
                   1009: 
                   1010:     // swap windows
                   1011:     SetWindowLong (hWnd, WL_HWNDEDIT, (LONG)hWndNew);
                   1012:     DestroyWindow (hWndOld);
                   1013:     SendMessage (hWndNew, EM_SETHANDLE, (UINT)hNewData, 0);
                   1014: 
                   1015:     // set line formatting
                   1016:     SendMessage (hWndNew, EM_FMTLINES, !(dwStyle & ES_AUTOHSCROLL), 0);
                   1017: 
                   1018:     // replace font in new edit control
                   1019:     if (hEditFont)
                   1020:        SendMessage (hWndNew, WM_SETFONT, (UINT)hEditFont, 0);
                   1021: 
                   1022:     // set scroll bars if appropriate
                   1023:     if (wScroll)
                   1024:        {
                   1025:        SetScrollRange (hWndNew, SB_VERT, 0, 100, TRUE);
                   1026:        SetScrollRange (hWndNew, SB_HORZ, 0, (ES_AUTOHSCROLL & dwStyle ? 100 : 0), TRUE);
                   1027:        }
                   1028: 
                   1029:     // restore text selection, repaint and set focus
                   1030:     InvalidateRect (hWndNew, NULL, TRUE);
                   1031:     UpdateWindow (hWndNew);
                   1032:     SendMessage (hWndNew, EM_SETSEL, uBegSel, uEndSel);
                   1033:     SetFocus (hWndNew);
                   1034: 
                   1035:     // return success
                   1036:     return TRUE;
                   1037: }
                   1038: 
                   1039: 
                   1040: 
                   1041: // get win32 command line parameters
                   1042: BOOL WINAPI GetCmdLine(
                   1043:     char    *lpStr,
                   1044:     char    *lpszCmdLine,
                   1045:     BOOL    *bBkgnd)
                   1046: {
                   1047:     if (*lpStr)
                   1048:        {
                   1049:        // skip application name which precedes parameters
                   1050:        while (*lpStr != ' ' && *lpStr != 0)
                   1051:            lpStr++;
                   1052: 
                   1053:        // skip spaces
                   1054:        while (*lpStr == ' ' && *lpStr != 0)
                   1055:            lpStr++;
                   1056: 
                   1057:        // indeed command line parameter(s) present
                   1058:        if (*lpStr != 0)
                   1059:            {
                   1060:            // if background switch, set flag and remove switch from command line
                   1061:            if ((*lpStr == '/' || *lpStr == '-') &&
                   1062:                (*(lpStr+1) == 'b' || *(lpStr+1) == 'B'))
                   1063:                {
                   1064:                *bBkgnd = TRUE;
                   1065:                lpStr += 2;
                   1066: 
                   1067:                if (*lpStr == 0)
                   1068:                    *lpszCmdLine = 0;
                   1069:                else
                   1070:                    strcpy (lpszCmdLine, lpStr);
                   1071:                }
                   1072:            // maybe switch is embedded in parameter(s) somewhere
                   1073:            else
                   1074:                {
                   1075:                char    *pStr = lpStr;
                   1076:                char    *pCmdLine = lpszCmdLine;
                   1077:                int     i, nCnt;
                   1078: 
                   1079:                while (*pStr != 0)
                   1080:                    {
                   1081:                    // background switch is set, so prepare parameters and set flag
                   1082:                    if ((*pStr == '/' || *pStr == '-') &&
                   1083:                        (*(pStr+1) == 'b' || *(pStr+1) == 'B'))
                   1084:                        {
                   1085:                        *bBkgnd = TRUE;
                   1086: 
                   1087:                        // copy from beg. of lpStr to *pStr to lpszCmdLine
                   1088:                        nCnt = pStr - lpStr;
                   1089:                        for (i=0; i<nCnt; i++)
                   1090:                            lpszCmdLine[i] = lpStr[i];
                   1091:                        lpszCmdLine[i] = 0;
                   1092:                        strcat (lpszCmdLine, (pStr+2));
                   1093: 
                   1094:                        // break from loop
                   1095:                        break;
                   1096:                        }
                   1097: 
                   1098:                    pStr++;
                   1099:                    }
                   1100: 
                   1101:                // no switch found, can only edit one file, remove extra parameters
                   1102:                if (*pStr == 0)
                   1103:                    {
                   1104:                    pStr = lpStr;
                   1105: 
                   1106:                    while (*pStr != ' ' && *pStr != 0)
                   1107:                        pStr++;
                   1108: 
                   1109:                    if (*pStr == ' ')
                   1110:                        *pStr = 0;
                   1111: 
                   1112:                    strcpy (lpszCmdLine, lpStr);
                   1113:                    }
                   1114:                }
                   1115:            }
                   1116:        else
                   1117:            return FALSE;
                   1118:        }
                   1119:     else
                   1120:        return FALSE;
                   1121: 
                   1122:     return TRUE;
                   1123: }
                   1124: 
                   1125: 
                   1126: 
                   1127: // display a Save, Yes|No|Cancel message box
                   1128: int WINAPI Save_YNC (
                   1129:     HWND    hWnd)
                   1130: {
                   1131:     char    lpszMsg[MAX_PATH];
                   1132:     char    lpszAppName[MAX_PATH];
                   1133: 
                   1134:     // load string to prompt user
                   1135:     LoadString ((HANDLE)GetModuleHandle (NULL),
                   1136:                IDS_DATACHANGED,
                   1137:                lpszMsg,
                   1138:                sizeof (lpszMsg));
                   1139:     LoadString ((HANDLE)GetModuleHandle (NULL),
                   1140:                IDS_APPNAME,
                   1141:                lpszAppName,
                   1142:                sizeof (lpszAppName));
                   1143: 
                   1144:     // return user response
                   1145:     return (MessageBox (hWnd,
                   1146:                        lpszMsg,
                   1147:                        lpszAppName,
                   1148:                        MB_YESNOCANCEL | MB_ICONQUESTION));
                   1149: }
                   1150: 
                   1151: 
                   1152: 
                   1153: // error notification routine
                   1154: VOID WINAPI ErrorNotify (
                   1155:     HWND    hWnd,
                   1156:     int     nErrorString)
                   1157: {
                   1158:     char    lpszAppName[MAX_PATH];
                   1159:     char    lpszErrStr[MAX_PATH];
                   1160: 
                   1161:     LoadString ((HANDLE)GetModuleHandle (NULL),
                   1162:                IDS_APPNAME,
                   1163:                lpszAppName,
                   1164:                sizeof (lpszAppName));
                   1165:     LoadString ((HANDLE)GetModuleHandle (NULL),
                   1166:                nErrorString,
                   1167:                lpszErrStr,
                   1168:                sizeof (lpszErrStr));
                   1169:     MessageBox (hWnd, lpszErrStr, lpszAppName, MB_OK | MB_ICONSTOP);
                   1170: }
                   1171: 
                   1172: 
                   1173: 
                   1174: VOID WINAPI SetWindowTitle (
                   1175:     HWND    hWnd,
                   1176:     char    *lpszFile)
                   1177: {
                   1178:     char    lpszAppName[MAX_PATH];
                   1179: 
                   1180:     // load AppName and Window title string into window text
                   1181:     LoadString ((HANDLE)GetModuleHandle (NULL),
                   1182:                IDS_PRINTJOB,
                   1183:                lpszAppName,
                   1184:                sizeof (lpszAppName));
                   1185:     strcat (lpszAppName, lpszFile);
                   1186:     SetWindowText (hWnd, lpszAppName);
                   1187: }
                   1188: 
                   1189: 
                   1190: 
                   1191: // extract a substring from the edit controls data buffer
                   1192: VOID WINAPI GetEditSubString (
                   1193:     HWND    hWndEdit,
                   1194:     PUINT   puStart,
                   1195:     PUINT   puEnd,
                   1196:     char    *lpszString)
                   1197: {
                   1198:     HANDLE    hEditData;
                   1199:     char      *lpEditData;
                   1200:     UINT      i;
                   1201: 
                   1202:     // maximum search string length is MAXSEARCHSTRING characters
                   1203:     if ((*puEnd - *puStart) > MAXSEARCHSTRING)
                   1204:        *puEnd = *puStart + MAXSEARCHSTRING;
                   1205: 
                   1206:     // get edit data handle and lock
                   1207:     hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
                   1208:     lpEditData = (char *)LocalLock (hEditData);
                   1209: 
                   1210:     // copy characters to string and terminate
                   1211:     for (i=*puStart; i<*puEnd; i++)
                   1212:        lpszString[i-*puStart] = lpEditData[i];
                   1213:     lpszString[i-*puStart] = 0;
                   1214: 
                   1215:     // unlock and return edit handle
                   1216:     LocalUnlock (hEditData);
                   1217: }

unix.superglobalmegacorp.com

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