UTILS.H

//==========================================================================// 
// Constants //
//==========================================================================//


#define ThreeDPad 2
#define NOCHANGE -1

#define MENUCLOSING (0xFFFF0000)

#define WM_DLGSETFOCUS (WM_USER + 0x201)
#define WM_DLGKILLFOCUS (WM_USER + 0x202)



//==========================================================================//
// Macros //
//==========================================================================//


#define PinInclusive(x, lo, hi) \
(max (lo, min (x, hi)))


#define PinExclusive(x, lo, hi) \
(max ((lo) + 1, min (x, (hi) - 1)))


#define BoolEqual(a, b) \
((a == 0) == (b == 0))


//=============================//
// Window Instance Accessors //
//=============================//

#define WindowParent(hWnd) \
((HWND) GetWindowLong (hWnd, GWL_HWNDPARENT))

#define WindowID(hWnd) \
GetWindowLong (hWnd, GWL_ID)

#define WindowInstance(hWnd) \
GetWindowWord (hWnd, GWW_HINSTANCE)

#define WindowStyle(hWnd) \
GetWindowLong (hWnd, GWL_STYLE)

#define WindowSetStyle(hWnd, lStyle) \
SetWindowLong (hWnd, GWL_STYLE, lStyle)

#define WindowExStyle(hWnd) \
GetWindowLong (hWnd, GWL_EXSTYLE)

#define WindowSetID(hWnd, wID) \
SetWindowLong (hWnd, GWL_ID, wID)


// All modeless dialogs need to be dispatched separately in the WinMain
// message loop, but only if the dialog exists.


#define ModelessDispatch(hDlg, lpMsg) \
(hDlg ? IsDialogMessage (hDlg, lpMsg) : FALSE)


#define strclr(szString) \
(szString [0] = TEXT('\0'))


#define strempty(lpszString) \
(!(lpszString) || !(lpszString[0]))

#define pstrsame(lpsz1, lpsz2) \
((!lpsz1 && !lpsz2) || (lpsz1 && lpsz2 && strsame (lpsz1, lpsz2)))

#define pstrsamei(lpsz1, lpsz2) \
((!lpsz1 && !lpsz2) || (lpsz1 && lpsz2 && strsamei (lpsz1, lpsz2)))

#define StringLoad(wID, szText) \
(LoadString (hInstance, wID, \
szText, sizeof (szText) - sizeof(TCHAR)))


#define WindowInvalidate(hWnd) \
(InvalidateRect (hWnd, NULL, TRUE))


#define WindowShow(hWnd, bShow) \
(ShowWindow (hWnd, (bShow) ? SW_SHOW : SW_HIDE))


#define MenuCheck(hMenu, wID, bCheck) \
(CheckMenuItem (hMenu, wID, (bCheck) ? \
(MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED)))

#define DeleteFont(hFont) \
(DeleteObject (hFont))

#define DeleteBitmap(hBitmap) \
(DeleteObject (hBitmap))

#define DialogControl(hDlg, wControlID) \
GetDlgItem (hDlg, wControlID)


#define DialogSetInt(hDlg, wControlID, iValue) \
(SetDlgItemInt (hDlg, wControlID, iValue, TRUE))


#define DialogText(hDlg, wControlID, szText) \
(GetDlgItemText (hDlg, wControlID, szText, sizeof (szText) / sizeof(TCHAR) - 1))

#define DialogInt(hDlg, wControlID) \
(GetDlgItemInt (hDlg, wControlID, NULL, TRUE))

#define strsame(szText1, szText2) \
(!lstrcmp (szText1, szText2))

#define strsamei(szText1, szText2) \
(!lstrcmpi (szText1, szText2))

#define strnsame(szText1, szText2, iLen) \
(!lstrncmp (szText1, szText2, iLen))


#define CreateScreenDC() \
CreateDC (TEXT("DISPLAY"), NULL, NULL, NULL)



#define RectContract(lpRect, xAmt, yAmt) \
{ \
(lpRect)->left += (xAmt) ; \
(lpRect)->top += (yAmt) ; \
(lpRect)->right -= (xAmt) ; \
(lpRect)->bottom -= (yAmt) ; \
}

#define IsBW(hDC) \
(DeviceNumColors (hDC) <= 2)

#ifdef KEEP_PRINT
#define IsPrinterDC(hDC) \
(GetDeviceCaps (hDC, TECHNOLOGY) != DT_RASDISPLAY)
#else
#define IsPrinterDC(hDC) \
(FALSE)
#endif

#define VertInchPixels(hDC, iNumerator, iDenominator) \
((iNumerator * GetDeviceCaps (hDC, LOGPIXELSY)) / iDenominator)


#define HorzInchPixels(hDC, iNumerator, iDenominator) \
((iNumerator * GetDeviceCaps (hDC, LOGPIXELSX)) / iDenominator)


#define VertPointPixels(hDC, iPoints) \
((iPoints * GetDeviceCaps (hDC, LOGPIXELSY)) / 72)



#define SimulateButtonPush(hDlg, wControlID) \
(PostMessage (hDlg, WM_COMMAND, \
(WPARAM) MAKELONG (wControlID, BN_CLICKED), \
(LPARAM) DialogControl (hDlg, wControlID)))


// convert an unicode string to OEM string
#define ConvertUnicodeStr(pOemStr, pUnicodeStr) \
CharToOemBuff(pUnicodeStr, pOemStr, lstrlen(pUnicodeStr) + 1)

#define CallWinHelp(ContextID) \
WinHelp(hWndMain, pszHelpFile, HELP_CONTEXT, ContextID) ;

//==========================================================================//
// Exported Functions //
//==========================================================================//

void Fill (HDC hDC,
DWORD rgbColor,
LPRECT lpRect) ;

void ScreenRectToClient (HWND hWnd,
LPRECT lpRect) ;

int TextWidth (HDC hDC, LPTSTR lpszText) ;


void ThreeDConcave (HDC hDC,
int x1, int y1,
int x2, int y2,
BOOL bFace) ;


void ThreeDConvex (HDC hDC,
int x1, int y1,
int x2, int y2) ;


void ThreeDConcave1 (HDC hDC,
int x1, int y1,
int x2, int y2) ;


void ThreeDConvex1 (HDC hDC,
int x1, int y1,
int x2, int y2) ;


int _cdecl mike (TCHAR *szFormat, ...) ;

int _cdecl DlgErrorBox (HWND hDlg, UINT id, ...) ;

int _cdecl mike1 (TCHAR *szFormat, ...) ;
int _cdecl mike2 (TCHAR *szFormat, ...) ;

int FontHeight (HDC hDC,
BOOL bIncludeLeading) ;


int TextAvgWidth (HDC hDC,
int iNumChars) ;



void WindowCenter (HWND hWnd) ;



BOOL DialogMove (HDLG hDlg,
WORD wControlID,
int xPos,
int yPos,
int xWidth,
int yHeight) ;


int DialogWidth (HDLG hDlg,
WORD wControlID) ;


int DialogXPos (HDLG hDlg,
WORD wControlID) ;

int DialogYPos (HDLG hDlg,
WORD wControlID) ;


void DialogShow (HDLG hDlg,
WORD wID,
BOOL bShow) ;


BOOL _cdecl DialogSetText (HDLG hDlg,
WORD wControlID,
WORD wStringID,
...) ;
#if 0
BOOL _cdecl DialogSetString (HDLG hDlg,
WORD wControlID,
LPTSTR lpszFormat,
...) ;
#endif
#define DialogSetString(hDlg, wControlID, lpszFormat) \
SetDlgItemText (hDlg, wControlID, lpszFormat)

LPTSTR LongToCommaString (LONG lNumber,
LPTSTR lpszText) ;


BOOL MenuSetPopup (HWND hWnd,
int iPosition,
WORD wControlID,
LPTSTR lpszResourceID) ;

void DialogEnable (HDLG hDlg,
WORD wID,
BOOL bEnable) ;


LPTSTR FileCombine (LPTSTR lpszFileSpec,
LPTSTR lpszFileDirectory,
LPTSTR lpszFileName) ;

LPTSTR ExtractFileName (LPTSTR pFileSpec) ;

int CBAddInt (HWND hWndCB,
int iValue) ;

FLOAT DialogFloat (HDLG hDlg,
WORD wControlID,
BOOL *pbOK) ;


LPTSTR StringAllocate (LPTSTR lpszText1) ;


int DivRound (int iNumerator, int iDenominator) ;



BOOL MenuEnableItem (HMENU hMenu,
WORD wID,
BOOL bEnable) ;



void DrawBitmap (HDC hDC,
HBITMAP hBitmap,
int xPos,
int yPos,
LONG lROPCode) ;

void BitmapDimemsion (HBITMAP hBitmap, int *pHeight, int *pWidth) ;


void WindowResize (HWND hWnd,
int xWidth,
int yHeight) ;


int WindowHeight (HWND hWnd) ;



void WindowSetTopmost (HWND hWnd, BOOL bTopmost) ;


void WindowEnableTitle (HWND hWnd, BOOL bTitle) ;


void Line (HDC hDC,
HPEN hPen,
int x1, int y1,
int x2, int y2) ;



#define HLine(hDC, hPen, x1, x2, y) \
Line (hDC, hPen, x1, y, x2, y) ;


#define VLine(hDC, hPen, x, y1, y2) \
Line (hDC, hPen, x, y1, x, y2) ;


int DialogHeight (HDLG hDlg,
WORD wControlID) ;



void DialogSetFloat (HDLG hDlg,
WORD wControlID,
FLOAT eValue) ;

void DialogSetInterval (HDLG hDlg,
WORD wControlID,
int IntervalMSec ) ;

int MessageBoxResource (HWND hWndParent,
WORD wTextID,
WORD wTitleID,
UINT uiStyle) ;

void WindowPlacementToString (PWINDOWPLACEMENT pWP,
LPTSTR lpszText) ;

void StringToWindowPlacement (LPTSTR lpszText,
PWINDOWPLACEMENT pWP) ;

DWORD MenuIDToHelpID (DWORD MenuID) ;