CDTEST.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /************************************************************************
  2.   File: cdtest.c
  3.   Purpose:  Contains the functions which handle the main window's functionality --
  4.             creating the main window, handling menu commands, exiting the program.
  5.   Functions:
  6.            WinMain()           - Program's entry point
  7.            InitApplication()   - Registers class and some user defined messages
  8.            InitInstance()      - Creates main window
  9.            MainWndProc()       - Window procedure for main window
  10.            HandleTheCommand()  - Processes all WM_COMMAND messages
  11.            InitGlobals()       - Initializes all global variables that need to
  12.                                  be initialized at startup
  13.            MyAtol()            - Converts an ASCII string in either hexi-
  14.                                  decimal or decimal notation to a LONG.
  15.            AboutProc()         - Callback function for CDTEST's about box.
  16. ************************************************************************/
  17. #include <windows.h>
  18. #include <commdlg.h>
  19. #include <winnls.h>
  20. #include "cdtest.h"
  21. #include "colors.h"
  22. #include "save.h"
  23. #include "print.h"
  24. #include "title.h"
  25. #include "replace.h"
  26. #include "open.h"
  27. #include "font.h"
  28. #include "find.h"
  29. /* Some defines, global variables, and function declarations */
  30. #define szClass TEXT("cdtestclass")
  31. #define szIcon  TEXT("theicon")
  32. #define szMenu  TEXT("themenu")
  33. #ifdef UNICODE
  34.   #define szTitle TEXT("Common Dialog Test App - Unicode Version")
  35. #else
  36.   #define szTitle TEXT("Common Dialog Test App - ANSI Version")
  37. #endif
  38. void InitGlobals(void) ;
  39. UINT uMode = IDM_HEXMODE ;
  40. /************************************************************************
  41.   Function: WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  42.   Purpose:
  43.     - Contains standard windows entry point
  44.     - Initializes the application
  45.     - Contains the main message loop
  46.   Returns: Final msg.wParam
  47.   Comments:
  48. ************************************************************************/
  49. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  50. {
  51.   MSG msg;
  52.   UNREFERENCED_PARAMETER( lpCmdLine );
  53.   if (!hPrevInstance)
  54.     if (!InitApplication(hInstance))
  55.         return (FALSE);
  56.   if (!InitInstance(hInstance, nCmdShow))
  57.     return (FALSE);
  58.   while (GetMessage(&msg, 0, 0, 0))
  59.   {
  60.     TranslateMessage(&msg);
  61.     DispatchMessage(&msg);
  62.   }
  63.   return (msg.wParam);
  64. }
  65. /************************************************************************
  66.   Function: InitApplication(HANDLE)
  67.   Purpose:
  68.     - Fills in the WNDCLASS structure
  69.     - Registers messages needed to communicate with the common dialogs
  70.     - Registers the window class
  71.   Returns: The return value of RegisterClass().  If this fails then the
  72.            whole program fails.
  73.   Comments:
  74. ************************************************************************/
  75. BOOL InitApplication(HANDLE hInstance)     
  76. {
  77.   WNDCLASS  wc;
  78.   wc.style = 0;
  79.   wc.lpfnWndProc = (WNDPROC)MainWndProc;
  80.   wc.cbClsExtra = 0;
  81.   wc.cbWndExtra = 0;
  82.   wc.hInstance = hInstance;
  83.   wc.hIcon = LoadIcon(hInstance, szIcon) ;
  84.   wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  85.   wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  86.   wc.lpszMenuName = szMenu ;
  87.   wc.lpszClassName = szClass ;
  88.   
  89.   InitGlobals() ;
  90.   
  91.   /* Register any messages that the common dialogs will need to 
  92.      communicate with this app. */
  93.   nFindMsg       = RegisterWindowMessage((LPTSTR) FINDMSGSTRING) ;
  94.   nOpenShareVMsg = RegisterWindowMessage((LPTSTR) SHAREVISTRING) ;
  95.   nHelpMessage   = RegisterWindowMessage((LPTSTR) HELPMSGSTRING) ;
  96.   return (RegisterClass(&wc));
  97. }
  98. /************************************************************************
  99.  Function: InitInstance(HANDLE, int)
  100.  Purpose:
  101.    - Creates the main window
  102.    - Shows the main window
  103.  Returns: FALSE if it cannot create the window, TRUE if it can.
  104.  Comments:
  105. ************************************************************************/
  106. BOOL InitInstance(HANDLE hInstance, int nCmdShow)
  107. {
  108.     HWND hWnd;
  109.     DWORD dwFlags = WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU ;
  110.     
  111.     /* save the instance handle in a global variable */
  112.     hInst = hInstance;
  113.     /* Create the main window */
  114.     hWnd = CreateWindow(szClass, szTitle, dwFlags, 
  115.                         10, 10, 400, 200, NULL, NULL, hInstance, NULL) ;
  116.     if (!hWnd)
  117.         return (FALSE);
  118.     ShowWindow(hWnd, SW_SHOWNORMAL) ;
  119.     UpdateWindow(hWnd);
  120.     return (TRUE);
  121. }
  122. /************************************************************************
  123.   Function: MainWndProc(HWND, UINT, UINT, LONG)
  124.   Purpose:
  125.     - Is the callback function that handles all messages for the main window
  126.   Returns:
  127.     - Returns DefWindowProc() for any message it does not explicitly
  128.       respond to.
  129.   Comments:
  130. ************************************************************************/
  131. LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam)
  132. {
  133.     switch (message)
  134.     {
  135.       case WM_CREATE:
  136.         CheckMenuItem(GetMenu(hWnd), IDM_HEXMODE, MF_CHECKED) ;
  137.         break ;
  138.       case WM_COMMAND:
  139.         HandleTheCommand(hWnd, wParam, lParam) ;
  140.         break ;
  141.       case WM_DESTROY:
  142.           PostQuitMessage(0);
  143.           break;
  144.       default:
  145.           return (DefWindowProc(hWnd, message, wParam, lParam));
  146.           break ;
  147.     }
  148.     return (0L);
  149. }
  150. /************************************************************************
  151.   Function: HandleTheCommand(HWND, UINT, UINT)
  152.   Purpose:
  153.     - Handles all WM_COMMAND messages passed to the MainWndProc().  The
  154.       menu or control ID value for Win32 WM_COMMAND messages is contained
  155.       in the low word of the wParam parameter.
  156.   Returns: Nothing.
  157.   Comments:
  158. ************************************************************************/
  159. void HandleTheCommand(HWND hWnd, UINT wParam, LONG lParam)
  160. {
  161.   switch (LOWORD(wParam))
  162.   {
  163.     case IDM_COLOR:                //For any of the dialog creation
  164.       DoColorsDialog(hWnd) ;       //commands, call the appropriate
  165.       break ;                      //function.  The function will
  166.                                    //create the dialog...
  167.     case IDM_FONT:
  168.       DoFontDialog(hWnd) ;
  169.       break ;
  170.     case IDM_TITLE:
  171.       DoTitleDialog(hWnd) ;
  172.       break ;
  173.     case IDM_FIND:
  174.       DoFindDialog(hWnd) ;
  175.       break ;
  176.     case IDM_OPEN:
  177.       DoOpenDialog(hWnd) ;
  178.       break ;
  179.     case IDM_SAVE:
  180.       DoSaveDialog(hWnd) ;
  181.       break ;
  182.     case IDM_PRINT:
  183.       DoPrintDialog(hWnd) ;
  184.       break ;
  185.     case IDM_REPLACE:
  186.       DoReplaceDialog(hWnd) ;
  187.       break ;
  188.     case IDM_EXIT:
  189.       PostQuitMessage(0) ;
  190.       break ;
  191.     case IDM_HEXMODE:
  192.     case IDM_DECIMALMODE:
  193.       /* We need to maintain a global variable that will indicate what
  194.          kind of number processing we have to do.  First, check the
  195.          menu item corresponding to the new mode... */
  196.       CheckMenuItem(GetMenu(hWnd), uMode, MF_UNCHECKED) ;
  197.       uMode = wParam ;
  198.       CheckMenuItem(GetMenu(hWnd), uMode, MF_CHECKED) ;
  199.       /* and then create an appropriate filter for wsprintf() type
  200.          functions */
  201.       if (uMode == IDM_HEXMODE)
  202.       {
  203.         lstrcpy(szShortFilter, TEXT("%x")) ;
  204.         lstrcpy(szLongFilter, TEXT("%lx")) ;
  205.       }
  206.       if (uMode == IDM_DECIMALMODE)
  207.       {
  208.         lstrcpy(szShortFilter, TEXT("%d")) ;
  209.         lstrcpy(szLongFilter, TEXT("%ld")) ;
  210.       }
  211.       break ;
  212.     case IDM_ABOUT:
  213.        DialogBox(hInst, TEXT("about"), hWnd, AboutProc) ;
  214.        break ;
  215.     default: break ;
  216.   }
  217.   return ;
  218. }
  219. /************************************************************************
  220.   Function: InitGlobals(void)
  221.   Purpose:
  222.     - Any global variables can be initialized here since this function is
  223.       called on app startup.
  224.   Returns: Nothing
  225.   Comments:
  226. ************************************************************************/
  227. void InitGlobals(void)
  228. {
  229.   /* not really too much to do here.  Create a hex wsprintf() filter since
  230.      the app starts off in Hex mode. */
  231.   lstrcpy(szShortFilter, TEXT("%x")) ;
  232.   lstrcpy(szLongFilter, TEXT("%lx")) ;
  233. }
  234. /************************************************************************
  235.   Function: MyAtol(LPTSTR, BOOL, LPBOOL)
  236.   Purpose:
  237.     - This function will convert an ascii string to a LONG.
  238.   Returns:
  239.     - If it receives an invalid ascii character, it will return 0 and
  240.       set the LPBOOL variable to false...
  241.   Comments:
  242.       Since the function may need to deal with either a hex number or a decimal
  243.       number, it should use a variable as a multiplier.
  244. ************************************************************************/
  245. LONG MyAtol(LPTSTR szString, BOOL bHex, LPBOOL bSuccess)
  246. {
  247.   LPTSTR p ;
  248.   LONG l ;
  249.   LONG lMultiplier ;
  250.   BOOL bDigit ;
  251.   if (bHex)
  252.     lMultiplier = 16 ;
  253.   else
  254.     lMultiplier = 10 ;
  255.   p = szString ;
  256.   l = 0 ;
  257.   while (*p)      //while chars
  258.   {
  259.      bDigit = FALSE ;  //set to false for each char that we look at
  260.      if (*p >= (TCHAR) '0' && *p <= (TCHAR) '9')  //is it an ascii char ?
  261.      {
  262.        bDigit = TRUE ;
  263.        l+=(*p - (TCHAR) '0') ;
  264.      }
  265.      if (bHex)
  266.      {
  267.        if (*p >= (TCHAR) 'A' && *p <= (TCHAR) 'F')  //or hex?
  268.        {
  269.          l+=(*p - (TCHAR) 'A' + 10) ;
  270.          bDigit = TRUE ;
  271.        }
  272.        if (*p >= (TCHAR) 'a' && *p <= (TCHAR) 'f') 
  273.        {
  274.          l+=(*p - (TCHAR) 'a' + 10) ;
  275.          bDigit = TRUE ;
  276.        }
  277.      }
  278.      if (bDigit == FALSE)
  279.      {
  280.        *bSuccess = FALSE ;
  281.        return 0 ;
  282.      }
  283.      p++ ;               //get next char
  284.      if (*p)             //if there is going to be at least one more char
  285.        l*=lMultiplier ;  //then multiply what we have by the multiplier...
  286.   }
  287.   *bSuccess = TRUE ;
  288.   return l ;             //success! return the value.
  289. }
  290. /************************************************************************
  291.   Function: AboutProc(HWND, UINT, UINT, LONG)
  292.   Purpose:  Callback function for the about dialog box.
  293.   Returns:  BOOL - FALSE ...
  294.   Comments:
  295. ************************************************************************/
  296. BOOL APIENTRY AboutProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  297. {
  298.   if (msg == WM_INITDIALOG)
  299.     return TRUE;
  300.   if (
  301.        (msg == WM_COMMAND) &&
  302.        (LOWORD(wParam) == IDCANCEL)
  303.      )
  304.      EndDialog(hwnd, FALSE) ;
  305.   else
  306.     return FALSE ;
  307. }