mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1159 lines
32 KiB
1159 lines
32 KiB
/*****************************************************************************************************************
|
|
|
|
FILENAME: GenericDialog.cpp
|
|
|
|
COPYRIGHT© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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© 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
|
|
);
|
|
|
|
}
|