|
|
1.1 ! root 1: /************************************************************************ ! 2: ! 3: File: cdtest.c ! 4: ! 5: Purpose: Contains the functions which handle the main window's functionality -- ! 6: creating the main window, handling menu commands, exiting the program. ! 7: ! 8: Functions: ! 9: ! 10: WinMain() - Program's entry point ! 11: ! 12: InitApplication() - Registers class and some user defined messages ! 13: ! 14: InitInstance() - Creates main window ! 15: ! 16: MainWndProc() - Window procedure for main window ! 17: ! 18: HandleTheCommand() - Processes all WM_COMMAND messages ! 19: ! 20: InitGlobals() - Initializes all global variables that need to ! 21: be initialized at startup ! 22: ! 23: MyAtol() - Converts an ASCII string in either hexi- ! 24: decimal or decimal notation to a LONG. ! 25: ! 26: AboutProc() - Callback function for CDTEST's about box. ! 27: ! 28: ************************************************************************/ ! 29: ! 30: ! 31: ! 32: #include <windows.h> ! 33: #include <commdlg.h> ! 34: #include <winnls.h> ! 35: #include "cdtest.h" ! 36: #include "colors.h" ! 37: #include "save.h" ! 38: #include "print.h" ! 39: #include "title.h" ! 40: #include "replace.h" ! 41: #include "open.h" ! 42: #include "font.h" ! 43: #include "find.h" ! 44: ! 45: ! 46: ! 47: ! 48: ! 49: /* Some defines, global variables, and function declarations */ ! 50: ! 51: #define szClass TEXT("cdtestclass") ! 52: #define szIcon TEXT("theicon") ! 53: #define szMenu TEXT("themenu") ! 54: ! 55: #ifdef UNICODE ! 56: #define szTitle TEXT("Common Dialog Test App - Unicode Version") ! 57: #else ! 58: #define szTitle TEXT("Common Dialog Test App - ANSI Version") ! 59: #endif ! 60: ! 61: ! 62: void InitGlobals(void) ; ! 63: ! 64: UINT uMode = IDM_HEXMODE ; ! 65: ! 66: ! 67: ! 68: ! 69: ! 70: ! 71: ! 72: /************************************************************************ ! 73: ! 74: ! 75: Function: WinMain(HINSTANCE, HINSTANCE, LPSTR, int) ! 76: ! 77: Purpose: ! 78: ! 79: - Contains standard windows entry point ! 80: ! 81: - Initializes the application ! 82: ! 83: - Contains the main message loop ! 84: ! 85: Returns: Final msg.wParam ! 86: ! 87: Comments: ! 88: ! 89: ************************************************************************/ ! 90: ! 91: ! 92: int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) ! 93: { ! 94: ! 95: MSG msg; ! 96: ! 97: ! 98: UNREFERENCED_PARAMETER( lpCmdLine ); ! 99: ! 100: ! 101: if (!hPrevInstance) ! 102: if (!InitApplication(hInstance)) ! 103: return (FALSE); ! 104: ! 105: if (!InitInstance(hInstance, nCmdShow)) ! 106: return (FALSE); ! 107: ! 108: while (GetMessage(&msg, 0, 0, 0)) ! 109: { ! 110: TranslateMessage(&msg); ! 111: DispatchMessage(&msg); ! 112: } ! 113: ! 114: ! 115: return (msg.wParam); ! 116: } ! 117: ! 118: ! 119: ! 120: ! 121: ! 122: ! 123: ! 124: /************************************************************************ ! 125: ! 126: ! 127: Function: InitApplication(HANDLE) ! 128: ! 129: ! 130: Purpose: ! 131: ! 132: - Fills in the WNDCLASS structure ! 133: ! 134: - Registers messages needed to communicate with the common dialogs ! 135: ! 136: - Registers the window class ! 137: ! 138: Returns: The return value of RegisterClass(). If this fails then the ! 139: whole program fails. ! 140: ! 141: Comments: ! 142: ! 143: ! 144: ************************************************************************/ ! 145: ! 146: ! 147: BOOL InitApplication(HANDLE hInstance) ! 148: { ! 149: WNDCLASS wc; ! 150: ! 151: wc.style = 0; ! 152: wc.lpfnWndProc = (WNDPROC)MainWndProc; ! 153: wc.cbClsExtra = 0; ! 154: wc.cbWndExtra = 0; ! 155: wc.hInstance = hInstance; ! 156: wc.hIcon = LoadIcon(hInstance, szIcon) ; ! 157: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 158: wc.hbrBackground = GetStockObject(WHITE_BRUSH); ! 159: wc.lpszMenuName = szMenu ; ! 160: wc.lpszClassName = szClass ; ! 161: ! 162: ! 163: InitGlobals() ; ! 164: ! 165: ! 166: /* Register any messages that the common dialogs will need to ! 167: communicate with this app. */ ! 168: ! 169: nFindMsg = RegisterWindowMessage((LPTSTR) FINDMSGSTRING) ; ! 170: nOpenShareVMsg = RegisterWindowMessage((LPTSTR) SHAREVISTRING) ; ! 171: nHelpMessage = RegisterWindowMessage((LPTSTR) HELPMSGSTRING) ; ! 172: ! 173: ! 174: return (RegisterClass(&wc)); ! 175: } ! 176: ! 177: ! 178: ! 179: ! 180: ! 181: ! 182: ! 183: ! 184: /************************************************************************ ! 185: ! 186: ! 187: Function: InitInstance(HANDLE, int) ! 188: ! 189: ! 190: Purpose: ! 191: ! 192: - Creates the main window ! 193: ! 194: - Shows the main window ! 195: ! 196: Returns: FALSE if it cannot create the window, TRUE if it can. ! 197: ! 198: ! 199: Comments: ! 200: ! 201: ! 202: ************************************************************************/ ! 203: ! 204: ! 205: BOOL InitInstance(HANDLE hInstance, int nCmdShow) ! 206: { ! 207: HWND hWnd; ! 208: DWORD dwFlags = WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU ; ! 209: ! 210: ! 211: /* save the instance handle in a global variable */ ! 212: ! 213: hInst = hInstance; ! 214: ! 215: ! 216: /* Create the main window */ ! 217: ! 218: hWnd = CreateWindow(szClass, szTitle, dwFlags, ! 219: 10, 10, 400, 200, NULL, NULL, hInstance, NULL) ; ! 220: ! 221: if (!hWnd) ! 222: return (FALSE); ! 223: ! 224: ShowWindow(hWnd, SW_SHOWNORMAL) ; ! 225: UpdateWindow(hWnd); ! 226: ! 227: return (TRUE); ! 228: } ! 229: ! 230: ! 231: ! 232: ! 233: ! 234: ! 235: ! 236: ! 237: /************************************************************************ ! 238: ! 239: ! 240: Function: MainWndProc(HWND, UINT, UINT, LONG) ! 241: ! 242: Purpose: ! 243: ! 244: - Is the callback function that handles all messages for the main window ! 245: ! 246: Returns: ! 247: ! 248: - Returns DefWindowProc() for any message it does not explicitly ! 249: respond to. ! 250: ! 251: Comments: ! 252: ! 253: ! 254: ************************************************************************/ ! 255: ! 256: ! 257: LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) ! 258: { ! 259: switch (message) ! 260: { ! 261: case WM_CREATE: ! 262: CheckMenuItem(GetMenu(hWnd), IDM_HEXMODE, MF_CHECKED) ; ! 263: break ; ! 264: ! 265: case WM_COMMAND: ! 266: HandleTheCommand(hWnd, wParam, lParam) ; ! 267: break ; ! 268: ! 269: case WM_DESTROY: ! 270: PostQuitMessage(0); ! 271: break; ! 272: ! 273: default: ! 274: return (DefWindowProc(hWnd, message, wParam, lParam)); ! 275: break ; ! 276: } ! 277: return (0L); ! 278: } ! 279: ! 280: ! 281: ! 282: ! 283: ! 284: ! 285: /************************************************************************ ! 286: ! 287: ! 288: Function: HandleTheCommand(HWND, UINT, UINT) ! 289: ! 290: Purpose: ! 291: ! 292: - Handles all WM_COMMAND messages passed to the MainWndProc(). The ! 293: menu or control ID value for Win32 WM_COMMAND messages is contained ! 294: in the low word of the wParam parameter. ! 295: ! 296: Returns: Nothing. ! 297: ! 298: Comments: ! 299: ! 300: ! 301: ************************************************************************/ ! 302: ! 303: ! 304: void HandleTheCommand(HWND hWnd, UINT wParam, LONG lParam) ! 305: { ! 306: ! 307: switch (LOWORD(wParam)) ! 308: { ! 309: case IDM_COLOR: //For any of the dialog creation ! 310: DoColorsDialog(hWnd) ; //commands, call the appropriate ! 311: break ; //function. The function will ! 312: //create the dialog... ! 313: case IDM_FONT: ! 314: DoFontDialog(hWnd) ; ! 315: break ; ! 316: ! 317: case IDM_TITLE: ! 318: DoTitleDialog(hWnd) ; ! 319: break ; ! 320: ! 321: case IDM_FIND: ! 322: DoFindDialog(hWnd) ; ! 323: break ; ! 324: ! 325: case IDM_OPEN: ! 326: DoOpenDialog(hWnd) ; ! 327: break ; ! 328: ! 329: case IDM_SAVE: ! 330: DoSaveDialog(hWnd) ; ! 331: break ; ! 332: ! 333: case IDM_PRINT: ! 334: DoPrintDialog(hWnd) ; ! 335: break ; ! 336: ! 337: case IDM_REPLACE: ! 338: DoReplaceDialog(hWnd) ; ! 339: break ; ! 340: ! 341: case IDM_EXIT: ! 342: PostQuitMessage(0) ; ! 343: break ; ! 344: ! 345: case IDM_HEXMODE: ! 346: case IDM_DECIMALMODE: ! 347: ! 348: /* We need to maintain a global variable that will indicate what ! 349: kind of number processing we have to do. First, check the ! 350: menu item corresponding to the new mode... */ ! 351: ! 352: CheckMenuItem(GetMenu(hWnd), uMode, MF_UNCHECKED) ; ! 353: uMode = wParam ; ! 354: CheckMenuItem(GetMenu(hWnd), uMode, MF_CHECKED) ; ! 355: ! 356: ! 357: /* and then create an appropriate filter for wsprintf() type ! 358: functions */ ! 359: ! 360: if (uMode == IDM_HEXMODE) ! 361: { ! 362: lstrcpy(szShortFilter, TEXT("%x")) ; ! 363: lstrcpy(szLongFilter, TEXT("%lx")) ; ! 364: } ! 365: if (uMode == IDM_DECIMALMODE) ! 366: { ! 367: lstrcpy(szShortFilter, TEXT("%d")) ; ! 368: lstrcpy(szLongFilter, TEXT("%ld")) ; ! 369: } ! 370: ! 371: break ; ! 372: ! 373: ! 374: case IDM_ABOUT: ! 375: DialogBox(hInst, TEXT("about"), hWnd, AboutProc) ; ! 376: break ; ! 377: ! 378: ! 379: default: break ; ! 380: } ! 381: ! 382: return ; ! 383: } ! 384: ! 385: ! 386: ! 387: ! 388: ! 389: ! 390: ! 391: ! 392: /************************************************************************ ! 393: ! 394: ! 395: Function: InitGlobals(void) ! 396: ! 397: Purpose: ! 398: ! 399: - Any global variables can be initialized here since this function is ! 400: called on app startup. ! 401: ! 402: Returns: Nothing ! 403: ! 404: Comments: ! 405: ! 406: ! 407: ************************************************************************/ ! 408: ! 409: ! 410: void InitGlobals(void) ! 411: { ! 412: ! 413: /* not really too much to do here. Create a hex wsprintf() filter since ! 414: the app starts off in Hex mode. */ ! 415: ! 416: lstrcpy(szShortFilter, TEXT("%x")) ; ! 417: lstrcpy(szLongFilter, TEXT("%lx")) ; ! 418: ! 419: } ! 420: ! 421: ! 422: ! 423: ! 424: ! 425: ! 426: ! 427: ! 428: ! 429: /************************************************************************ ! 430: ! 431: ! 432: Function: MyAtol(LPTSTR, BOOL, LPBOOL) ! 433: ! 434: Purpose: ! 435: ! 436: - This function will convert an ascii string to a LONG. ! 437: ! 438: Returns: ! 439: ! 440: - If it receives an invalid ascii character, it will return 0 and ! 441: set the LPBOOL variable to false... ! 442: ! 443: Comments: ! 444: ! 445: Since the function may need to deal with either a hex number or a decimal ! 446: number, it should use a variable as a multiplier. ! 447: ! 448: ! 449: ************************************************************************/ ! 450: ! 451: ! 452: LONG MyAtol(LPTSTR szString, BOOL bHex, LPBOOL bSuccess) ! 453: { ! 454: LPTSTR p ; ! 455: LONG l ; ! 456: LONG lMultiplier ; ! 457: BOOL bDigit ; ! 458: ! 459: if (bHex) ! 460: lMultiplier = 16 ; ! 461: else ! 462: lMultiplier = 10 ; ! 463: ! 464: p = szString ; ! 465: l = 0 ; ! 466: ! 467: while (*p) //while chars ! 468: { ! 469: bDigit = FALSE ; //set to false for each char that we look at ! 470: ! 471: if (*p >= (TCHAR) '0' && *p <= (TCHAR) '9') //is it an ascii char ? ! 472: { ! 473: bDigit = TRUE ; ! 474: l+=(*p - (TCHAR) '0') ; ! 475: } ! 476: ! 477: if (bHex) ! 478: { ! 479: if (*p >= (TCHAR) 'A' && *p <= (TCHAR) 'F') //or hex? ! 480: { ! 481: l+=(*p - (TCHAR) 'A' + 10) ; ! 482: bDigit = TRUE ; ! 483: } ! 484: ! 485: if (*p >= (TCHAR) 'a' && *p <= (TCHAR) 'f') ! 486: { ! 487: l+=(*p - (TCHAR) 'a' + 10) ; ! 488: bDigit = TRUE ; ! 489: } ! 490: ! 491: } ! 492: ! 493: if (bDigit == FALSE) ! 494: { ! 495: *bSuccess = FALSE ; ! 496: return 0 ; ! 497: } ! 498: ! 499: p++ ; //get next char ! 500: ! 501: if (*p) //if there is going to be at least one more char ! 502: l*=lMultiplier ; //then multiply what we have by the multiplier... ! 503: } ! 504: ! 505: *bSuccess = TRUE ; ! 506: ! 507: return l ; //success! return the value. ! 508: } ! 509: ! 510: ! 511: ! 512: ! 513: ! 514: ! 515: ! 516: ! 517: ! 518: /************************************************************************ ! 519: ! 520: ! 521: Function: AboutProc(HWND, UINT, UINT, LONG) ! 522: ! 523: Purpose: Callback function for the about dialog box. ! 524: ! 525: ! 526: Returns: BOOL - FALSE ... ! 527: ! 528: ! 529: Comments: ! 530: ! 531: ************************************************************************/ ! 532: ! 533: ! 534: BOOL APIENTRY AboutProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) ! 535: { ! 536: ! 537: if ( ! 538: (msg == WM_COMMAND) && ! 539: (LOWORD(wParam) == IDCANCEL) ! 540: ) ! 541: ! 542: EndDialog(hwnd, FALSE) ; ! 543: ! 544: else ! 545: return FALSE ; ! 546: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.