|
|
1.1 ! root 1: /**************************************************************************\ ! 2: * uconvert.c -- convert to/from unicode using ! 3: * MulitByteToWideChar & WideCharToMulitByte ! 4: * ! 5: * Steve Firebaugh ! 6: * Microsoft Developer Support ! 7: * Copyright (c) 1992, 1993 Microsoft Corporation ! 8: * ! 9: \**************************************************************************/ ! 10: #define UNICODE ! 11: ! 12: ! 13: #include <windows.h> ! 14: #include <commdlg.h> ! 15: #include "uconvert.h" ! 16: #include "install.h" ! 17: ! 18: ! 19: ! 20: ! 21: ! 22: ! 23: /**************************************************************************\ ! 24: * Global variables. ! 25: \**************************************************************************/ ! 26: ! 27: HANDLE hInst; ! 28: ! 29: /* declare global HWNDs for the child windows. ! 30: * They are created at WM_CREATE of the main window. ! 31: * Also used in the "View" dialogs. ! 32: */ ! 33: HWND hwndLabel0, hwndLabel1; ! 34: HWND hwndName0, hwndName1; ! 35: HWND hwndSize0, hwndSize1; ! 36: HWND hwndCodePage0, hwndCodePage1; ! 37: HWND hwndByteOrder0, hwndByteOrder1; ! 38: HWND hwndButton0, hwndButton1; ! 39: ! 40: /* Global variables storing the source and destination "type" information. ! 41: * ! 42: * used to communicate between main wnd proc, and *OptionsProc. ! 43: * ! 44: * gTypeSource - stores the type interpretation of the source data ! 45: * (and implicitly the destination data.) ! 46: * TYPEUNKNOWN: indeterminant... not set. Can not do conversion. ! 47: * TYPEUNICODE: source unicode & destination giDestinationCodePage. ! 48: * TYPECODEPAGE: source giSourceCodePage & destination unicode. ! 49: * ! 50: * giSourceCodePage stores valid source code page iff gTypeSource == TRUE ! 51: * giDestinationCodePage stores valid destination code page iff gTypeSource == FALSE ! 52: * ! 53: */ ! 54: int gTypeSource; ! 55: UINT giSourceCodePage; ! 56: UINT giDestinationCodePage; ! 57: ! 58: /* Pointers to the source and destination data, and the ! 59: * count of bytes in each of the buffers. ! 60: */ ! 61: #define NODATA 0 ! 62: PBYTE pSourceData = NULL; ! 63: PBYTE pDestinationData = NULL; ! 64: int nBytesSource = NODATA; ! 65: int nBytesDestination = NODATA; ! 66: ! 67: /* Conversion Options variables. */ ! 68: DWORD gMBFlags = MB_PRECOMPOSED; ! 69: DWORD gWCFlags = 0; ! 70: char glpDefaultChar[4] = ""; // what is max size of multibyte character? ! 71: BOOL gUsedDefaultChar = FALSE; ! 72: ! 73: /* Handling the Byte Order Mark (BOM). ! 74: * ! 75: * If the input file begins with a BOM, then we know it is unicode, ! 76: * we skip over the BOM and decrement the size of data by SIZEOFBOM. ! 77: * ! 78: * ! 79: * Before writing data that we know is unicode, write the szBOM string ! 80: * to the file. ! 81: * ! 82: * Notice that this means that the file sizes we show in the window ! 83: * do NOT include the BOM. ! 84: */ ! 85: ! 86: char szBOM[] = "\377\376"; // 0xFF, 0xFE // leave off TEXT() macro. ! 87: char szRBOM[] = "\376\377"; // 0xFF, 0xFE // leave off TEXT() macro. ! 88: #define SIZEOFBOM 2 ! 89: ! 90: /* Title of main window */ ! 91: TCHAR TitleMBToWC[]= TEXT("UConvert -- MultiByteToWideChar()"); ! 92: TCHAR TitleWCToMB[]= TEXT("UConvert -- WideCharToMultiByte()"); ! 93: TCHAR TitleUnknown[]= TEXT("UConvert."); ! 94: ! 95: /* file name of the online help file */ ! 96: TCHAR szHelpPathName[] = TEXT("uconvert.HLP"); ! 97: ! 98: /* Strings used to fill onscreen windows. */ ! 99: TCHAR szBlank[] = TEXT(""); ! 100: TCHAR szNBytes[] = TEXT("bytes: %d"); ! 101: TCHAR szByteOrderReversed[]=TEXT("Byte Order Reversed."); ! 102: ! 103: /* MessageBox() strings and flags. */ ! 104: TCHAR MBTitle[]= TEXT("Application Warning"); ! 105: UINT MBFlags = MB_OK | MB_ICONEXCLAMATION; ! 106: ! 107: ! 108: /* misc. defines affecting size and placement of child windows */ ! 109: #define BORDER GetSystemMetrics (SM_CXFRAME)*4 ! 110: #define WHEIGHT GetSystemMetrics (SM_CYMENU) ! 111: ! 112: ! 113: ! 114: /**************************************************************************\ ! 115: * ! 116: * function: WinMain() ! 117: * ! 118: * ! 119: \**************************************************************************/ ! 120: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ! 121: LPSTR lpCmdLine, int nCmdShow) ! 122: { ! 123: MSG msg; ! 124: WNDCLASS wc; ! 125: HWND hwndMain; ! 126: HACCEL haccel; ! 127: ! 128: ! 129: UNREFERENCED_PARAMETER( lpCmdLine ); ! 130: UNREFERENCED_PARAMETER( nCmdShow ); ! 131: hInst = hInstance; ! 132: ! 133: ! 134: /* Check for previous instance. If none, then register class. */ ! 135: if (!hPrevInstance) { ! 136: ! 137: wc.style = 0; ! 138: wc.lpfnWndProc = (WNDPROC)MainWndProc; ! 139: ! 140: wc.cbClsExtra = 0; ! 141: wc.cbWndExtra = 0; ! 142: wc.hInstance = hInstance; ! 143: wc.hIcon = LoadIcon(hInstance, TEXT("uconvertIcon")); ! 144: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 145: wc.hbrBackground = GetStockObject (LTGRAY_BRUSH); ! 146: wc.lpszMenuName = TEXT("uconvertMenu"); ! 147: wc.lpszClassName = TEXT("uconvert"); ! 148: ! 149: if (!RegisterClass(&wc)) return (FALSE); ! 150: ! 151: } /* class registered o.k. */ ! 152: ! 153: ! 154: /* Create the main window. Return false if CreateWindow() fails */ ! 155: hwndMain = CreateWindow( ! 156: TEXT("uconvert"), ! 157: TitleUnknown, ! 158: (WS_OVERLAPPEDWINDOW & ~(WS_THICKFRAME | WS_MAXIMIZEBOX)) | WS_VISIBLE, ! 159: CW_USEDEFAULT, ! 160: CW_USEDEFAULT, ! 161: 512, // Big enough for most of the text. ! 162: 16*WHEIGHT, ! 163: NULL, NULL, hInst, NULL); ! 164: ! 165: if (!hwndMain) return (FALSE); ! 166: ! 167: ! 168: /* Load the accelerator table that provides clipboard support. */ ! 169: haccel = LoadAccelerators (hInst, TEXT("uconvertAccel")); ! 170: ! 171: ! 172: ! 173: /* Loop getting messages and dispatching them. */ ! 174: while (GetMessage(&msg, NULL, 0,0)) { ! 175: if (!TranslateAccelerator(hwndMain, haccel, &msg)) { ! 176: TranslateMessage(&msg); ! 177: DispatchMessage(&msg); ! 178: } ! 179: } ! 180: ! 181: return (msg.wParam); ! 182: } ! 183: ! 184: ! 185: ! 186: ! 187: /**************************************************************************\ ! 188: * ! 189: * function: MainWndProc() ! 190: * ! 191: * ! 192: * On WM_CREATE create all of the child windows. ! 193: * On WM_DESTROY make sure that all dynamically allocated memory is freed. ! 194: * On WM_PAINT, outline many of the child windows. ! 195: * On WM_COMMAND, respond to the command messages properly. ! 196: * ! 197: \**************************************************************************/ ! 198: LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ! 199: { ! 200: ! 201: ! 202: /* misc. variables used in multiple messages cases. */ ! 203: RECT clientrect; ! 204: RECT rect; ! 205: TCHAR buffer[50]; ! 206: static TCHAR szFilter[MAX_PATH]; ! 207: ! 208: switch (message) { ! 209: ! 210: /**********************************************************************\ ! 211: * WM_CREATE ! 212: * ! 213: * Create all of the child windows used on this main window. ! 214: * Assign the HWNDs to the correct static variables. ! 215: * ! 216: \**********************************************************************/ ! 217: case WM_CREATE: { ! 218: GetClientRect (hwnd, &clientrect); ! 219: ! 220: /* Create Source Windows. */ ! 221: CopyRect (&rect, &clientrect); ! 222: rect.right = (clientrect.right - clientrect.left) /2; ! 223: InflateRect (&rect, -2*BORDER, -BORDER); ! 224: createwindows(&rect, ! 225: hwnd, ! 226: &hwndLabel0, ! 227: &hwndName0, ! 228: &hwndSize0, ! 229: &hwndCodePage0, ! 230: &hwndByteOrder0, ! 231: &hwndButton0); ! 232: ! 233: /* Create Destination Windows. */ ! 234: CopyRect (&rect, &clientrect); ! 235: rect.left = (clientrect.right - clientrect.left) /2; ! 236: InflateRect (&rect, -2*BORDER, -BORDER); ! 237: createwindows(&rect, ! 238: hwnd, ! 239: &hwndLabel1, ! 240: &hwndName1, ! 241: &hwndSize1, ! 242: &hwndCodePage1, ! 243: &hwndByteOrder1, ! 244: &hwndButton1); ! 245: ! 246: /* fill in window information that is different for source/destination */ ! 247: SetWindowText (hwndLabel0, TEXT("Source:" )); ! 248: SetWindowText (hwndLabel1, TEXT("Destination:")); ! 249: ! 250: SetWindowText (hwndButton0, TEXT("View &Source..." )); ! 251: SetWindowText (hwndButton1, TEXT("View &Destination...")); ! 252: SetWindowLong (hwndButton0, GWL_ID, BID_VIEWSOURCE ); ! 253: SetWindowLong (hwndButton1, GWL_ID, BID_VIEWDESTINATION ); ! 254: ! 255: gTypeSource = TYPEUNKNOWN; ! 256: giSourceCodePage = GetACP(); // Just some reasonable initializer. ! 257: giDestinationCodePage = GetACP(); // Just some reasonable initializer. ! 258: ! 259: /* initialize source & destination data correctly */ ! 260: SendMessage (hwnd, WM_COMMAND, MID_CLEARSOURCE, 0); ! 261: SendMessage (hwnd, WM_COMMAND, MID_CLEARDESTINATION, 0); ! 262: ! 263: /* Build up the correct filter strings for OPENFILENAME structure ! 264: * Do it here so that we only have to do it once. ! 265: */ ! 266: { ! 267: TCHAR *p; ! 268: ! 269: p = szFilter; ! 270: lstrcpy (buffer,TEXT("All Files (*.*)")); ! 271: lstrcpy (p,buffer); ! 272: p += lstrlen (buffer) +1; ! 273: lstrcpy (buffer,TEXT("*.*")); ! 274: lstrcpy (p,buffer); ! 275: p += lstrlen (buffer) +1; ! 276: ! 277: lstrcpy (buffer,TEXT("Text Files (*.txt)")); ! 278: lstrcpy (p,buffer); ! 279: p += lstrlen (buffer) +1; ! 280: lstrcpy (buffer,TEXT("*.txt")); ! 281: lstrcpy (p,buffer); ! 282: p += lstrlen (buffer) +1; ! 283: ! 284: lstrcpy (buffer,TEXT("Unicode Files (*.utf)")); ! 285: lstrcpy (p,buffer); ! 286: p += lstrlen (buffer) +1; ! 287: lstrcpy (buffer,TEXT("*.utf")); ! 288: lstrcpy (p,buffer); ! 289: p += lstrlen (buffer) +1; ! 290: ! 291: lstrcpy (p,TEXT("\0")); ! 292: } ! 293: } break; /* end WM_CREATE */ ! 294: ! 295: ! 296: ! 297: /**********************************************************************\ ! 298: * WM_DESTROY ! 299: * ! 300: * Release the Online help, and free allocated memory if any. ! 301: \**********************************************************************/ ! 302: case WM_DESTROY: ! 303: WinHelp( hwnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL ); ! 304: ManageMemory (MMFREE, MMSOURCE, 0, pSourceData); ! 305: ManageMemory (MMFREE, MMDESTINATION, 0, pDestinationData); ! 306: PostQuitMessage(0); ! 307: break; ! 308: ! 309: ! 310: /**********************************************************************\ ! 311: * WM_CTLCOLOR* ! 312: * ! 313: * Set the background of the child controls to be gray here. ! 314: \**********************************************************************/ ! 315: case WM_CTLCOLORBTN: ! 316: case WM_CTLCOLORSTATIC: { ! 317: HDC hdc; ! 318: ! 319: hdc = (HDC) wParam; ! 320: SetBkMode (hdc, TRANSPARENT); ! 321: return (LRESULT)GetStockObject (LTGRAY_BRUSH); ! 322: } break; ! 323: ! 324: ! 325: ! 326: ! 327: /**********************************************************************\ ! 328: * WM_PAINT ! 329: * ! 330: * Simply draw the two vertical divider lines, and 3D frame the children. ! 331: * ! 332: \**********************************************************************/ ! 333: case WM_PAINT: { ! 334: HDC hdc; ! 335: PAINTSTRUCT ps; ! 336: ! 337: hdc = BeginPaint(hwnd, &ps); ! 338: GetClientRect (hwnd, &clientrect); ! 339: ! 340: /* draw vertical separator line in the center */ ! 341: rect.left = (clientrect.right - clientrect.left ) /2 -1; ! 342: rect.top = clientrect.top; ! 343: rect.right = rect.left +1;; ! 344: rect.bottom = clientrect.bottom; ! 345: FrameRect (hdc, &rect, GetStockObject (GRAY_BRUSH)); ! 346: SelectObject (hdc, GetStockObject (WHITE_PEN)); ! 347: MoveToEx (hdc, rect.right, rect.top, NULL); ! 348: LineTo (hdc,rect.right, rect.bottom); ! 349: ! 350: /* draw 3D outlines of child windows. */ ! 351: framechildwindow (hdc, hwnd, hwndName0); ! 352: framechildwindow (hdc, hwnd, hwndSize0); ! 353: framechildwindow (hdc, hwnd, hwndCodePage0); ! 354: framechildwindow (hdc, hwnd, hwndByteOrder0); ! 355: ! 356: framechildwindow (hdc, hwnd, hwndName1); ! 357: framechildwindow (hdc, hwnd, hwndSize1); ! 358: framechildwindow (hdc, hwnd, hwndCodePage1); ! 359: framechildwindow (hdc, hwnd, hwndByteOrder1); ! 360: ! 361: /* underline the labels */ ! 362: underlinechildwindow (hdc, hwnd, hwndLabel0); ! 363: underlinechildwindow (hdc, hwnd, hwndLabel1); ! 364: ! 365: EndPaint (hwnd, &ps); ! 366: } break; /* end WM_PAINT */ ! 367: ! 368: ! 369: ! 370: ! 371: /**********************************************************************\ ! 372: * WMU_ADJUSTFORNEWSOURCE ! 373: * ! 374: * lParam - szName of source (file, clipboard, ...) ! 375: * ! 376: * global - nBytesSource ! 377: * ! 378: * "user message." Set the text of the Source windows ! 379: \**********************************************************************/ ! 380: case WMU_ADJUSTFORNEWSOURCE: { ! 381: LPVOID szName; ! 382: ! 383: szName = (LPVOID) lParam; ! 384: ! 385: /* Set Window text appropriately */ ! 386: wsprintf (buffer, szNBytes, nBytesSource); ! 387: SetWindowText (hwndSize0, buffer); ! 388: SetWindowText (hwndName0, szName); ! 389: SetWindowText (hwndByteOrder0, szBlank); ! 390: ! 391: /* Clear the destination data if any to avoid user confusion. */ ! 392: SendMessage (hwnd, WM_COMMAND, MID_CLEARDESTINATION, 0); ! 393: ! 394: /* Reset the "type strings" based on new gTypeSource. */ ! 395: SendMessage (hwnd, WMU_SETTYPESTRINGS, 0,0); ! 396: } break; ! 397: ! 398: ! 399: ! 400: ! 401: /**********************************************************************\ ! 402: * WMU_SETTYPESTRINGS ! 403: * ! 404: * "user message." Set the text of the "type" windows to reflect ! 405: * the state stored in gTypeSource and gi*CodePage. ! 406: * ! 407: \**********************************************************************/ ! 408: case WMU_SETTYPESTRINGS: ! 409: switch (gTypeSource) { ! 410: case TYPEUNICODE: ! 411: SetWindowText (hwndCodePage0, TEXT("Unicode")); ! 412: wsprintf (buffer, TEXT("CodePage: %d"), giDestinationCodePage); ! 413: SetWindowText (hwndCodePage1, buffer); ! 414: SetWindowText (hwnd, TitleWCToMB); ! 415: break; ! 416: case TYPECODEPAGE: ! 417: wsprintf (buffer, TEXT("CodePage: %d"), giSourceCodePage); ! 418: SetWindowText (hwndCodePage0, buffer); ! 419: SetWindowText (hwndCodePage1, TEXT("Unicode")); ! 420: SetWindowText (hwnd, TitleMBToWC); ! 421: break; ! 422: case TYPEUNKNOWN: ! 423: SetWindowText (hwndCodePage0, szBlank); ! 424: SetWindowText (hwndCodePage1, szBlank); ! 425: SetWindowText (hwnd, TitleUnknown); ! 426: break; ! 427: } /* end switch gTypeSource */ ! 428: break; ! 429: ! 430: ! 431: /**********************************************************************\ ! 432: * WM_INITMENU ! 433: * ! 434: * Manage the enabled state of all of the menus. ! 435: * Notice that the button enabled state is taken care of in ManageMemory(). ! 436: * ! 437: * In general, this is dependent upon pSourceData & pDestinationData. ! 438: * They are either NULL or non-NULL, and menu items are dependent upon ! 439: * this state. ! 440: * ! 441: * One exception is the "Paste from Clipboard menu" which is enabled ! 442: * conditional upon there being text data in the clipboard. ! 443: * ! 444: \**********************************************************************/ ! 445: case WM_INITMENU: ! 446: ! 447: /* Adjust the "Paste from Clipboard menu" */ ! 448: OpenClipboard (hwnd); ! 449: if (IsClipboardFormatAvailable (CF_UNICODETEXT) || ! 450: IsClipboardFormatAvailable (CF_OEMTEXT) || ! 451: IsClipboardFormatAvailable (CF_TEXT)) ! 452: EnableMenuItem (GetMenu (hwnd),MID_PASTESOURCE, MF_ENABLED); ! 453: else ! 454: EnableMenuItem (GetMenu (hwnd),MID_PASTESOURCE, MF_GRAYED); ! 455: CloseClipboard (); ! 456: ! 457: ! 458: /* Adjust the source data dependent menus. */ ! 459: if (pSourceData != NULL) { ! 460: EnableMenuItem (GetMenu (hwnd),MID_SOURCEOPT, MF_ENABLED); ! 461: EnableMenuItem (GetMenu (hwnd),MID_SWAPSOURCE, MF_ENABLED); ! 462: EnableMenuItem (GetMenu (hwnd),MID_CLEARSOURCE, MF_ENABLED); ! 463: EnableMenuItem (GetMenu (hwnd),MID_CONVERTNOW, MF_ENABLED); ! 464: EnableMenuItem (GetMenu (hwnd),MID_CONVERSIONOPT, MF_ENABLED); ! 465: EnableMenuItem (GetMenu (hwnd),MID_DESTINATIONOPT, MF_ENABLED); ! 466: } else { ! 467: EnableMenuItem (GetMenu (hwnd),MID_SOURCEOPT, MF_GRAYED); ! 468: EnableMenuItem (GetMenu (hwnd),MID_SWAPSOURCE, MF_GRAYED); ! 469: EnableMenuItem (GetMenu (hwnd),MID_CLEARSOURCE, MF_GRAYED); ! 470: EnableMenuItem (GetMenu (hwnd),MID_CONVERTNOW, MF_GRAYED); ! 471: EnableMenuItem (GetMenu (hwnd),MID_CONVERSIONOPT, MF_GRAYED); ! 472: EnableMenuItem (GetMenu (hwnd),MID_DESTINATIONOPT, MF_GRAYED); ! 473: } ! 474: ! 475: ! 476: /* Adjust the destination data dependent menus. */ ! 477: if (pDestinationData != NULL) { ! 478: EnableMenuItem (GetMenu (hwnd),MID_SAVEAS, MF_ENABLED); ! 479: EnableMenuItem (GetMenu (hwnd),MID_SWAPDESTINATION, MF_ENABLED); ! 480: EnableMenuItem (GetMenu (hwnd),MID_COPYDESTINATION, MF_ENABLED); ! 481: EnableMenuItem (GetMenu (hwnd),MID_CLEARDESTINATION, MF_ENABLED); ! 482: } else { ! 483: EnableMenuItem (GetMenu (hwnd),MID_SAVEAS, MF_GRAYED); ! 484: EnableMenuItem (GetMenu (hwnd),MID_SWAPDESTINATION, MF_GRAYED); ! 485: EnableMenuItem (GetMenu (hwnd),MID_COPYDESTINATION, MF_GRAYED); ! 486: EnableMenuItem (GetMenu (hwnd),MID_CLEARDESTINATION, MF_GRAYED); ! 487: } ! 488: ! 489: break; ! 490: ! 491: ! 492: ! 493: ! 494: ! 495: /**********************************************************************\ ! 496: * WM_COMMAND ! 497: * ! 498: * Just switch() on the command ID. Notice that menu and button ! 499: * command messages are treated the same. ! 500: * ! 501: \**********************************************************************/ ! 502: case WM_COMMAND: ! 503: switch (LOWORD(wParam)) { ! 504: ! 505: ! 506: /******************************************************************\ ! 507: * WM_COMMAND, MID_OPEN ! 508: * ! 509: * Put up common dialog, try to open & read file. ! 510: * Fill windows with correct text & fill pSourceData. ! 511: \******************************************************************/ ! 512: case MID_OPEN : { ! 513: HANDLE hFile; ! 514: DWORD nBytesRead; ! 515: TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH]; ! 516: ! 517: /* First set up the structure for the GetOpenFileName ! 518: * common dialog. ! 519: */ ! 520: { ! 521: OPENFILENAME OpenFileName; ! 522: /* buffers for the file names. */ ! 523: ! 524: wsprintf (szFile, szBlank); ! 525: wsprintf (szFileTitle, szBlank); ! 526: ! 527: ! 528: OpenFileName.lStructSize = sizeof(OPENFILENAME); ! 529: OpenFileName.hwndOwner = hwnd; ! 530: OpenFileName.hInstance = (HANDLE) hInst; ! 531: OpenFileName.lpstrFilter = szFilter; // built in WM_CREATE ! 532: OpenFileName.lpstrCustomFilter = NULL; ! 533: OpenFileName.nMaxCustFilter = 0L; ! 534: OpenFileName.nFilterIndex = 1L; ! 535: OpenFileName.lpstrFile = szFile; ! 536: OpenFileName.nMaxFile = MAX_PATH; ! 537: OpenFileName.lpstrFileTitle = szFileTitle; ! 538: OpenFileName.nMaxFileTitle = MAX_PATH; ! 539: OpenFileName.lpstrInitialDir = NULL; ! 540: OpenFileName.lpstrTitle = TEXT("Open File"); ! 541: ! 542: OpenFileName.nFileOffset = 0; ! 543: OpenFileName.nFileExtension = 0; ! 544: OpenFileName.lpstrDefExt = NULL; ! 545: ! 546: OpenFileName.lCustData = 0; ! 547: OpenFileName.lpfnHook = NULL; ! 548: OpenFileName.lpTemplateName = NULL; ! 549: ! 550: OpenFileName.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; ! 551: ! 552: if (!GetOpenFileName(&OpenFileName)) return 0; ! 553: } ! 554: ! 555: ! 556: /* User has filled in the file information. ! 557: * Try to open that file for reading. ! 558: */ ! 559: hFile = CreateFile(szFile, ! 560: GENERIC_READ, ! 561: 0, ! 562: NULL, ! 563: OPEN_EXISTING, ! 564: FILE_ATTRIBUTE_NORMAL, ! 565: NULL); ! 566: if (hFile == INVALID_HANDLE_VALUE) { ! 567: MessageBox (hwnd, TEXT("open file failed."),MBTitle, MBFlags); ! 568: return 0; ! 569: } ! 570: ! 571: ! 572: /* make sure file is not too big... i.e. > 2^32 ! 573: * If it is OK, write the file size in hwndSize0 ! 574: */ ! 575: { ! 576: BY_HANDLE_FILE_INFORMATION bhfi; ! 577: ! 578: GetFileInformationByHandle (hFile, &bhfi); ! 579: if (bhfi.nFileSizeHigh != 0) { ! 580: MessageBox (hwnd, TEXT("File too big, > 2^32."),MBTitle, MBFlags); ! 581: CloseHandle (hFile); ! 582: return 0; ! 583: } ! 584: ! 585: nBytesSource= bhfi.nFileSizeLow; ! 586: ! 587: } ! 588: ! 589: pSourceData = ManageMemory (MMALLOC, MMSOURCE, nBytesSource, pSourceData); ! 590: if (pSourceData == NULL) { ! 591: CloseHandle (hFile); ! 592: return 0; ! 593: } ! 594: ! 595: /* first read two bytes and look for BOM */ ! 596: if (!ReadFile (hFile, pSourceData,SIZEOFBOM, &nBytesRead, NULL)) { ! 597: MessageBox (hwnd, TEXT("ReadFile() failed."),MBTitle, MBFlags); ! 598: CloseHandle (hFile); ! 599: pSourceData = ManageMemory (MMFREE, MMSOURCE, 0, pSourceData); ! 600: return 0; ! 601: } ! 602: ! 603: ! 604: ! 605: /* If file begins with BOM, then we know the type, ! 606: * we'll decrement the number of bytes by two, ! 607: * and read the rest of the data. ! 608: */ ! 609: if (IsBOM (pSourceData)) { ! 610: gTypeSource = TYPEUNICODE; ! 611: nBytesSource -=SIZEOFBOM; ! 612: ! 613: /* If file begins with Reverse BOM, then we know the type, ! 614: * we'll decrement the number of bytes by two, ! 615: * and read the rest of the data, and post a message so ! 616: * that we know to swap the order later. ! 617: */ ! 618: } else if (IsRBOM (pSourceData)) { ! 619: gTypeSource = TYPEUNICODE; ! 620: nBytesSource -=SIZEOFBOM; ! 621: MessageBox (hwnd, TEXT("Reverse byte order mark detected.\n Automatically swapping byte order."),MBTitle, MBFlags); ! 622: PostMessage (hwnd, WM_COMMAND, MID_SWAPSOURCE, 0); ! 623: ! 624: /* Oops, does not begin with BOM. ! 625: * Reset file pointer, and read data. ! 626: */ ! 627: } else { ! 628: gTypeSource = TYPEUNKNOWN; ! 629: SetFilePointer (hFile, -SIZEOFBOM, NULL, FILE_CURRENT); ! 630: } ! 631: ! 632: ! 633: ! 634: /* try to read all of it into memory */ ! 635: if (!ReadFile (hFile, pSourceData,nBytesSource, &nBytesRead, NULL)) { ! 636: MessageBox (hwnd, TEXT("ReadFile() failed."),MBTitle, MBFlags); ! 637: CloseHandle (hFile); ! 638: pSourceData = ManageMemory (MMFREE, MMSOURCE, 0, pSourceData); ! 639: return 0; ! 640: } ! 641: ! 642: CloseHandle (hFile); ! 643: ! 644: /* If we don't know the file type at this point, ! 645: * try to determine if it is unicode. ! 646: */ ! 647: if (gTypeSource == TYPEUNKNOWN) { ! 648: if (IsUnicode (pSourceData)) ! 649: gTypeSource = TYPEUNICODE; ! 650: else ! 651: gTypeSource = TYPECODEPAGE; ! 652: } ! 653: ! 654: SendMessage (hwnd, WMU_ADJUSTFORNEWSOURCE, 0, (LPARAM)szFile); ! 655: ! 656: ! 657: ! 658: } break; /* end case MID_OPEN */ ! 659: ! 660: ! 661: ! 662: /******************************************************************\ ! 663: * WM_COMMAND, MID_SAVEAS ! 664: * ! 665: * Put up common dialog, try to open file, and write data to it. ! 666: \******************************************************************/ ! 667: case MID_SAVEAS: { ! 668: HANDLE hFile; ! 669: DWORD nBytesRead; ! 670: TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH]; ! 671: ! 672: if (nBytesDestination == NODATA ) { ! 673: MessageBox (hwnd, TEXT("No text to save"),MBTitle, MBFlags); ! 674: return 0; ! 675: } ! 676: ! 677: ! 678: /* Set up the structure for the GetSaveFileName ! 679: * common dialog. ! 680: */ ! 681: { ! 682: OPENFILENAME OpenFileName; ! 683: /* buffers for the file names. */ ! 684: ! 685: wsprintf (szFile, szBlank); ! 686: wsprintf (szFileTitle, szBlank); ! 687: ! 688: OpenFileName.lStructSize = sizeof(OPENFILENAME); ! 689: OpenFileName.hwndOwner = hwnd; ! 690: OpenFileName.hInstance = (HANDLE) hInst; ! 691: OpenFileName.lpstrFilter = szFilter; ! 692: OpenFileName.lpstrCustomFilter = NULL; ! 693: OpenFileName.nMaxCustFilter = 0L; ! 694: OpenFileName.nFilterIndex = 1L; ! 695: OpenFileName.lpstrFile = szFile; ! 696: OpenFileName.nMaxFile = MAX_PATH; ! 697: OpenFileName.lpstrFileTitle = szFileTitle; ! 698: OpenFileName.nMaxFileTitle = MAX_PATH; ! 699: OpenFileName.lpstrInitialDir = NULL; ! 700: OpenFileName.lpstrTitle = TEXT("Save As"); ! 701: ! 702: OpenFileName.nFileOffset = 0; ! 703: OpenFileName.nFileExtension = 0; ! 704: OpenFileName.lpstrDefExt = NULL; ! 705: ! 706: OpenFileName.lCustData = 0; ! 707: OpenFileName.lpfnHook = NULL; ! 708: OpenFileName.lpTemplateName = NULL; ! 709: ! 710: OpenFileName.Flags = OFN_HIDEREADONLY; ! 711: ! 712: if (!GetSaveFileName(&OpenFileName)) return 0; ! 713: } ! 714: ! 715: ! 716: /* User has filled in the file information. ! 717: * Try to open that file for writing. ! 718: */ ! 719: hFile = CreateFile(szFile, ! 720: GENERIC_WRITE, ! 721: 0, ! 722: NULL, ! 723: CREATE_ALWAYS, ! 724: FILE_ATTRIBUTE_NORMAL, ! 725: NULL); ! 726: ! 727: if (hFile == INVALID_HANDLE_VALUE) { ! 728: MessageBox (hwnd, TEXT("CreateFile() failed."),MBTitle, MBFlags); ! 729: return 0; ! 730: } ! 731: ! 732: ! 733: /* if destination is unicode, try to write BOM first. ! 734: * unless the bytes have been swapped ! 735: * (criterion: hwndByteOrder contains text) ! 736: * in which case, write a Reverse Byte Order Mark. ! 737: */ ! 738: if (gTypeSource == TYPECODEPAGE) { ! 739: if (GetWindowTextLength (hwndByteOrder1) == 0) { ! 740: ! 741: if (!WriteFile (hFile, szBOM, SIZEOFBOM, &nBytesRead, NULL)) { ! 742: MessageBox (hwnd, TEXT("WriteFile() failed."),MBTitle, MBFlags); ! 743: CloseHandle (hFile); ! 744: return 0; ! 745: } ! 746: ! 747: }else { ! 748: if (!WriteFile (hFile, szRBOM, SIZEOFBOM, &nBytesRead, NULL)) { ! 749: MessageBox (hwnd, TEXT("WriteFile() failed."),MBTitle, MBFlags); ! 750: CloseHandle (hFile); ! 751: return 0; ! 752: } ! 753: ! 754: } ! 755: } ! 756: ! 757: ! 758: /* try to write all of it into memory */ ! 759: if (!WriteFile (hFile, pDestinationData,nBytesDestination, &nBytesRead, NULL)) { ! 760: MessageBox (hwnd, TEXT("WriteFile() failed."),MBTitle, MBFlags); ! 761: CloseHandle (hFile); ! 762: return 0; ! 763: } ! 764: ! 765: SetWindowText (hwndName1, szFile); ! 766: CloseHandle (hFile); ! 767: ! 768: } break; ! 769: ! 770: ! 771: /**********************************************************************\ ! 772: * WM_COMMAND, MID_PASTESOURCE ! 773: * ! 774: * Paste the clipboard's prefered data format into the source. ! 775: * Fills pSourceData. ! 776: \**********************************************************************/ ! 777: case MID_PASTESOURCE: { ! 778: UINT iFormat; ! 779: PVOID pData; ! 780: ! 781: OpenClipboard (hwnd); ! 782: ! 783: iFormat = 0; ! 784: while (iFormat = EnumClipboardFormats(iFormat)) ! 785: if ((iFormat == CF_UNICODETEXT) || (iFormat == CF_OEMTEXT) || (iFormat == CF_TEXT)) { ! 786: ! 787: pData = GetClipboardData (iFormat); ! 788: ! 789: switch (iFormat) { ! 790: case CF_UNICODETEXT: ! 791: nBytesSource = lstrlenW (pData) *2; ! 792: pSourceData= ManageMemory (MMALLOC, MMSOURCE, nBytesSource+2, pSourceData); ! 793: lstrcpyW ((LPVOID)pSourceData, pData); ! 794: gTypeSource = TYPEUNICODE; ! 795: break; ! 796: ! 797: case CF_OEMTEXT: ! 798: nBytesSource = lstrlenA (pData); ! 799: pSourceData= ManageMemory (MMALLOC, MMSOURCE, nBytesSource+1, pSourceData); ! 800: lstrcpyA (pSourceData, pData); ! 801: gTypeSource = TYPECODEPAGE; ! 802: giSourceCodePage = GetOEMCP(); ! 803: break; ! 804: ! 805: case CF_TEXT: ! 806: nBytesSource = lstrlenA (pData); ! 807: pSourceData= ManageMemory (MMALLOC, MMSOURCE, nBytesSource+1, pSourceData); ! 808: lstrcpyA (pSourceData, pData); ! 809: gTypeSource = TYPECODEPAGE; ! 810: giSourceCodePage = GetACP(); ! 811: break; ! 812: ! 813: default: break; // shouldn't get here ! 814: } /* end switch (iFormat) */ ! 815: ! 816: SendMessage (hwnd, WMU_ADJUSTFORNEWSOURCE, 0, ! 817: (LPARAM)TEXT("<from Clipboard>")); ! 818: ! 819: break; /* break out of while loop. */ ! 820: } /* end if iFormat */ ! 821: ! 822: ! 823: CloseClipboard (); ! 824: ! 825: } break; ! 826: ! 827: ! 828: ! 829: /**********************************************************************\ ! 830: * WM_COMMAND, MID_COPYDESTINATION ! 831: * ! 832: * Copy destination data to the clipboard. ! 833: \**********************************************************************/ ! 834: case MID_COPYDESTINATION: ! 835: if (pDestinationData == NULL) return FALSE; ! 836: ! 837: OpenClipboard (hwnd); ! 838: EmptyClipboard(); ! 839: ! 840: /* if source NOT unicode, then destination is, else look at dest CP */ ! 841: if (gTypeSource != TYPEUNICODE) ! 842: SetClipboardData (CF_UNICODETEXT, pDestinationData); ! 843: else if (giDestinationCodePage == GetOEMCP()) ! 844: SetClipboardData (CF_OEMTEXT, pDestinationData); ! 845: else ! 846: SetClipboardData (CF_TEXT, pDestinationData); ! 847: ! 848: CloseClipboard (); ! 849: ! 850: break; ! 851: ! 852: ! 853: ! 854: /******************************************************************\ ! 855: * WM_COMMAND, MID_CONVERTNOW ! 856: * ! 857: * This is where the conversion actually takes place. ! 858: * In either case, make the call twice. Once to determine how ! 859: * much memory is needed, allocate space, and then make the call again. ! 860: * ! 861: * If conversion succeeds, it fills pDestinationData. ! 862: \******************************************************************/ ! 863: case MID_CONVERTNOW: { ! 864: int nBytesNeeded, nWCharNeeded, nWCharSource; ! 865: ! 866: ! 867: if (nBytesSource == NODATA ) { ! 868: MessageBox (hwnd, TEXT("Load Source File"),MBTitle, MBFlags); ! 869: return 0; ! 870: } ! 871: ! 872: ! 873: /* Converting UNICODE -> giDestinationCodePage*/ ! 874: if (gTypeSource == TYPEUNICODE) { ! 875: ! 876: nWCharSource = nBytesSource/2; ! 877: ! 878: /* Query the number of bytes required to store the Dest string */ ! 879: nBytesNeeded = WideCharToMultiByte(giDestinationCodePage, gWCFlags, ! 880: (LPWSTR)pSourceData, nWCharSource, ! 881: NULL, 0, ! 882: glpDefaultChar, &gUsedDefaultChar); ! 883: ! 884: /* Allocate the required amount of space */ ! 885: pDestinationData= ManageMemory (MMALLOC, MMDESTINATION, nBytesNeeded, pDestinationData); ! 886: ! 887: /* Do the conversion */ ! 888: nBytesDestination = WideCharToMultiByte(giDestinationCodePage, gWCFlags, ! 889: (LPWSTR)pSourceData, nWCharSource, ! 890: pDestinationData, nBytesNeeded, glpDefaultChar, &gUsedDefaultChar); ! 891: } ! 892: ! 893: ! 894: /* converting giSourceCodePage -> UNICODE */ ! 895: else if (gTypeSource == TYPECODEPAGE) { ! 896: ! 897: /* Query the number of WChar required to store the Dest string */ ! 898: nWCharNeeded = MultiByteToWideChar(giSourceCodePage, gMBFlags, ! 899: pSourceData, nBytesSource, NULL, 0 ); ! 900: ! 901: /* Allocate the required amount of space */ ! 902: pDestinationData= ManageMemory (MMALLOC, MMDESTINATION, nWCharNeeded*2, pDestinationData); ! 903: ! 904: /* Do the conversion */ ! 905: nWCharNeeded = MultiByteToWideChar(giSourceCodePage, gMBFlags, ! 906: pSourceData, nBytesSource, ! 907: (LPWSTR)pDestinationData, nWCharNeeded); ! 908: ! 909: /* MultiByteToWideChar returns # WCHAR, so multiply by 2 */ ! 910: nBytesDestination = 2*nWCharNeeded ; ! 911: } else { ! 912: MessageBox (hwnd, TEXT("Source type unknown.\n Specify Source Options"),MBTitle, MBFlags); ! 913: return 0; ! 914: } ! 915: ! 916: ! 917: /* code common to all conversions... */ ! 918: SetWindowText (hwndName1, TEXT("Data not saved yet!!")); ! 919: wsprintf (buffer, szNBytes, nBytesDestination); ! 920: SetWindowText (hwndSize1, buffer); ! 921: SetWindowText (hwndByteOrder1, szBlank); ! 922: ! 923: ! 924: /* Throw up "Save as" dialog to help the user along. ! 925: * They can always <esc> if need be. ! 926: */ ! 927: SendMessage (hwnd, WM_COMMAND, MID_SAVEAS, 0); ! 928: ! 929: } break; /* end case BID_CONVERT */ ! 930: ! 931: ! 932: ! 933: /******************************************************************\ ! 934: * WM_COMMAND, BID_VIEWSOURCE ! 935: * ! 936: \******************************************************************/ ! 937: case BID_VIEWSOURCE: ! 938: if (gTypeSource == TYPEUNICODE) ! 939: DialogBoxW (hInst, L"ShowTextDlg", hwnd, (DLGPROC)ViewSourceProc); ! 940: else ! 941: DialogBoxA (hInst, "ShowTextDlg", hwnd, (DLGPROC)ViewSourceProc); ! 942: break; ! 943: ! 944: /******************************************************************\ ! 945: * WM_COMMAND, BID_VIEWDESTINATION ! 946: * ! 947: \******************************************************************/ ! 948: case BID_VIEWDESTINATION: ! 949: if (gTypeSource == TYPEUNICODE) ! 950: DialogBoxA (hInst, "ShowTextDlg", hwnd, (DLGPROC)ViewDestinationProc); ! 951: else ! 952: DialogBoxW (hInst, L"ShowTextDlg", hwnd, (DLGPROC)ViewDestinationProc); ! 953: break; ! 954: ! 955: ! 956: ! 957: /******************************************************************\ ! 958: * WM_COMMAND, MID_SOURCEOPT ! 959: * ! 960: * Allows user to change interpretation options for the source data. ! 961: * ! 962: * Put up appropriate dialog box, and reset window text in response. ! 963: \******************************************************************/ ! 964: case MID_SOURCEOPT: ! 965: if (DialogBox (hInst, TEXT("DataOptionsDlg"), hwnd, (DLGPROC)SourceOptionsProc)) { ! 966: SendMessage (hwnd, WMU_SETTYPESTRINGS, 0,0); ! 967: SendMessage (hwnd, WM_COMMAND, MID_CLEARDESTINATION, 0); ! 968: } ! 969: break; ! 970: ! 971: /******************************************************************\ ! 972: * WM_COMMAND, MID_DESTINATIONOPT ! 973: * ! 974: * Allows user to change options for destination data. ! 975: * ! 976: * Put up appropriate dialog box, and reset window text in response. ! 977: \******************************************************************/ ! 978: case MID_DESTINATIONOPT: ! 979: if (DialogBox (hInst, TEXT("DataOptionsDlg"), hwnd, (DLGPROC)DestinationOptionsProc)) { ! 980: SendMessage (hwnd, WMU_SETTYPESTRINGS, 0,0); ! 981: SendMessage (hwnd, WM_COMMAND, MID_CLEARDESTINATION, 0); ! 982: } ! 983: break; ! 984: ! 985: /******************************************************************\ ! 986: * WM_COMMAND, MID_CONVERSIONOPT ! 987: * ! 988: \******************************************************************/ ! 989: case MID_CONVERSIONOPT: ! 990: if (DialogBox (hInst, TEXT("ConversionOptionsDlg"), hwnd, (DLGPROC)ConversionOptionsProc)) { ! 991: SendMessage (hwnd, WM_COMMAND, MID_CLEARDESTINATION, 0); ! 992: } ! 993: break; ! 994: ! 995: ! 996: ! 997: /******************************************************************\ ! 998: * WM_COMMAND, MID_SWAPSOURCE ! 999: * ! 1000: * Allows user to reverse byte order of data. ! 1001: * ! 1002: \******************************************************************/ ! 1003: case MID_SWAPSOURCE: { ! 1004: int i, end; ! 1005: BYTE temp; ! 1006: ! 1007: if (pSourceData == NULL) return FALSE; ! 1008: ! 1009: end = nBytesSource - 2; ! 1010: for (i = 0; i<= end; i+=2) { ! 1011: temp = pSourceData[i]; ! 1012: pSourceData[i] = pSourceData[i+1]; ! 1013: pSourceData[i+1] = temp; ! 1014: } ! 1015: ! 1016: if (GetWindowTextLength (hwndByteOrder0) == 0) ! 1017: SetWindowText (hwndByteOrder0, szByteOrderReversed); ! 1018: else ! 1019: SetWindowText (hwndByteOrder0, szBlank); ! 1020: ! 1021: /* Since source is different, invalidate Destination data. */ ! 1022: SendMessage (hwnd, WM_COMMAND, MID_CLEARDESTINATION, 0); ! 1023: ! 1024: } break; ! 1025: ! 1026: ! 1027: ! 1028: /******************************************************************\ ! 1029: * WM_COMMAND, MID_SWAPDESTINATION ! 1030: * ! 1031: * Allows user to reverse byte order of data. ! 1032: * ! 1033: \******************************************************************/ ! 1034: case MID_SWAPDESTINATION: { ! 1035: int i, end; ! 1036: BYTE temp; ! 1037: ! 1038: if (pDestinationData == NULL) return FALSE; ! 1039: ! 1040: end = nBytesDestination - 2; ! 1041: for (i = 0; i<= end; i+=2) { ! 1042: temp = pDestinationData[i]; ! 1043: pDestinationData[i] = pDestinationData[i+1]; ! 1044: pDestinationData[i+1] = temp; ! 1045: } ! 1046: ! 1047: if (GetWindowTextLength (hwndByteOrder1) == 0) ! 1048: SetWindowText (hwndByteOrder1, szByteOrderReversed); ! 1049: else ! 1050: SetWindowText (hwndByteOrder1, szBlank); ! 1051: ! 1052: } break; ! 1053: ! 1054: ! 1055: /**********************************************************************\ ! 1056: * WM_COMMAND, MID_CLEARDESTINATION ! 1057: * ! 1058: * Clear the destination information. May cause data to be lost. ! 1059: \**********************************************************************/ ! 1060: case MID_CLEARDESTINATION: ! 1061: SetWindowText (hwndSize1, szBlank); ! 1062: SetWindowText (hwndName1, szBlank); ! 1063: SetWindowText (hwndByteOrder1, szBlank); ! 1064: pDestinationData= ManageMemory (MMFREE, MMDESTINATION, 0, pDestinationData); ! 1065: break; ! 1066: ! 1067: ! 1068: /**********************************************************************\ ! 1069: * WM_COMMAND, MID_CLEARSOURCE ! 1070: * ! 1071: * Clear the SOURCE information. May cause data to be lost. ! 1072: \**********************************************************************/ ! 1073: case MID_CLEARSOURCE: ! 1074: SetWindowText (hwndSize0, szBlank); ! 1075: SetWindowText (hwndName0, szBlank); ! 1076: SetWindowText (hwndByteOrder0, szBlank); ! 1077: pSourceData= ManageMemory (MMFREE, MMSOURCE, 0, pSourceData); ! 1078: break; ! 1079: ! 1080: ! 1081: ! 1082: ! 1083: ! 1084: /******************************************************************\ ! 1085: * WM_COMMAND, MID_INSTALLTABLES ! 1086: * ! 1087: \******************************************************************/ ! 1088: case MID_INSTALLTABLES: ! 1089: DialogBox (hInst, TEXT("InstallTableDlg"), hwnd, (DLGPROC)InstallTableProc); ! 1090: break; ! 1091: ! 1092: ! 1093: ! 1094: ! 1095: /* Simply call WinHelp to display the OnLine help file. */ ! 1096: case MID_HELP: ! 1097: WinHelp( hwnd, szHelpPathName, HELP_INDEX, (DWORD) NULL ); ! 1098: break; ! 1099: ! 1100: ! 1101: /* No-op Window procedure to simply display the dialog box. */ ! 1102: case MID_ABOUT: ! 1103: DialogBox (hInst, TEXT("aboutBox"), hwnd, (DLGPROC) AboutProc); ! 1104: break; ! 1105: ! 1106: /* Just close the window. */ ! 1107: case MID_EXIT: ! 1108: PostMessage (hwnd, WM_CLOSE, 0,0); ! 1109: break; ! 1110: ! 1111: ! 1112: ! 1113: ! 1114: } /* end switch (LOWORD(wParam)) */ ! 1115: break; /* end WM_COMMAND */ ! 1116: ! 1117: ! 1118: ! 1119: default: break; ! 1120: } /* end switch */ ! 1121: ! 1122: return (DefWindowProc(hwnd, message, wParam, lParam)); ! 1123: } ! 1124: ! 1125: ! 1126: ! 1127: ! 1128: ! 1129: /**************************************************************************\ ! 1130: * ! 1131: * function: IsUnicode() ! 1132: * ! 1133: * HACK... eventually use a proper function for IsUnicode ! 1134: * Use function from unipad? ! 1135: * ! 1136: \**************************************************************************/ ! 1137: BOOL IsUnicode (PBYTE pb) ! 1138: { ! 1139: return (IsBOM (pb)); ! 1140: } ! 1141: ! 1142: ! 1143: ! 1144: /**************************************************************************\ ! 1145: * ! 1146: * function: IsBOM() ! 1147: * ! 1148: * true iff pb points to a Byte Order Mark. ! 1149: * ! 1150: \**************************************************************************/ ! 1151: BOOL IsBOM (PBYTE pb) ! 1152: { ! 1153: if ((*pb == 0xFF) & (*(pb+1) == 0xFE)) // BOM ! 1154: return TRUE; ! 1155: else ! 1156: return FALSE; ! 1157: } ! 1158: ! 1159: ! 1160: /**************************************************************************\ ! 1161: * ! 1162: * function: IsRBOM() ! 1163: * ! 1164: * true iff pb points to a reversed Byte Order Mark. ! 1165: * ! 1166: \**************************************************************************/ ! 1167: BOOL IsRBOM (PBYTE pb) ! 1168: { ! 1169: if ((*pb == 0xFE) & (*(pb+1) == 0xFF)) // RBOM ! 1170: return TRUE; ! 1171: else ! 1172: return FALSE; ! 1173: } ! 1174: ! 1175: ! 1176: ! 1177: ! 1178: /**************************************************************************\ ! 1179: * ! 1180: * function: framechildwindow() ! 1181: * ! 1182: * Simply draw a 3D frame around child window. ! 1183: * ! 1184: \**************************************************************************/ ! 1185: VOID framechildwindow (HDC hdc, HWND hwndParent, HWND hwndChild) ! 1186: { ! 1187: RECT rect; ! 1188: ! 1189: GetWindowRect (hwndChild, &rect); ! 1190: ! 1191: /* minor hack... assumes RECT is two points, right field starting first */ ! 1192: ScreenToClient (hwndParent, (LPPOINT)&rect); ! 1193: ScreenToClient (hwndParent, (LPPOINT)&(rect.right)); ! 1194: ! 1195: InflateRect (&rect, 1, 1); ! 1196: FrameRect (hdc, &rect, GetStockObject (GRAY_BRUSH)); ! 1197: InflateRect (&rect, -1, -1); ! 1198: SelectObject (hdc, GetStockObject (WHITE_PEN)); ! 1199: MoveToEx (hdc, rect.right, rect.top, NULL); ! 1200: LineTo (hdc,rect.right, rect.bottom); ! 1201: LineTo (hdc,rect.left, rect.bottom); ! 1202: ! 1203: return; ! 1204: } ! 1205: ! 1206: ! 1207: /**************************************************************************\ ! 1208: * ! 1209: * function: underlinechildwindow() ! 1210: * ! 1211: * Underline child window. ! 1212: * ! 1213: \**************************************************************************/ ! 1214: VOID underlinechildwindow (HDC hdc, HWND hwndParent, HWND hwndChild) ! 1215: { ! 1216: RECT rect; ! 1217: ! 1218: GetWindowRect (hwndChild, &rect); ! 1219: ! 1220: /* minor hack... assumes RECT is two points, right field starting first */ ! 1221: ScreenToClient (hwndParent, (LPPOINT)&rect); ! 1222: ScreenToClient (hwndParent, (LPPOINT)&(rect.right)); ! 1223: ! 1224: InflateRect (&rect, 1, 1); ! 1225: rect.top = rect.bottom-1; ! 1226: FrameRect (hdc, &rect, GetStockObject (GRAY_BRUSH)); ! 1227: SelectObject (hdc, GetStockObject (WHITE_PEN)); ! 1228: MoveToEx (hdc, rect.right, rect.bottom, NULL); ! 1229: LineTo (hdc,rect.left, rect.bottom); ! 1230: ! 1231: return; ! 1232: } ! 1233: ! 1234: ! 1235: ! 1236: ! 1237: ! 1238: ! 1239: ! 1240: /**************************************************************************\ ! 1241: * ! 1242: * function: createwindows() ! 1243: * ! 1244: * Create the child windows and pass the handles back in parameters. ! 1245: * Each Window is created relative to (inside of) prect. ! 1246: * top is a spacial pointer to the Y coordinate of the next window. ! 1247: * ! 1248: \**************************************************************************/ ! 1249: VOID createwindows(PRECT prect, ! 1250: HWND hwndParent, ! 1251: HWND* hwndLabel, ! 1252: HWND* hwndName, ! 1253: HWND* hwndSize, ! 1254: HWND* hwndCodePage, ! 1255: HWND* hwndByteOrder, ! 1256: HWND* hwndButton) ! 1257: { ! 1258: int top; ! 1259: ! 1260: top = prect->top; ! 1261: *hwndLabel = CreateWindow( ! 1262: TEXT("STATIC"), ! 1263: szBlank, ! 1264: WS_CHILD | WS_VISIBLE | SS_CENTER, ! 1265: prect->left, ! 1266: top, ! 1267: prect->right - prect->left, ! 1268: WHEIGHT, ! 1269: hwndParent, NULL, hInst, 0); ! 1270: ! 1271: top += WHEIGHT*5/2; ! 1272: *hwndName = CreateWindow( ! 1273: TEXT("STATIC"), ! 1274: szBlank, ! 1275: WS_CHILD | WS_VISIBLE | SS_RIGHT, ! 1276: prect->left, ! 1277: top, ! 1278: prect->right - prect->left, ! 1279: WHEIGHT, ! 1280: hwndParent, NULL, hInst, 0); ! 1281: ! 1282: top += WHEIGHT*2; ! 1283: *hwndSize = CreateWindow( ! 1284: TEXT("STATIC"), ! 1285: szBlank, ! 1286: WS_CHILD | WS_VISIBLE | SS_LEFT, ! 1287: prect->left, ! 1288: top, ! 1289: (prect->right - prect->left) *3/4, ! 1290: WHEIGHT, ! 1291: hwndParent, NULL, hInst, 0); ! 1292: ! 1293: top += WHEIGHT*2; ! 1294: *hwndCodePage = CreateWindow( ! 1295: TEXT("STATIC"), ! 1296: szBlank, ! 1297: WS_CHILD | WS_VISIBLE | SS_LEFT, ! 1298: prect->left, ! 1299: top, ! 1300: (prect->right - prect->left) *3/4, ! 1301: WHEIGHT, ! 1302: hwndParent, NULL, hInst, 0); ! 1303: ! 1304: top += WHEIGHT*2; ! 1305: *hwndByteOrder = CreateWindow( ! 1306: TEXT("STATIC"), ! 1307: szBlank, ! 1308: WS_CHILD | WS_VISIBLE | SS_LEFT, ! 1309: prect->left, ! 1310: top, ! 1311: (prect->right - prect->left) *3/4, ! 1312: WHEIGHT, ! 1313: hwndParent, NULL, hInst, 0); ! 1314: ! 1315: top += WHEIGHT*2; ! 1316: *hwndButton = CreateWindow( ! 1317: TEXT("BUTTON"), ! 1318: TEXT("ViewText"), ! 1319: WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ! 1320: prect->left, ! 1321: top, ! 1322: prect->right - prect->left, ! 1323: WHEIGHT*9/7, ! 1324: hwndParent, NULL, hInst, 0); ! 1325: ! 1326: return; ! 1327: } ! 1328: ! 1329: ! 1330: /**************************************************************************\ ! 1331: * ! 1332: * function: ManageMemory() ! 1333: * ! 1334: * Do all memory management here for the source and destination pointers. ! 1335: * We also enable/disable the "View..." buttons to reflect existence of data. ! 1336: * ! 1337: * ! 1338: * PARAMETERS ! 1339: * ! 1340: * message : {MMALLOC, MMFREE} ! 1341: * Alloc when requested by MMALLOC, and free the existing, passed in, pointer. ! 1342: * Free when requested by MMFREE. ! 1343: * sourcedestination : {MMSOURCE, MMDESTINATION} ! 1344: * nBytes - number to alloc on MMALLOC messages. ! 1345: * p - old pointer to be freed. ! 1346: * ! 1347: * ! 1348: * GLOBALS ! 1349: * ! 1350: * hwndButton0, hwndButton1 ! 1351: * ! 1352: \**************************************************************************/ ! 1353: LPVOID ManageMemory (UINT message, UINT sourcedestination, DWORD nBytes, LPVOID p) ! 1354: { ! 1355: switch (message) { ! 1356: case MMFREE : ! 1357: if (sourcedestination == MMSOURCE) ! 1358: EnableWindow (hwndButton0, FALSE); ! 1359: else if (sourcedestination == MMDESTINATION) ! 1360: EnableWindow (hwndButton1, FALSE); ! 1361: ! 1362: if (p != NULL) GlobalFree (GlobalHandle (p)); ! 1363: return NULL; ! 1364: break; ! 1365: ! 1366: case MMALLOC : ! 1367: if (sourcedestination == MMSOURCE) ! 1368: EnableWindow (hwndButton0, TRUE); ! 1369: else if (sourcedestination == MMDESTINATION) ! 1370: EnableWindow (hwndButton1, TRUE); ! 1371: ! 1372: if (p != NULL) GlobalFree (GlobalHandle (p)); ! 1373: p = (LPVOID) GlobalAlloc (GPTR, nBytes); ! 1374: return p; ! 1375: break; ! 1376: ! 1377: } /* end switch (message) */ ! 1378: return NULL; ! 1379: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.