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 ;
}