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

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

unix.superglobalmegacorp.com

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