windows-nt/Source/XPSP1/NT/base/fs/utils/dfrg/dfrgui/genericdialog.cpp

1160 lines
32 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*****************************************************************************************************************
FILENAME: GenericDialog.cpp
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
*/
#include "stdafx.h"
#ifndef SNAPIN
#ifndef NOWINDOWSH
#include <windows.h>
#endif
#endif
#include "assert.h"
#include "DfrgUI.h"
#include "DfrgCmn.h"
#include "DfrgCtl.h"
#include "resource.h"
#include "GetDfrgRes.h"
#include "DfrgHlp.h"
#include "genericdialog.h"
#include "expand.h"
static CVolume *pLocalVolume = NULL;
static HFONT hDlgFont = NULL;
static BOOL bIsIconVisible = FALSE;
static HANDLE hgenericDialogIcon = NULL;
static RECT rcButton0;
static RECT rcButton1;
static RECT rcButton2;
static RECT rcButton3;
static RECT rcButton4;
static RECT rButton;
static RECT rcIcon;
static RECT rcOriginalDialogSize;
static RECT rcNewDialogSize;
static UINT totalButtonWidth;
static UINT m_ButtonTopBottomSpacer;
static UINT m_ButtonHeight;
static UINT m_ButtonWidth;
static UINT m_ButtonSpacer;
static UINT m_Margin;
static UINT m_ButtonFloat;
static UINT minimumDialogWidth;
static UINT minimumDialogHeight;
static UINT iconSize;
static UINT minimumNumberOfCaractersWide;
static UINT minimumNumberOfLinesLong;
static UINT adjustedButtonWidth0;
static UINT adjustedButtonWidth1;
static UINT adjustedButtonWidth2;
static UINT adjustedButtonWidth3;
static UINT adjustedButtonWidth4;
static UINT adjustedButtonHeight;
static UINT wNormalHeight; // height of reduced dialog box (which
// extends just past the ID_MORE button vertically)
static WORD wExpandedHeight; // height of full size dialog box
static BOOL fExpanded = FALSE;
static WORD wFontHeight;
static WORD wEditBoxHeight;
static WORD wEditBoxWidth;
//structure for the buttons
typedef struct{
TCHAR m_buttonText[200];
TCHAR m_buttonHelp[200];
BOOL m_buttonVisible;
} GENERICBUTTONARRAY;
static GENERICBUTTONARRAY genericButtonArray[5];
//structure for the help buttons
//the structure consists of pairs of DWORDS
//the first DWORD is the control identifier
//the second DWORD is the help context identifier from the help file
typedef struct{
DWORD dHelpControlIdentifier;
DWORD dHelpContextIdentifier;
} GENERICHELPIDARRAY;
static GENERICHELPIDARRAY genericHelpIDArray[5];
static TCHAR genericDialogTitle[200];
static TCHAR genericHelpFilePath[MAX_PATH + 30];
static TCHAR genericEditBoxText[1024];
static UINT iKeyPressedByUser;
BOOL InitializeGenericDialog(IN HWND hWndDialog);
void ExitAnalyzeDone(IN HWND hWndDialog);
BOOL CALLBACK GenericDialogProc(
IN HWND hWndDialog,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam
);
static void SetButtonsandIcon(HWND hWndDialog);
static UINT FindMaxEditboxStringWidth(VString vstring);
static UINT FindMaxEditboxStringHeight(VString vstring);
static void PositionButton(RECT* prcPos, HWND hWndDialog);
static void SizeButtons(HWND hWndDialog);
static void PositionButtons(HWND hWndDialog, RECT rDlg);
static UINT GetStringWidth(PTCHAR stringBuf, HDC WorkDC);
static void ResizeDialog(HWND hWndDialog);
static void DrawIconOnDialog(HWND hWndDialog);
/*****************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
Constructor for GenericDialog Class
INPUT:
IN pVolume - address of volume that has just completed Analyzing
RETURN:
*/
CGenericDialog::CGenericDialog(void)
{
int i;
for(i=0;i<=4;i++)
{
genericButtonArray[i].m_buttonVisible = FALSE;
}
bIsIconVisible = FALSE;
iconSize = 0;
m_ButtonTopBottomSpacer = 24;
m_ButtonHeight = 26;
m_ButtonWidth = 84;
m_ButtonSpacer = 22;
m_Margin = 20;
m_ButtonFloat = 20;
minimumDialogWidth = 250;
minimumDialogHeight = 75;
minimumNumberOfCaractersWide = 40;
minimumNumberOfLinesLong = 2;
//initialize the helpID array
genericHelpIDArray[0].dHelpControlIdentifier = ID_GENERIC_BUTTON0;
genericHelpIDArray[1].dHelpControlIdentifier = ID_GENERIC_BUTTON1;
genericHelpIDArray[2].dHelpControlIdentifier = ID_GENERIC_BUTTON2;
genericHelpIDArray[3].dHelpControlIdentifier = ID_GENERIC_BUTTON3;
genericHelpIDArray[4].dHelpControlIdentifier = ID_GENERIC_BUTTON4;
}
/*****************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
Destructor for GenericDialog Class
INPUT:
IN pVolume - address of volume that has just completed Analyzing
RETURN:
*/
CGenericDialog::~CGenericDialog(void)
{
}
/*****************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
Raises the Analyze Complete dialog
INPUT:
IN pVolume - address of volume that has just completed Analyzing
RETURN:
TRUE - Worked OK
FALSE - Failure
*/
UINT CGenericDialog::DoModal(HWND hWndDialog)
{
iKeyPressedByUser = NULL;
INT_PTR ret = DialogBoxParam(
GetDfrgResHandle(),
MAKEINTRESOURCE(IDD_GENERIC_DIALOG),
hWndDialog,
(DLGPROC)GenericDialogProc,
NULL
);
return iKeyPressedByUser;
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the genericDialog title string from a string
DATA STRUCTURES:
None.
INPUT:
TCHAR * - Title string for genericDialog
RETURN:
None.
*/
void CGenericDialog::SetTitle(TCHAR * tDialogBoxTitle)
{
//assert if tDialogBoxTitle lenght = 0
assert(_tcslen(tDialogBoxTitle) == 0);
_tcscpy(genericDialogTitle, tDialogBoxTitle);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the genericDialog title string from a resource ID
DATA STRUCTURES:
None.
INPUT:
UINT resource ID for the title string
RETURN:
None.
*/
void CGenericDialog::SetTitle(UINT uResID)
{
::LoadString(GetDfrgResHandle(), uResID, genericDialogTitle, sizeof(genericDialogTitle)/sizeof(TCHAR));
//assert if nothing got loaded
assert((_tcslen(genericDialogTitle) > 0));
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the button text from a TCHAR string
DATA STRUCTURES:
None.
INPUT:
UINT - Index for the button, must be in the range 0 to 4
TCHAR * - button string
RETURN:
None.
*/
void CGenericDialog::SetButtonText(UINT uIndex, TCHAR * tButtonText)
{
//assert if index out of range
assert(uIndex<5);
//assert if tButtonText length = 0
assert(_tcslen(tButtonText) == 0);
//set button to visible
genericButtonArray[uIndex].m_buttonVisible = TRUE;
//copy button text to the button structure
_tcscpy(genericButtonArray[uIndex].m_buttonText, tButtonText);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the button text from a resource ID
DATA STRUCTURES:
None.
INPUT:
UINT - Index for the button, must be in the range 0 to 4
UINT - resource ID for the button string
RETURN:
None.
*/
void CGenericDialog::SetButtonText(UINT uIndex, UINT uResID)
{
//assert if index out of range
assert(uIndex<5);
TCHAR tTempButtonString[200];
//set button to visible
genericButtonArray[uIndex].m_buttonVisible = TRUE;
//get the button text from the resource
::LoadString(GetDfrgResHandle(), uResID, tTempButtonString, sizeof(tTempButtonString)/sizeof(TCHAR));
//assert if tTempButtonString length = 0
assert(_tcslen(tTempButtonString) > 0);
//copy button text to the button structure
_tcscpy(genericButtonArray[uIndex].m_buttonText, tTempButtonString);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the button help using Help Context ID
DATA STRUCTURES:
None.
INPUT:
UINT - Index for the button, must be in the range 0 to 4
DWORD - Help Context ID
RETURN:
None.
*/
void CGenericDialog::SetButtonHelp(UINT uIndex, DWORD dHelpContextID)
{
//assert if index out of range
assert(uIndex<5);
//set the contect identifiers
genericHelpIDArray[uIndex].dHelpContextIdentifier = dHelpContextID;
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the help file path
DATA STRUCTURES:
None.
INPUT:
TCHAR * - the location of the help file
RETURN:
None.
*/
void CGenericDialog::SetHelpFilePath()
{
_tcscpy(genericHelpFilePath, GetHelpFilePath());
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This changes the ICON for the genericdialog
DATA STRUCTURES:
None.
INPUT:
UINT - resource ID for the Icon
RETURN:
None.
*/
void CGenericDialog::SetIcon(UINT uResID)
{
bIsIconVisible = TRUE;
hgenericDialogIcon = LoadImage(
GetDfrgResHandle(), // handle of the instance containing the image
MAKEINTRESOURCE(uResID), // name or identifier of image
IMAGE_ICON, // type of image
0, // desired width
0, // desired height
LR_DEFAULTSIZE // load flags
);
assert(hgenericDialogIcon);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the text for the EditBox
DATA STRUCTURES:
None.
INPUT:
TCHAR * - string for the EditBox
RETURN:
None.
*/
void CGenericDialog::SetText(TCHAR * tEditBoxText)
{
//assert if tEditBoxText length = 0
assert(_tcslen(tEditBoxText) > 0 && _tcslen(tEditBoxText)<1025);
_tcscpy(genericEditBoxText, tEditBoxText);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
sets the text for the EditBox
DATA STRUCTURES:
None.
INPUT:
UINT - resource ID for the editBox text
RETURN:
None.
*/
void CGenericDialog::SetText(UINT uResID)
{
TCHAR tTempEditBoxString[1024];
//get the editbox text from the resource
::LoadString(GetDfrgResHandle(), uResID, tTempEditBoxString, sizeof(tTempEditBoxString)/sizeof(TCHAR));
//assert if tTempEditBoxString length = 0
assert(_tcslen(tTempEditBoxString) > 0);
//copy button text to the button structure
_tcscpy(genericEditBoxText, tTempEditBoxString);
}
/*****************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
The Report dialog callback
INPUT:
IN HWND hWndDialog, - handle to dialog
IN UINT uMessage, - window message
IN WPARAM wParam, - message flags
IN LPARAM lParam - message flags
RETURN:
TRUE - processed message
FALSE - message not processed.
*/
BOOL CALLBACK
GenericDialogProc(
IN HWND hWndDialog,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam
)
{
switch(uMessage) {
case WM_INITDIALOG:
if(!InitializeGenericDialog(hWndDialog)) {
ExitAnalyzeDone(hWndDialog);
}
break;
case WM_CLOSE:
iKeyPressedByUser = 9999999; //make it this value so that I will not act like a zero
ExitAnalyzeDone(hWndDialog);
break;
case WM_SIZE:
break;
case WM_EXITSIZEMOVE:
ResizeDialog(hWndDialog);
break;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case ID_GENERIC_BUTTON0:
iKeyPressedByUser = 0;
ExitAnalyzeDone(hWndDialog);
break;
case ID_GENERIC_BUTTON1:
iKeyPressedByUser = 1;
ExitAnalyzeDone(hWndDialog);
break;
case ID_GENERIC_BUTTON2:
iKeyPressedByUser = 2;
ExitAnalyzeDone(hWndDialog);
break;
case ID_GENERIC_BUTTON3:
iKeyPressedByUser = 3;
ExitAnalyzeDone(hWndDialog);
break;
case ID_GENERIC_BUTTON4:
iKeyPressedByUser = 4;
ExitAnalyzeDone(hWndDialog);
break;
default:
return FALSE;
}
break;
case WM_HELP:
if(((int)((LPHELPINFO)lParam)->iCtrlId != IDC_STATIC_TEXT) && ((int)((LPHELPINFO)lParam)->iCtrlId != IDC_STATIC_TEXT2)){
EF(WinHelp ((HWND)((LPHELPINFO)lParam)->hItemHandle, genericHelpFilePath, HELP_WM_HELP, (DWORD_PTR)genericHelpIDArray));
}
break;
case WM_CONTEXTMENU:
switch(GetDlgCtrlID((HWND)wParam)){
case 0:
case IDC_STATIC_TEXT:
case IDC_STATIC_TEXT2:
break;
default:
WinHelp (hWndDialog, genericHelpFilePath, HELP_CONTEXTMENU, (DWORD_PTR)genericHelpIDArray);
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This function initializes data for the report dialog box
DATA STRUCTURES:
None.
INPUT:
hWndDialog - handle to the dialog box
RETURN:
TRUE = success
FALSE = error
*/
BOOL
InitializeGenericDialog(
IN HWND hWndDialog
)
{
RECT rDlg, rect;
HDC hDC = GetDC(hWndDialog);
ZeroMemory(&rect, sizeof(RECT));
//set the dialog box title
SetWindowText(hWndDialog, genericDialogTitle);
GetWindowRect(GetDlgItem(hWndDialog, IDC_GENERIC_EDITBOX), &rButton);
GetWindowRect(hWndDialog, &rDlg);
// set up the font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
::SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof (ncm), &ncm, 0);
ncm.lfStatusFont.lfWeight = FW_NORMAL;
hDlgFont = ::CreateFontIndirect(&ncm.lfStatusFont);
//set the font for the edit box
SendDlgItemMessage(hWndDialog, IDC_GENERIC_EDITBOX, WM_SETFONT, (WPARAM) hDlgFont, 0L);
//set the font for the buttons
SendDlgItemMessage(hWndDialog, ID_GENERIC_BUTTON0, WM_SETFONT, (WPARAM) hDlgFont, 0L);
SendDlgItemMessage(hWndDialog, ID_GENERIC_BUTTON1, WM_SETFONT, (WPARAM) hDlgFont, 0L);
SendDlgItemMessage(hWndDialog, ID_GENERIC_BUTTON2, WM_SETFONT, (WPARAM) hDlgFont, 0L);
SendDlgItemMessage(hWndDialog, ID_GENERIC_BUTTON3, WM_SETFONT, (WPARAM) hDlgFont, 0L);
SendDlgItemMessage(hWndDialog, ID_GENERIC_BUTTON4, WM_SETFONT, (WPARAM) hDlgFont, 0L);
VString dlgText;
dlgText.Empty();
dlgText += (LPCTSTR)genericEditBoxText;
wFontHeight = -ncm.lfCaptionFont.lfHeight;
rect.left = 0;
rect.right = wFontHeight * 20;
rect.top = 0;
rect.bottom = 0;
if (dlgText.GetLength()) {
DrawTextEx(hDC, dlgText.GetBuffer(), -1, &rect, DT_CALCRECT, NULL);
}
wEditBoxWidth = __max((rect.right - rect.left), (wFontHeight * 20)) ;
wEditBoxHeight = __max((rect.bottom - rect.top), (wFontHeight * (FindMaxEditboxStringHeight(dlgText) + 1)));
//check for minimum size of the edit box
m_ButtonTopBottomSpacer = wFontHeight;
m_Margin = wFontHeight;
SetButtonsandIcon(hWndDialog);
SizeButtons(hWndDialog);
// Resize the dialog box so it extends just past the
// ID_MORE button vertically. Keep the upper left
// coordinates and the width the same.
rDlg.bottom = rDlg.top + wEditBoxHeight+ (2 * m_ButtonTopBottomSpacer) +
(adjustedButtonHeight * 2) + ncm.iMenuHeight;
rDlg.right = rDlg.left + wEditBoxWidth + iconSize + 3 * m_Margin;
//calculate to final size of the dialog and adjust if necessary
UINT dialogBoxFinalWidth = rDlg.right - rDlg.left;// + 3 * m_Margin + iconSize;
UINT dialogBoxFinalHeight = rDlg.bottom - rDlg.top;
dialogBoxFinalWidth = __max(dialogBoxFinalWidth,minimumDialogWidth);
dialogBoxFinalHeight = __max(dialogBoxFinalHeight,minimumDialogHeight);
m_ButtonFloat = (dialogBoxFinalWidth - totalButtonWidth) / 2;
//move the icon
MoveWindow(GetDlgItem(hWndDialog, IDC_GENERIC_ICON), m_Margin, m_ButtonTopBottomSpacer, iconSize, iconSize, TRUE);
//resize the edit box
MoveWindow(GetDlgItem(hWndDialog, IDC_GENERIC_EDITBOX), 2 * m_Margin + iconSize, m_ButtonTopBottomSpacer, wEditBoxWidth, wEditBoxHeight, TRUE);
InvalidateRect(GetDlgItem(hWndDialog, IDC_GENERIC_EDITBOX), // handle of window with changed update region
&rDlg, // address of rectangle coordinates
TRUE // erase-background flag
);
// write the defrag recommendation
SetDlgItemText(hWndDialog, IDC_GENERIC_EDITBOX, dlgText.GetBuffer());
//resize the dialog
MoveWindow(hWndDialog, rDlg.left, rDlg.top, dialogBoxFinalWidth, dialogBoxFinalHeight, TRUE);
GetWindowRect(hWndDialog, &rDlg);
PositionButtons(hWndDialog, rDlg);
//save the original dimensions of the dialog
GetWindowRect(hWndDialog, &rcOriginalDialogSize);
ReleaseDC(hWndDialog, hDC); // handle to device context
return TRUE;
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This function deallocate resources for the report dialog
DATA STRUCTURES:
None.
INPUT:
hWndDialog - handle to the dialog box
RETURN:
None.
*/
void
ExitAnalyzeDone(
IN HWND hWndDialog
)
{
::DeleteObject(hDlgFont);
EndDialog(hWndDialog, 0);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method hides/shows the buttons on the dialog according to the values in genericButtonArray structure.
It also loads the text into the buttons from the same structure.
DATA STRUCTURES:
genericButton structure.
INPUT:
hWndDialog - handle to the dialog box
RETURN:
None.
*/
void SetButtonsandIcon(HWND hWndDialog)
{
if(!bIsIconVisible)
{
::ShowWindow(GetDlgItem(hWndDialog, IDC_GENERIC_ICON),SW_HIDE);
} else
{
GetWindowRect(GetDlgItem(hWndDialog, IDC_GENERIC_ICON), &rcIcon);
iconSize = rcIcon.right - rcIcon.left;
DrawIconOnDialog(hWndDialog);
}
if(!genericButtonArray[0].m_buttonVisible)
{
::ShowWindow(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON0),SW_HIDE);
} else
{
SetWindowText(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON0), genericButtonArray[0].m_buttonText );
}
if(!genericButtonArray[1].m_buttonVisible)
{
::ShowWindow(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON1),SW_HIDE);
}else
{
SetWindowText(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON1), genericButtonArray[1].m_buttonText );
}
if(!genericButtonArray[2].m_buttonVisible)
{
::ShowWindow(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON2),SW_HIDE);
}else
{
SetWindowText(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON2), genericButtonArray[2].m_buttonText );
}
if(!genericButtonArray[3].m_buttonVisible)
{
::ShowWindow(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON3),SW_HIDE);
}else
{
SetWindowText(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON3), genericButtonArray[3].m_buttonText );
}
if(!genericButtonArray[4].m_buttonVisible)
{
::ShowWindow(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON4),SW_HIDE);
}else
{
SetWindowText(GetDlgItem(hWndDialog, ID_GENERIC_BUTTON4), genericButtonArray[4].m_buttonText );
}
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method finds the longest string inside the VString terminated by a \n
DATA STRUCTURES:
genericButton structure.
INPUT:
VString - string in the editbox
RETURN:
Longest line in the editbox terminated by a \n.
*/
UINT FindMaxEditboxStringWidth(VString vstring)
{
int iLongestLine = 0, iEndofString = 0, iCurrentSearchLocation = 0;
iEndofString = vstring.GetLength();
if(iEndofString == 0) //oops no string return 0
{
return(0);
}
while(iCurrentSearchLocation < iEndofString)
{
iCurrentSearchLocation = vstring.Find((LPTSTR)TEXT("\n"));
if(iCurrentSearchLocation == -1) //I didnt find any more
{
if (iLongestLine == 0) {
iLongestLine = iEndofString;
}
break;
}
if(iCurrentSearchLocation > iLongestLine)
{
iLongestLine = iCurrentSearchLocation;
}
vstring = vstring.Mid(iCurrentSearchLocation+1); //sub string the original chopping off the front
iEndofString = vstring.GetLength();
iCurrentSearchLocation = 0;
}
return(iLongestLine);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method counts the number of \n inside the VString for the editbox
DATA STRUCTURES:
genericButton structure.
INPUT:
VString - editbox string
RETURN:
Number of lines in the editbox.
*/
UINT FindMaxEditboxStringHeight(VString vstring)
{
int iNumberofLines = 0, iEndofString = 0, iCurrentSearchLocation = 0;
iEndofString = vstring.GetLength();
if(iEndofString == 0) //oops no string return 0
{
return(0);
}
while(iCurrentSearchLocation < iEndofString)
{
iCurrentSearchLocation = vstring.Find((LPTSTR)TEXT("\n"));
if(iCurrentSearchLocation == -1) //I didnt find any more
{
break;
}
iNumberofLines++;
vstring = vstring.Mid(iCurrentSearchLocation+1); //sub string the original chopping off the front
iEndofString = vstring.GetLength();
iCurrentSearchLocation = 0;
}
return(++iNumberofLines); //add 1 more since the last line does not have a \n
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method resizes the buttons
DATA STRUCTURES:
genericButton structure.
INPUT:
hWndDialog - handle to the dialog box
RETURN:
None.
*/
void SizeButtons(HWND hWndDialog)
{
HDC OutputDC = GetDC(hWndDialog);
EV_ASSERT(OutputDC);
HDC WorkDC = ::CreateCompatibleDC(OutputDC);
EV_ASSERT(WorkDC);
::SelectObject(WorkDC, hDlgFont);
const bigButtonSpacer = 20;
adjustedButtonHeight = __max((UINT)(1.5 * wFontHeight), m_ButtonHeight);
//need to know the total width of the buttons before setting location
totalButtonWidth = 0;
if(genericButtonArray[0].m_buttonVisible)
{
adjustedButtonWidth0 = __max(m_ButtonSpacer + GetStringWidth(genericButtonArray[0].m_buttonText, WorkDC), m_ButtonWidth);
totalButtonWidth += adjustedButtonWidth0 + m_ButtonSpacer;
}
if(genericButtonArray[1].m_buttonVisible)
{
adjustedButtonWidth1 = __max(m_ButtonSpacer + GetStringWidth(genericButtonArray[1].m_buttonText, WorkDC), m_ButtonWidth);
totalButtonWidth += adjustedButtonWidth1 + m_ButtonSpacer;
}
if(genericButtonArray[2].m_buttonVisible)
{
adjustedButtonWidth2 = __max(m_ButtonSpacer + GetStringWidth(genericButtonArray[2].m_buttonText, WorkDC), m_ButtonWidth);
totalButtonWidth += adjustedButtonWidth2 + m_ButtonSpacer;
}
if(genericButtonArray[3].m_buttonVisible)
{
adjustedButtonWidth3 = __max(m_ButtonSpacer + GetStringWidth(genericButtonArray[3].m_buttonText, WorkDC), m_ButtonWidth);
totalButtonWidth += adjustedButtonWidth3 + m_ButtonSpacer;
}
if(genericButtonArray[4].m_buttonVisible)
{
adjustedButtonWidth4 = __max(m_ButtonSpacer + GetStringWidth(genericButtonArray[4].m_buttonText, WorkDC), m_ButtonWidth);
totalButtonWidth += adjustedButtonWidth4 + m_ButtonSpacer;
}
minimumDialogWidth = __max(minimumDialogWidth,totalButtonWidth + m_ButtonSpacer*2);
ReleaseDC(hWndDialog, OutputDC); // handle to device context
DeleteDC(WorkDC); // handle to device context
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method resizes the buttons
DATA STRUCTURES:
genericButton structure.
INPUT:
hWndDialog - handle to the dialog box
RETURN:
None.
*/
void PositionButtons(HWND hWndDialog, RECT rDlg)
{
HDC OutputDC = GetDC(hWndDialog);
EV_ASSERT(OutputDC);
HDC WorkDC = ::CreateCompatibleDC(OutputDC);
EV_ASSERT(WorkDC);
::SelectObject(WorkDC, hDlgFont);
// Calculate Button0 position and size.
if(genericButtonArray[0].m_buttonVisible)
{
rcButton0.right = rDlg.right - rDlg.left - m_ButtonFloat;
rcButton0.left = rcButton0.right - adjustedButtonWidth0;
rcButton0.bottom = rDlg.bottom - rDlg.top - (1.50 * adjustedButtonHeight);
rcButton0.top = rcButton0.bottom - adjustedButtonHeight;
PositionButton(&rcButton0,GetDlgItem(hWndDialog, ID_GENERIC_BUTTON0));
}
if(genericButtonArray[1].m_buttonVisible)
{
rcButton1.right = rcButton0.left - m_ButtonSpacer;
rcButton1.left = rcButton1.right - adjustedButtonWidth1;
rcButton1.bottom = rDlg.bottom - rDlg.top - (1.50 * adjustedButtonHeight);
rcButton1.top = rcButton1.bottom - adjustedButtonHeight;
PositionButton(&rcButton1,GetDlgItem(hWndDialog, ID_GENERIC_BUTTON1));
}
if(genericButtonArray[2].m_buttonVisible)
{
rcButton2.right = rcButton1.left - m_ButtonSpacer;
rcButton2.left = rcButton2.right - adjustedButtonWidth2;
rcButton2.bottom = rDlg.bottom - rDlg.top - (1.50 * adjustedButtonHeight);
rcButton2.top = rcButton2.bottom - adjustedButtonHeight;
PositionButton(&rcButton2,GetDlgItem(hWndDialog, ID_GENERIC_BUTTON2));
}
if(genericButtonArray[3].m_buttonVisible)
{
rcButton3.right = rcButton2.left - m_ButtonSpacer;
rcButton3.left = rcButton3.right - adjustedButtonWidth3;
rcButton3.bottom = rDlg.bottom - rDlg.top - (1.50 * adjustedButtonHeight);
rcButton3.top = rcButton3.bottom - adjustedButtonHeight;
PositionButton(&rcButton3,GetDlgItem(hWndDialog, ID_GENERIC_BUTTON3));
}
if(genericButtonArray[4].m_buttonVisible)
{
rcButton4.right = rcButton3.left - m_ButtonSpacer;
rcButton4.left = rcButton4.right - adjustedButtonWidth4;
rcButton4.bottom = rDlg.bottom - rDlg.top - (1.50 * adjustedButtonHeight);
rcButton4.top = rcButton4.bottom - adjustedButtonHeight;
PositionButton(&rcButton4,GetDlgItem(hWndDialog, ID_GENERIC_BUTTON4));
}
::DeleteDC(WorkDC);
EH_ASSERT(ReleaseDC(hWndDialog, OutputDC));
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method repositions the buttons
DATA STRUCTURES:
genericButton structure.
INPUT:
hWndDialog - handle to the dialog box
RECT - Defining the location of where the button is going
RETURN:
None.
*/
void PositionButton(RECT* prcPos, HWND hWndDialog)
{
if (hWndDialog != NULL){
MoveWindow(hWndDialog,
prcPos->left,
prcPos->top,
prcPos->right - prcPos->left,
prcPos->bottom - prcPos->top,
TRUE);
}
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method finds the longest string inside the VString terminated by a \n
DATA STRUCTURES:
genericButton structure.
INPUT:
PTCHAR - buffer that contains the string
HDC - Handle to a device context (DC) on the screen.
RETURN:
Width of the character.
*/
UINT GetStringWidth(PTCHAR stringBuf, HDC WorkDC)
{
if (!stringBuf){
return 0;
}
UINT iStringWidth = 0;
int iCharWidth;
for (UINT i=0; i<_tcslen(stringBuf); i++){
::GetCharWidth32(
WorkDC,
stringBuf[i],
stringBuf[i],
&iCharWidth);
iStringWidth += iCharWidth;
}
return iStringWidth;
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This method resizes the dialog in response to the user resizing the dialog
DATA STRUCTURES:
None.
INPUT:
None.
RETURN:
None.
*/
void ResizeDialog(HWND hWndDialog)
{
UINT dialogBoxFinalWidth;
UINT dialogBoxFinalHeight;
//get the new dimensions of the dialog
GetWindowRect(hWndDialog, &rcNewDialogSize);
if((rcNewDialogSize.bottom - rcNewDialogSize.top) < (rcOriginalDialogSize.bottom - rcOriginalDialogSize.top) ||
(rcNewDialogSize.right - rcNewDialogSize.left) < (rcOriginalDialogSize.right - rcOriginalDialogSize.left))
{
dialogBoxFinalWidth = rcOriginalDialogSize.right - rcOriginalDialogSize.left;
dialogBoxFinalHeight = rcOriginalDialogSize.bottom - rcOriginalDialogSize.top;
//set back to original size
MoveWindow(hWndDialog, rcOriginalDialogSize.left, rcOriginalDialogSize.top, dialogBoxFinalWidth, dialogBoxFinalHeight, TRUE);
return;
}
//if its not smaller, it must be bigger or the same, no matter, reposition the stuff
m_ButtonFloat = ((rcNewDialogSize.right - rcNewDialogSize.left) - totalButtonWidth) / 2;
PositionButtons(hWndDialog, rcNewDialogSize);
InvalidateRect(
hWndDialog, // handle of window with changed update region
&rcNewDialogSize, // address of rectangle coordinates
TRUE // erase-background flag
);
}
/***************************************************************************************************************
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
DESCRIPTION:
This changes the ICON for the genericdialog
DATA STRUCTURES:
None.
INPUT:
hWndDialog - handle to the dialog box
RETURN:
None.
*/
void DrawIconOnDialog(HWND hWndDialog)
{
::SendDlgItemMessage(hWndDialog, //dialog box handle
IDC_GENERIC_ICON, //icon identifier
STM_SETIMAGE, //message to send
(WPARAM) IMAGE_ICON, //image type
(LPARAM) hgenericDialogIcon // icon handle
);
}