CDTEST.C
/************************************************************************ 
 
  File: cdtest.c 
 
  Purpose:  Contains the functions which handle the main window's functionality -- 
            creating the main window, handling menu commands, exiting the program. 
 
  Functions: 
 
           WinMain()           - Program's entry point 
 
           InitApplication()   - Registers class and some user defined messages 
 
           InitInstance()      - Creates main window 
 
           MainWndProc()       - Window procedure for main window 
 
           HandleTheCommand()  - Processes all WM_COMMAND messages 
 
           InitGlobals()       - Initializes all global variables that need to 
                                 be initialized at startup 
 
           MyAtol()            - Converts an ASCII string in either hexi- 
                                 decimal or decimal notation to a LONG. 
 
           AboutProc()         - Callback function for CDTEST's about box. 
 
************************************************************************/ 
 
 
 
#include <windows.h> 
#include <commdlg.h> 
#include <winnls.h> 
#include "cdtest.h" 
#include "colors.h" 
#include "save.h" 
#include "print.h" 
#include "title.h" 
#include "replace.h" 
#include "open.h" 
#include "font.h" 
#include "find.h" 
 
 
 
 
 
/* Some defines, global variables, and function declarations */ 
 
#define szClass TEXT("cdtestclass") 
#define szIcon  TEXT("theicon") 
#define szMenu  TEXT("themenu") 
 
#ifdef UNICODE 
  #define szTitle TEXT("Common Dialog Test App - Unicode Version") 
#else 
  #define szTitle TEXT("Common Dialog Test App - ANSI Version") 
#endif 
 
 
void InitGlobals(void) ; 
 
UINT uMode = IDM_HEXMODE ; 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
 
  Purpose: 
 
    - Contains standard windows entry point 
 
    - Initializes the application 
 
    - Contains the main message loop 
 
  Returns: Final msg.wParam 
 
  Comments: 
 
************************************************************************/ 
 
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
 
  MSG msg; 
 
 
  UNREFERENCED_PARAMETER( lpCmdLine ); 
 
 
  if (!hPrevInstance) 
    if (!InitApplication(hInstance)) 
        return (FALSE); 
 
  if (!InitInstance(hInstance, nCmdShow)) 
    return (FALSE); 
 
  while (GetMessage(&msg, 0, 0, 0)) 
  { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
  } 
 
 
  return (msg.wParam); 
} 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: InitApplication(HANDLE) 
 
 
  Purpose: 
 
    - Fills in the WNDCLASS structure 
 
    - Registers messages needed to communicate with the common dialogs 
 
    - Registers the window class 
 
  Returns: The return value of RegisterClass().  If this fails then the 
           whole program fails. 
 
  Comments: 
 
 
************************************************************************/ 
 
 
BOOL InitApplication(HANDLE hInstance)      
{ 
  WNDCLASS  wc; 
 
  wc.style = 0; 
  wc.lpfnWndProc = (WNDPROC)MainWndProc; 
  wc.cbClsExtra = 0; 
  wc.cbWndExtra = 0; 
  wc.hInstance = hInstance; 
  wc.hIcon = LoadIcon(hInstance, szIcon) ; 
  wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
  wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
  wc.lpszMenuName = szMenu ; 
  wc.lpszClassName = szClass ; 
 
   
  InitGlobals() ; 
 
   
  /* Register any messages that the common dialogs will need to  
     communicate with this app. */ 
 
  nFindMsg       = RegisterWindowMessage((LPTSTR) FINDMSGSTRING) ; 
  nOpenShareVMsg = RegisterWindowMessage((LPTSTR) SHAREVISTRING) ; 
  nHelpMessage   = RegisterWindowMessage((LPTSTR) HELPMSGSTRING) ; 
 
 
  return (RegisterClass(&wc)); 
} 
 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
 Function: InitInstance(HANDLE, int) 
 
 
 Purpose: 
 
   - Creates the main window 
 
   - Shows the main window 
 
 Returns: FALSE if it cannot create the window, TRUE if it can. 
 
 
 Comments: 
 
 
************************************************************************/ 
 
 
BOOL InitInstance(HANDLE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    DWORD dwFlags = WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU ; 
 
     
    /* save the instance handle in a global variable */ 
 
    hInst = hInstance; 
 
 
    /* Create the main window */ 
 
    hWnd = CreateWindow(szClass, szTitle, dwFlags,  
                        10, 10, 400, 200, NULL, NULL, hInstance, NULL) ; 
 
    if (!hWnd) 
        return (FALSE); 
 
    ShowWindow(hWnd, SW_SHOWNORMAL) ; 
    UpdateWindow(hWnd); 
 
    return (TRUE); 
} 
 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: MainWndProc(HWND, UINT, UINT, LONG) 
 
  Purpose: 
 
    - Is the callback function that handles all messages for the main window 
 
  Returns: 
 
    - Returns DefWindowProc() for any message it does not explicitly 
      respond to. 
 
  Comments: 
 
 
************************************************************************/ 
 
 
LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) 
{ 
    switch (message) 
    { 
      case WM_CREATE: 
        CheckMenuItem(GetMenu(hWnd), IDM_HEXMODE, MF_CHECKED) ; 
        break ; 
 
      case WM_COMMAND: 
        HandleTheCommand(hWnd, wParam, lParam) ; 
        break ; 
 
      case WM_DESTROY: 
          PostQuitMessage(0); 
          break; 
 
      default: 
          return (DefWindowProc(hWnd, message, wParam, lParam)); 
          break ; 
    } 
    return (0L); 
} 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: HandleTheCommand(HWND, UINT, UINT) 
 
  Purpose: 
 
    - Handles all WM_COMMAND messages passed to the MainWndProc().  The 
      menu or control ID value for Win32 WM_COMMAND messages is contained 
      in the low word of the wParam parameter. 
 
  Returns: Nothing. 
 
  Comments: 
 
 
************************************************************************/ 
 
 
void HandleTheCommand(HWND hWnd, UINT wParam, LONG lParam) 
{ 
 
  switch (LOWORD(wParam)) 
  { 
    case IDM_COLOR:                //For any of the dialog creation 
      DoColorsDialog(hWnd) ;       //commands, call the appropriate 
      break ;                      //function.  The function will 
                                   //create the dialog... 
    case IDM_FONT: 
      DoFontDialog(hWnd) ; 
      break ; 
 
    case IDM_TITLE: 
      DoTitleDialog(hWnd) ; 
      break ; 
 
    case IDM_FIND: 
      DoFindDialog(hWnd) ; 
      break ; 
 
    case IDM_OPEN: 
      DoOpenDialog(hWnd) ; 
      break ; 
 
    case IDM_SAVE: 
      DoSaveDialog(hWnd) ; 
      break ; 
 
    case IDM_PRINT: 
      DoPrintDialog(hWnd) ; 
      break ; 
 
    case IDM_REPLACE: 
      DoReplaceDialog(hWnd) ; 
      break ; 
 
    case IDM_EXIT: 
      PostQuitMessage(0) ; 
      break ; 
 
    case IDM_HEXMODE: 
    case IDM_DECIMALMODE: 
 
      /* We need to maintain a global variable that will indicate what 
         kind of number processing we have to do.  First, check the 
         menu item corresponding to the new mode... */ 
 
      CheckMenuItem(GetMenu(hWnd), uMode, MF_UNCHECKED) ; 
      uMode = wParam ; 
      CheckMenuItem(GetMenu(hWnd), uMode, MF_CHECKED) ; 
 
 
      /* and then create an appropriate filter for wsprintf() type 
         functions */ 
 
      if (uMode == IDM_HEXMODE) 
      { 
        lstrcpy(szShortFilter, TEXT("%x")) ; 
        lstrcpy(szLongFilter, TEXT("%lx")) ; 
      } 
      if (uMode == IDM_DECIMALMODE) 
      { 
        lstrcpy(szShortFilter, TEXT("%d")) ; 
        lstrcpy(szLongFilter, TEXT("%ld")) ; 
      } 
 
      break ; 
 
 
    case IDM_ABOUT: 
       DialogBox(hInst, TEXT("about"), hWnd, AboutProc) ; 
       break ; 
 
 
    default: break ; 
  } 
 
  return ; 
} 
 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: InitGlobals(void) 
 
  Purpose: 
 
    - Any global variables can be initialized here since this function is 
      called on app startup. 
 
  Returns: Nothing 
 
  Comments: 
 
 
************************************************************************/ 
 
 
void InitGlobals(void) 
{ 
 
  /* not really too much to do here.  Create a hex wsprintf() filter since 
     the app starts off in Hex mode. */ 
 
  lstrcpy(szShortFilter, TEXT("%x")) ; 
  lstrcpy(szLongFilter, TEXT("%lx")) ; 
 
} 
 
 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: MyAtol(LPTSTR, BOOL, LPBOOL) 
 
  Purpose: 
 
    - This function will convert an ascii string to a LONG. 
 
  Returns: 
 
    - If it receives an invalid ascii character, it will return 0 and 
      set the LPBOOL variable to false... 
 
  Comments: 
 
      Since the function may need to deal with either a hex number or a decimal 
      number, it should use a variable as a multiplier. 
 
 
************************************************************************/ 
 
 
LONG MyAtol(LPTSTR szString, BOOL bHex, LPBOOL bSuccess) 
{ 
  LPTSTR p ; 
  LONG l ; 
  LONG lMultiplier ; 
  BOOL bDigit ; 
 
  if (bHex) 
    lMultiplier = 16 ; 
  else 
    lMultiplier = 10 ; 
 
  p = szString ; 
  l = 0 ; 
 
  while (*p)      //while chars 
  { 
     bDigit = FALSE ;  //set to false for each char that we look at 
 
     if (*p >= (TCHAR) '0' && *p <= (TCHAR) '9')  //is it an ascii char ? 
     { 
       bDigit = TRUE ; 
       l+=(*p - (TCHAR) '0') ; 
     } 
 
     if (bHex) 
     { 
       if (*p >= (TCHAR) 'A' && *p <= (TCHAR) 'F')  //or hex? 
       { 
         l+=(*p - (TCHAR) 'A' + 10) ; 
         bDigit = TRUE ; 
       } 
 
       if (*p >= (TCHAR) 'a' && *p <= (TCHAR) 'f')  
       { 
         l+=(*p - (TCHAR) 'a' + 10) ; 
         bDigit = TRUE ; 
       } 
 
     } 
 
     if (bDigit == FALSE) 
     { 
       *bSuccess = FALSE ; 
       return 0 ; 
     } 
 
     p++ ;               //get next char 
 
     if (*p)             //if there is going to be at least one more char 
       l*=lMultiplier ;  //then multiply what we have by the multiplier... 
  } 
 
  *bSuccess = TRUE ; 
 
  return l ;             //success! return the value. 
} 
 
 
 
 
 
 
 
 
 
/************************************************************************ 
 
 
  Function: AboutProc(HWND, UINT, UINT, LONG) 
 
  Purpose:  Callback function for the about dialog box. 
 
 
  Returns:  BOOL - FALSE ... 
 
 
  Comments: 
 
************************************************************************/ 
 
 
BOOL APIENTRY AboutProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) 
{ 
 
  if (msg == WM_INITDIALOG) 
    return TRUE; 
  if ( 
       (msg == WM_COMMAND) && 
       (LOWORD(wParam) == IDCANCEL) 
     ) 
 
     EndDialog(hwnd, FALSE) ; 
 
  else 
    return FALSE ; 
}