Windows2003-3790/inetcore/connectionwizard/icwconn1/appwnd.cpp
2020-09-30 16:53:55 +02:00

1378 lines
49 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994 **
//*********************************************************************
#include "pre.h"
#include "tutor.h"
extern HWND RunSignupWizard(HWND hWndOwner);
extern TCHAR g_szICWStatic[];
extern CICWTutorApp* g_pICWTutorApp;
#define MIN_WIZARD_WIDTH 686 // Size needed for Large fonts
#define MIN_WIZARD_HEIGHT 470 // This is the default fallback
#define MAX_BORDER_HEIGHT 30 // MAX total height of border above and
// below the wizard buttons
#define DEFAULT_TITLE_TOP 10 // Default top/left position for titles
#define DEFAULT_TITLE_LEFT 10
#include "icwextsn.h"
#include "webvwids.h" // Needed to create an instance of the ICW WebView object
INT_PTR CALLBACK SizerDlgProc
(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
return FALSE;
}
CICWApp::CICWApp
(
void
)
{
HWND hDlgSizer;
RECT rcDlg;
m_haccel = NULL;
// Use Default wizard page placement
m_iWizardTop = -1;
m_iWizardLeft = -1;
m_hTitleFont = NULL;
m_clrTitleFont = (COLORREF)GetSysColor(COLOR_WINDOWTEXT);
m_clrBusyBkGnd = (COLORREF)GetSysColor(COLOR_WINDOW);
m_hbmFirstPageBkgrnd = NULL;
hDlgSizer = CreateDialog(g_hInstance,
MAKEINTRESOURCE(IDD_PAGE_SIZER),
GetDesktopWindow(),
SizerDlgProc);
if (hDlgSizer)
{
GetClientRect(hDlgSizer, &rcDlg);
DestroyWindow(hDlgSizer);
m_wMinWizardWidth = (WORD)RECTWIDTH(rcDlg);
m_wMinWizardHeight = (WORD)RECTHEIGHT(rcDlg);
}
else
{
m_wMinWizardWidth = MIN_WIZARD_WIDTH;
m_wMinWizardHeight = MIN_WIZARD_HEIGHT;
}
}
CICWApp::~CICWApp
(
void
)
{
if (m_hTitleFont)
DeleteObject(m_hTitleFont);
if (m_hbmFirstPageBkgrnd)
DeleteObject(m_hbmFirstPageBkgrnd);
}
// Enumerator proc used to disable the children windows in the
// wizard control
BOOL CALLBACK EnumChildProc
(
HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
)
{
// We are only interested in immediate children of the wizard, but
// not the wizard page DLG, which is a child of the wizard. The
// PropSheet_GetCurrentPagehwnd will return the window handle of the
// current Wizard page, so we can compare against the windows being
// enumerated
if ((hwnd != PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages))
&& GetParent(hwnd) == (HWND)lParam)
{
// Remove the DEFPUSHBITTON style if the child has it
DWORD dwStyle = GetWindowLong(hwnd,GWL_STYLE);
SendMessage(hwnd,BM_SETSTYLE,dwStyle & (~BS_DEFPUSHBUTTON),0);
// Hide and disable the window
ShowWindow(hwnd, SW_HIDE);
EnableWindow(hwnd, FALSE);
}
return TRUE;
}
BOOL CICWApp::CreateWizardPages
(
HWND hWnd
)
{
DWORD dwStyle;
RECT rcWizardPage;
int iTop = m_iWizardTop;
int iLeft = m_iWizardLeft;
gpWizardState->cmnStateData.bOEMCustom = TRUE;
gpWizardState->cmnStateData.hWndWizardPages = RunSignupWizard(hWnd);
// Parent should control us, so the user can tab out of our property sheet
dwStyle = GetWindowLong(gpWizardState->cmnStateData.hWndWizardPages, GWL_EXSTYLE);
dwStyle = dwStyle | WS_EX_CONTROLPARENT;
SetWindowLong(gpWizardState->cmnStateData.hWndWizardPages, GWL_EXSTYLE, dwStyle);
// Disable the standard Wizard control windows
EnumChildWindows(gpWizardState->cmnStateData.hWndWizardPages,
EnumChildProc,
(LPARAM)gpWizardState->cmnStateData.hWndWizardPages);
// Get the client rectangle of the Wizard page. We will use this
// for the width and height. The top/left corner is either specified
// or computed
m_hWndFirstWizardPage = PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages);
// Update the wizard dialog position
GetWindowRect(m_hWndFirstWizardPage, &rcWizardPage);
if (-1 == iTop)
{
// Start out by allowing for the page and the buttons, going from
// the bottom up...
iTop = RECTHEIGHT(m_rcClient) -
RECTHEIGHT(rcWizardPage) -
GetButtonAreaHeight();
// If there is still room, leave a border between the buttons
// and the page
if (iTop > 0)
{
iTop -= m_iBtnBorderHeight/2;
}
// Make sure the top is not in negative space
if (iTop < 0)
iTop = 0;
}
if (-1 == iLeft)
{
if (RECTWIDTH(m_rcClient) > RECTWIDTH(rcWizardPage))
iLeft = (RECTWIDTH(m_rcClient) - RECTWIDTH(rcWizardPage)) / 2;
else
iLeft = 0;
}
MoveWindow(gpWizardState->cmnStateData.hWndWizardPages,
iLeft,
iTop,
RECTWIDTH(rcWizardPage),
RECTHEIGHT(rcWizardPage),
TRUE);
ShowWindow(gpWizardState->cmnStateData.hWndWizardPages, SW_SHOW);
return TRUE;
}
void CICWApp::DisplayHTML( void )
{
if (m_hbmFirstPageBkgrnd)
gpWizardState->pICWWebView->SetHTMLBackgroundBitmap(m_hbmFirstPageBkgrnd, &m_rcHTML);
else
gpWizardState->pICWWebView->SetHTMLBackgroundBitmap(gpWizardState->cmnStateData.hbmBkgrnd, &m_rcHTML);
gpWizardState->pICWWebView->ConnectToWindow(m_hwndHTML, PAGETYPE_BRANDED);
gpWizardState->pICWWebView->DisplayHTML(m_szOEMHTML);
// We are currently displaying the OEM HTML page
m_bOnHTMLIntro = TRUE;
}
BOOL CICWApp::InitAppHTMLWindows
(
HWND hWnd
)
{
// Co-Create the browser object
if (FAILED(CoCreateInstance(CLSID_ICWWEBVIEW,
NULL,
CLSCTX_INPROC_SERVER,
IID_IICWWebView,
(LPVOID *)&gpWizardState->pICWWebView)))
{
return FALSE;
}
m_hwndHTML = CreateWindow(TEXT("WebOC"),
NULL,
WS_VISIBLE | WS_CHILD,
m_rcHTML.left,
m_rcHTML.top,
RECTWIDTH(m_rcHTML),
RECTHEIGHT(m_rcHTML),
hWnd,
NULL,
g_hInstance,
NULL);
ASSERT(gpWizardState->pICWWebView);
DisplayHTML();
return TRUE;
}
// compute that height of the button area.
// The button area height will be the height of the largest button plus
// a border (15 pixels above and below.)
// Additionally, the overall client height - the button area must be <= 354 pixels
// which is the area required for the wizard pages in large font mode.
// We can loose the border if necessary, but we will fail if
// client height - max button is < 354. In this case this function will return -1
int CICWApp::GetButtonAreaHeight
(
void
)
{
RECT rcBtn;
int iWizHeight;
m_iBtnAreaHeight = 0;
// Go Through each button
m_BtnBack.GetClientRect(&rcBtn);
if (RECTHEIGHT(rcBtn) > m_iBtnAreaHeight)
m_iBtnAreaHeight = RECTHEIGHT(rcBtn);
m_BtnNext.GetClientRect(&rcBtn);
if (RECTHEIGHT(rcBtn) > m_iBtnAreaHeight)
m_iBtnAreaHeight = RECTHEIGHT(rcBtn);
m_BtnCancel.GetClientRect(&rcBtn);
if (RECTHEIGHT(rcBtn) > m_iBtnAreaHeight)
m_iBtnAreaHeight = RECTHEIGHT(rcBtn);
m_BtnFinish.GetClientRect(&rcBtn);
if (RECTHEIGHT(rcBtn) > m_iBtnAreaHeight)
m_iBtnAreaHeight = RECTHEIGHT(rcBtn);
m_BtnTutorial.GetClientRect(&rcBtn);
if (RECTHEIGHT(rcBtn) > m_iBtnAreaHeight)
m_iBtnAreaHeight = RECTHEIGHT(rcBtn);
// See if there is enough room for the buttons.
iWizHeight = RECTHEIGHT(m_rcClient) - m_iBtnAreaHeight;
if ( iWizHeight < m_wMinWizardHeight)
return -1;
// Compute the border height.
m_iBtnBorderHeight = iWizHeight - m_wMinWizardHeight;
if (m_iBtnBorderHeight > MAX_BORDER_HEIGHT)
m_iBtnBorderHeight = MAX_BORDER_HEIGHT;
// Add the border height to the ret value
m_iBtnAreaHeight += m_iBtnBorderHeight;
return (m_iBtnAreaHeight);
}
BOOL CICWApp::InitAppButtons
(
HWND hWnd
)
{
int iTopOfButtons;
TCHAR szButtonText[MAX_BUTTON_TITLE];
iTopOfButtons = RECTHEIGHT(m_rcClient) - GetButtonAreaHeight();
iTopOfButtons += m_iBtnBorderHeight/2;
// Setup the Back button
LoadString(g_hInstance, IDS_BACK, szButtonText, MAX_BUTTON_TITLE);
m_BtnBack.SetButtonText(szButtonText);
m_BtnBack.SetYPos(iTopOfButtons);
m_BtnBack.CreateButtonWindow(hWnd, IDC_BACK);
// Setup the Next button
LoadString(g_hInstance, IDS_NEXT, szButtonText, MAX_BUTTON_TITLE);
m_BtnNext.SetButtonText(szButtonText);
m_BtnNext.SetYPos(iTopOfButtons);
m_BtnNext.CreateButtonWindow(hWnd, IDC_NEXT);
// Setup the Cancel button
LoadString(g_hInstance, IDS_CANCEL, szButtonText, MAX_BUTTON_TITLE);
m_BtnCancel.SetButtonText(szButtonText);
m_BtnCancel.SetYPos(iTopOfButtons);
m_BtnCancel.CreateButtonWindow(hWnd, IDC_CANCEL);
// Setup the Finish button
LoadString(g_hInstance, IDS_FINISH, szButtonText, MAX_BUTTON_TITLE);
m_BtnFinish.SetButtonText(szButtonText);
m_BtnFinish.SetYPos(iTopOfButtons);
m_BtnFinish.CreateButtonWindow(hWnd, IDC_FINISH);
m_BtnFinish.Show(SW_HIDE);
m_BtnFinish.Enable(FALSE);
// Setup the Tutorial button
LoadString(g_hInstance, IDS_TUTORIAL, szButtonText, MAX_BUTTON_TITLE);
m_BtnTutorial.SetButtonText(szButtonText);
m_BtnTutorial.SetYPos(iTopOfButtons);
m_BtnTutorial.CreateButtonWindow(hWnd, IDC_TUTORIAL);
// Disable the back button by default, since we are initially on the first
// page
m_BtnBack.Enable(FALSE);
return TRUE;
}
void CICWApp::SetWizButtons
(
HWND hDlg,
LPARAM lParam
)
{
BOOL bEnabled;
bEnabled = (lParam & PSWIZB_BACK) != 0;
m_BtnBack.Enable(bEnabled);
// Enable/Disable the IDD_NEXT button, and Next gets shown by default
// bEnabled remembers whether hwndShow should be enabled or not
bEnabled = (lParam & PSWIZB_NEXT) != 0;
m_BtnNext.Show(SW_SHOW);
m_BtnNext.Enable(bEnabled);
// Hide/Disable Finish (this is the default case, and can be overridden below)
m_BtnFinish.Show(SW_HIDE);
m_BtnFinish.Enable(FALSE);
// Enable/Disable Show/Hide the IDD_FINISH button
if (lParam & (PSWIZB_FINISH | PSWIZB_DISABLEDFINISH))
{
bEnabled = (lParam & PSWIZB_FINISH) != 0;
m_BtnFinish.Show(SW_SHOW);
m_BtnFinish.Enable(bEnabled);
m_BtnNext.Show(SW_HIDE);
m_BtnNext.Enable(FALSE);
}
}
BOOL CICWApp::CheckButtonFocus
(
void
)
{
int i;
HWND hwndFocus = GetFocus();
BOOL bRet = FALSE;
const CICWButton *Btnids[5] = { &m_BtnBack,
&m_BtnNext,
&m_BtnFinish,
&m_BtnCancel,
&m_BtnTutorial };
for (i = 0; i < ARRAYSIZE(Btnids); i++)
{
if (hwndFocus == Btnids[i]->m_hWndButton)
{
bRet = TRUE;
break;
}
}
return bRet;
}
// Determine if any of the ICW buttons have focus, and cycle focus through
// appropriatly.
BOOL CICWApp::CycleButtonFocus
(
BOOL bForward
)
{
int i, x;
HWND hwndFocus = GetFocus();
BOOL bFocusSet = FALSE;
BOOL bWrapped = FALSE;
const CICWButton *Btnids[5] = { &m_BtnBack,
&m_BtnNext,
&m_BtnFinish,
&m_BtnCancel,
&m_BtnTutorial };
for (i = 0; i < ARRAYSIZE(Btnids); i++)
{
if (hwndFocus == Btnids[i]->m_hWndButton)
{
// Find the next button that can take focus starting with
// the next button in the list
if (bForward)
{
for (x = i + 1; x < ARRAYSIZE(Btnids); x++)
{
if ((GetWindowLong(Btnids[x]->m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(Btnids[x]->m_hWndButton))
{
SetFocus(Btnids[x]->m_hWndButton);
bFocusSet = TRUE;
break;
}
}
if (!bFocusSet)
{
// Wrap around to the the beginning of the button order
bWrapped = TRUE;
for (x = 0; x < i; x++)
{
if ((GetWindowLong(Btnids[x]->m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(Btnids[x]->m_hWndButton))
{
bFocusSet = TRUE;
SetFocus(Btnids[x]->m_hWndButton);
break;
}
}
}
}
else
{
for (x = i - 1; x >= 0; x--)
{
if ((GetWindowLong(Btnids[x]->m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(Btnids[x]->m_hWndButton))
{
SetFocus(Btnids[x]->m_hWndButton);
bFocusSet = TRUE;
break;
}
}
if (!bFocusSet)
{
bWrapped = TRUE;
// Wrap around to the the end of the button order
for (x = ARRAYSIZE(Btnids) - 1; x > i; x--)
{
if ((GetWindowLong(Btnids[x]->m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(Btnids[x]->m_hWndButton))
{
bFocusSet = TRUE;
SetFocus(Btnids[x]->m_hWndButton);
break;
}
}
}
}
}
}
// If focus is not on the buttons, and was not set, then set it to the first/last
// button
if (!bFocusSet)
{
if (bForward)
{
// Start at the beginning
for (x = 0; x < ARRAYSIZE(Btnids); x++)
{
if ((GetWindowLong(Btnids[x]->m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(Btnids[x]->m_hWndButton))
{
SetFocus(Btnids[x]->m_hWndButton);
break;
}
}
}
else
{
// Start at the beginning
for (x = ARRAYSIZE(Btnids) - 1; x >= 0; x--)
{
if ((GetWindowLong(Btnids[x]->m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(Btnids[x]->m_hWndButton))
{
SetFocus(Btnids[x]->m_hWndButton);
break;
}
}
}
}
return bWrapped;
}
BOOL CICWApp::InitWizAppWindow
(
HWND hWnd
)
{
if (!InitAppHTMLWindows(hWnd))
return FALSE;
if (!InitAppButtons(hWnd))
return FALSE;
// Setup the window that will display the page titles
m_hwndTitle = CreateWindow(g_szICWStatic,
NULL,
WS_VISIBLE | WS_CHILD,
m_rcTitle.left,
m_rcTitle.top,
RECTWIDTH(m_rcTitle),
RECTHEIGHT(m_rcTitle),
hWnd,
NULL,
g_hInstance,
NULL);
if (NULL == m_hwndTitle)
return FALSE;
SendMessage(m_hwndTitle, WM_SETFONT, (WPARAM)m_hTitleFont, 0l);
ShowWindow(m_hwndTitle, SW_HIDE);
return TRUE;
}
HWND GetControl
(
int iCtlId
)
{
HWND hWndCtrl = NULL;
// We should never call GetControl unless we translate a wizard page accelerator
// which implies that hWndWizardPages must be set
Assert(gpWizardState->cmnStateData.hWndWizardPages);
HWND hWndPage = PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages);
hWndCtrl = GetDlgItem(hWndPage, iCtlId);
// If the control exist, but is not visible, or not enabled, then return NULL
if (hWndCtrl &&
(!(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_VISIBLE) ||
!IsWindowEnabled(hWndCtrl)))
{
hWndCtrl = NULL;
}
return hWndCtrl;
}
#define MAX_CHILDREN 100 // Reasonable number of children to search
HWND GetNestedControl
(
int iCtlId
)
{
HWND hWndCtrl = NULL;
WORD wCnt = 0;
// We should never call GetControl unless we translate a wizard page accelerator
// which implies that hWndWizardPages must be set
Assert(gpWizardState->cmnStateData.hWndWizardPages);
HWND hWndPage = PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages);
HWND hWndNested = GetWindow(hWndPage, GW_CHILD);
// Search for the child window of the current page that contains the
// dialog controls
do
{
wCnt++; // Prevent infinite looping.
if (NULL != (hWndCtrl = GetDlgItem(hWndNested, iCtlId)))
break; // Found it!!!
}while ((wCnt < MAX_CHILDREN) &&
(NULL != (hWndNested = GetWindow(hWndNested, GW_HWNDNEXT))));
// If the control exist, but is not visible, or not enabled, then return NULL
if (hWndCtrl &&
(!(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_VISIBLE) ||
!IsWindowEnabled(hWndCtrl)))
{
hWndCtrl = NULL;
}
return hWndCtrl;
}
LRESULT CALLBACK CICWApp::ICWAppWndProc
(
HWND hWnd,
UINT uMessage,
WPARAM wParam,
LPARAM lParam
)
{
LPCREATESTRUCT lpcs;
LRESULT lRet = 0l;
CICWApp *pICWApp = (CICWApp *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
HICON hIcon;
switch (uMessage)
{
case WM_CREATE:
lpcs = (LPCREATESTRUCT) lParam;
// Get the Class instance pointer for this window
pICWApp = (CICWApp *) lpcs->lpCreateParams;
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pICWApp);
if (!pICWApp->InitWizAppWindow(hWnd))
lRet = -1;
hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICWCONN1_ICON));
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
break;
case WM_CTLCOLORBTN:
case WM_CTLCOLORSTATIC:
{
// See if the control is an ES_READONLY style edit box, and if
// so then don't make it transparent
if (!(GetWindowLong((HWND)lParam, GWL_STYLE) & ES_READONLY))
{
HDC hdc = (HDC)wParam;
// If this is the animation control, then set the color to the
// animation control solid color
if (ID_BUSY_ANIMATION_WINDOW == GetWindowLong((HWND)lParam, GWL_ID))
{
SetBkColor(hdc, pICWApp->m_clrBusyBkGnd);
}
SetBkMode(hdc, TRANSPARENT);
lRet = (LRESULT) GetStockObject(NULL_BRUSH);
// If this is the Title control, set the color
if ( pICWApp->m_hwndTitle == (HWND)lParam)
{
SetTextColor(hdc, pICWApp->m_clrTitleFont);
}
}
break;
}
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
CICWButton *pBtn;
POINT pt;
pt.x = lpdis->rcItem.left;
pt.y = lpdis->rcItem.top;
switch (wParam)
{
case IDC_BACK:
pBtn = &pICWApp->m_BtnBack;
break;
case IDC_NEXT:
pBtn = &pICWApp->m_BtnNext;
break;
case IDC_FINISH:
pBtn = &pICWApp->m_BtnFinish;
break;
case IDC_CANCEL:
pBtn = &pICWApp->m_BtnCancel;
break;
case IDC_TUTORIAL:
pBtn = &pICWApp->m_BtnTutorial;
break;
}
pBtn->DrawButton(lpdis->hDC,
lpdis->itemState,
&pt);
break;
}
case WM_ERASEBKGND:
{
// Fill in the App Window's update rect with the background bitmap
FillWindowWithAppBackground(hWnd, (HDC)wParam);
lRet = 1L;
break;
}
case WM_CLOSE:
{
if (MsgBox(hWnd,IDS_QUERYCANCEL,
MB_ICONQUESTION,MB_YESNO |
MB_DEFBUTTON2) == IDYES)
{
DestroyWindow(hWnd);
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
// Set the wizard page title
case WUM_SETTITLE:
{
TCHAR szTitle[MAX_RES_LEN];
if (wParam)
{
LoadString((HINSTANCE)wParam, LOWORD(lParam), szTitle, MAX_RES_LEN);
SetWindowText(pICWApp->m_hwndTitle, szTitle);
}
else
{
SetWindowText(pICWApp->m_hwndTitle, (LPTSTR)lParam);
}
break;
}
case WM_COMMAND:
{
int iCtlId = GET_WM_COMMAND_ID(wParam, lParam);
HWND hWndCtrl;
switch (iCtlId)
{
case IDC_BACK:
if ((GetWindowLong(pICWApp->m_BtnBack.m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(pICWApp->m_BtnBack.m_hWndButton))
{
if (pICWApp->m_hWndFirstWizardPage == PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages))
{
// Hide the wizard pages
ShowWindow(gpWizardState->cmnStateData.hWndWizardPages, SW_HIDE);
ShowWindow(pICWApp->m_hwndTitle, SW_HIDE);
// Show and re-display the HTML page
pICWApp->DisplayHTML();
ShowWindow(pICWApp->m_hwndHTML, SW_SHOW);
pICWApp->m_bOnHTMLIntro = TRUE;
// Show the tutorial button
pICWApp->m_BtnTutorial.Show(SW_SHOW);
pICWApp->m_BtnTutorial.Enable(TRUE);
// Disable the Back button
pICWApp->m_BtnBack.Enable(FALSE);
}
else
{
// Go to the previous page
PropSheet_PressButton(gpWizardState->cmnStateData.hWndWizardPages,PSBTN_BACK);
}
}
else
{
MessageBeep(0);
}
break;
case IDC_NEXT:
if ((GetWindowLong(pICWApp->m_BtnNext.m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(pICWApp->m_BtnNext.m_hWndButton))
{
if (pICWApp->m_bOnHTMLIntro)
{
// Hide the HTML window
ShowWindow(pICWApp->m_hwndHTML, SW_HIDE);
pICWApp->m_bOnHTMLIntro = FALSE;
// Hide the tutorial button
pICWApp->m_BtnTutorial.Show(SW_HIDE);
pICWApp->m_BtnTutorial.Enable(FALSE);
// Show the Title window
ShowWindow(pICWApp->m_hwndTitle, SW_SHOW);
// Create and Show, or just show the Wizard pages
if (!gpWizardState->cmnStateData.hWndWizardPages)
pICWApp->CreateWizardPages(hWnd);
else
ShowWindow(gpWizardState->cmnStateData.hWndWizardPages, SW_SHOW);
// Enable the Back button
pICWApp->m_BtnBack.Enable(TRUE);
}
else
{
// Go to the Next page
PropSheet_PressButton(gpWizardState->cmnStateData.hWndWizardPages,PSBTN_NEXT);
}
}
else
{
MessageBeep(0);
}
break;
case IDC_FINISH:
if ((GetWindowLong(pICWApp->m_BtnFinish.m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(pICWApp->m_BtnFinish.m_hWndButton))
{
if (pICWApp->m_bOnHTMLIntro)
{
DestroyWindow(hWnd);
}
else
{
// Go to the Next page
PropSheet_PressButton(gpWizardState->cmnStateData.hWndWizardPages,PSBTN_FINISH);
}
}
else
{
MessageBeep(0);
}
break;
case IDC_CANCEL:
if ((GetWindowLong(pICWApp->m_BtnCancel.m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(pICWApp->m_BtnCancel.m_hWndButton))
{
if (pICWApp->m_bOnHTMLIntro)
{
if (MsgBox(hWnd,IDS_QUERYCANCEL,
MB_ICONQUESTION,MB_YESNO |
MB_DEFBUTTON2) == IDYES)
{
DestroyWindow(hWnd);
}
}
else
{
PropSheet_PressButton(gpWizardState->cmnStateData.hWndWizardPages,PSBTN_CANCEL);
}
}
else
{
MessageBeep(0);
}
break;
#ifndef ICWDEBUG
case IDC_TUTORIAL:
{
// If the Tutorial button is enabled/Visible then run
// the tutorial
if ((GetWindowLong(pICWApp->m_BtnTutorial.m_hWndButton, GWL_STYLE) & WS_VISIBLE) &&
IsWindowEnabled(pICWApp->m_BtnTutorial.m_hWndButton))
{
g_pICWTutorApp->LaunchTutorApp();
}
else
{
MessageBeep(0);
}
break;
}
#endif
case ID_NEXT_FIELD:
{
if (pICWApp->m_bOnHTMLIntro)
{
pICWApp->CycleButtonFocus(TRUE);
}
else
{
HWND hWndFocus = GetFocus();
HWND hWndTabItem;
HWND hWndFirstTabItem;
HWND hWndPage = PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages);
BOOL bButtonsHaveFocus = pICWApp->CheckButtonFocus();
hWndFirstTabItem = GetNextDlgTabItem(hWndPage,
NULL,
FALSE);
// If we are on the last item in the tab order, cycle
// focus to the buttons
hWndTabItem = GetNextDlgTabItem(hWndPage, hWndFirstTabItem, TRUE);
if ((hWndFocus == hWndTabItem) ||
IsChild(hWndTabItem, hWndFocus))
{
pICWApp->CycleButtonFocus(TRUE);
}
else
{
if (bButtonsHaveFocus)
{
// Cycle the button focus. If the focus
// wraps, this function will fail
if (pICWApp->CycleButtonFocus(TRUE))
{
// Set focus to the First item in the tab order
SetFocus(hWndFirstTabItem);
}
}
else
{
// Set focus to the next item in the tab order
SetFocus(GetNextDlgTabItem(hWndPage,
hWndFocus,
FALSE));
}
}
}
break;
}
case ID_PREV_FIELD:
if (pICWApp->m_bOnHTMLIntro)
{
pICWApp->CycleButtonFocus(FALSE);
}
else
{
HWND hWndFocus = GetFocus();
HWND hWndFirstTabItem;
HWND hWndPage = PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages);
BOOL bButtonsHaveFocus = pICWApp->CheckButtonFocus();
hWndFirstTabItem = GetNextDlgTabItem(hWndPage,
NULL,
FALSE);
// If we are on the first item in the tab order, cycle
// focus to the buttons
if ((hWndFocus == hWndFirstTabItem) ||
IsChild(hWndFirstTabItem, hWndFocus))
{
pICWApp->CycleButtonFocus(FALSE);
}
else
{
if (bButtonsHaveFocus)
{
// Cycle the button focus. If the focus
// wraps, this function will fail
if (pICWApp->CycleButtonFocus(FALSE))
{
// Set focus to the last item in the tab order
SetFocus(GetNextDlgTabItem(hWndPage, hWndFirstTabItem, TRUE));
}
}
else
{
// Set focus to the prev item in the tab order
SetFocus(GetNextDlgTabItem(hWndPage,
hWndFocus,
TRUE));
}
}
}
break;
// Radio button group
case IDC_RUNNEW:
case IDC_RUNAUTO:
case IDC_ICWMAN:
{
if (NULL != (hWndCtrl = GetControl(iCtlId)))
{
CheckRadioButton(PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages),
IDC_RUNNEW,
IDC_ICWMAN,
iCtlId);
SetFocus(hWndCtrl);
}
else
{
MessageBeep(0);
}
break;
}
// Check box. Needs to be toggled
case IDC_CHECK_BROWSING:
if (NULL != (hWndCtrl = GetControl(iCtlId)))
{
// Toggle the button check state
if (BST_CHECKED == Button_GetCheck(hWndCtrl))
Button_SetCheck(hWndCtrl, BST_UNCHECKED);
else
Button_SetCheck(hWndCtrl, BST_CHECKED);
SetFocus(hWndCtrl);
}
else
MessageBeep(0);
break;
// Pushbutton type controls
case IDC_OEMOFFER_MORE:
case IDC_DIALERR_PROPERTIES:
case IDC_ISPDATA_TOSSAVE:
case IDC_CHANGE_NUMBER:
case IDC_DIALING_PROPERTIES:
case IDC_DIAL_HELP:
if (NULL != (hWndCtrl = GetControl(iCtlId)))
{
HWND hWndFocus = GetFocus();
SendMessage(hWndCtrl, BM_CLICK, 0, 0l);
SetFocus(hWndFocus);
}
else
MessageBeep(0);
break;
// Edit Text and drop down controls. Need to be selected and focused
case IDC_DIAL_FROM:
case IDC_DIALERR_PHONENUMBER:
case IDC_DIALERR_MODEM:
case IDC_BILLINGOPT_HTML:
case IDC_PAYMENTTYPE:
case IDC_ISPMARKETING:
case IDC_ISPLIST:
if (NULL != (hWndCtrl = GetControl(iCtlId)))
{
Edit_SetSel(hWndCtrl, 0, -1);
SetFocus(hWndCtrl);
}
else
MessageBeep(0);
break;
// Nested controls
case IDC_USERINFO_FIRSTNAME:
case IDC_USERINFO_LASTNAME:
case IDC_USERINFO_COMPANYNAME:
case IDC_USERINFO_ADDRESS1:
case IDC_USERINFO_ADDRESS2:
case IDC_USERINFO_CITY:
case IDC_USERINFO_STATE:
case IDC_USERINFO_ZIP:
case IDC_USERINFO_PHONE:
case IDC_USERINFO_FE_NAME:
case IDC_PAYMENT_CCNUMBER:
case IDC_PAYMENT_EXPIREMONTH:
case IDC_PAYMENT_EXPIREYEAR:
case IDC_PAYMENT_CCNAME:
case IDC_PAYMENT_CCADDRESS:
case IDC_PAYMENT_CCZIP:
case IDC_PAYMENT_IVADDRESS1:
case IDC_PAYMENT_IVADDRESS2:
case IDC_PAYMENT_IVCITY:
case IDC_PAYMENT_IVSTATE:
case IDC_PAYMENT_IVZIP:
case IDC_PAYMENT_PHONEIV_BILLNAME:
case IDC_PAYMENT_PHONEIV_ACCNUM:
if (NULL != (hWndCtrl = GetNestedControl(iCtlId)))
{
Edit_SetSel(hWndCtrl, 0, -1);
SetFocus(hWndCtrl);
}
else
MessageBeep(0);
break;
// Radio button select group
case IDC_ISPDATA_TOSACCEPT:
case IDC_ISPDATA_TOSDECLINE:
if (NULL != (hWndCtrl = GetControl(iCtlId)))
{
CheckRadioButton(PropSheet_GetCurrentPageHwnd(gpWizardState->cmnStateData.hWndWizardPages),
IDC_ISPDATA_TOSACCEPT,
IDC_ISPDATA_TOSDECLINE,
iCtlId);
// simulate a button click, so the right WM_COMMAND
// gets to the isppage proc
SendMessage(hWndCtrl, BM_CLICK, 0, 0l);
SetFocus(hWndCtrl);
}
else
{
MessageBeep(0);
}
break;
default:
break;
}
lRet = 1L;
break;
} // WM_COMMAND
default:
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
return lRet;
}
void CICWApp::CenterWindow
(
void
)
{
RECT rcScreen; // Screen rect
RECT rcApp; // window rect
int nLeft, nTop; // Top-left coordinates
// Get frame window client rect in screen coordinates
rcScreen.top = rcScreen.left = 0;
rcScreen.right = GetSystemMetrics(SM_CXFULLSCREEN);
rcScreen.bottom = GetSystemMetrics(SM_CYFULLSCREEN);
// Determine the top-left point for the window to be centered
GetWindowRect(m_hWndApp, &rcApp);
nLeft = rcScreen.left + ((RECTWIDTH(rcScreen) - RECTWIDTH(rcApp)) / 2);
nTop = rcScreen.top + ((RECTHEIGHT(rcScreen) - RECTHEIGHT(rcApp)) / 2);
if (nLeft < 0)
nLeft = 0;
if (nTop < 0)
nTop = 0;
// Place the dialog
MoveWindow(m_hWndApp, nLeft, nTop, RECTWIDTH(rcApp), RECTHEIGHT(rcApp), TRUE);
return;
}
HRESULT CICWApp::Initialize
(
void
)
{
HRESULT hr = S_OK;
// Create the Application Window
WNDCLASSEX wc;
//Register the Application window class
ZeroMemory (&wc, sizeof(WNDCLASSEX));
wc.style = CS_GLOBALCLASS;
wc.cbSize = sizeof(wc);
wc.lpszClassName = TEXT("ICWApp");
wc.hInstance = g_hInstance;
wc.lpfnWndProc = ICWAppWndProc;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
RegisterClassEx (&wc);
// Compute the HTML rectangle area based on the OEM customizations
// that have been previously applied
m_rcHTML.left = 0;
m_rcHTML.top = 0;
m_rcHTML.right = m_rcClient.right;
m_rcHTML.bottom = m_rcClient.bottom - m_iBtnAreaHeight;
// Load the accelerator table
m_haccel = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDA_ACCEL));
// Create the Application Window
m_hWndApp = CreateWindow( TEXT("ICWApp"),
m_szAppTitle,
WS_BORDER | WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT,
CW_USEDEFAULT,
RECTWIDTH(m_rcClient) +
2*GetSystemMetrics(SM_CXFIXEDFRAME),
RECTHEIGHT(m_rcClient) +
GetSystemMetrics(SM_CYCAPTION) +
2*GetSystemMetrics(SM_CYFIXEDFRAME),
NULL,
NULL,
g_hInstance,
(LPVOID) this);
if (m_hWndApp)
{
gpWizardState->cmnStateData.hWndApp = m_hWndApp;
// Center the Window
CenterWindow();
// Show the window and paint its contents.
ShowWindow(m_hWndApp, SW_SHOW);
UpdateWindow(m_hWndApp);
}
else
{
hr = E_FAIL;
}
return hr;
}
HRESULT CICWApp::SetBackgroundBitmap
(
LPTSTR lpszBkgrndBmp
)
{
BITMAP bmInfo;
HRESULT hr = E_FAIL;
// Load the Background Bitmap
if (NULL != (gpWizardState->cmnStateData.hbmBkgrnd = (HBITMAP)LoadImage(g_hInstance,
lpszBkgrndBmp,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE)))
{
GetObject(gpWizardState->cmnStateData.hbmBkgrnd, sizeof(BITMAP), (LPVOID) &bmInfo);
// Compute some usefull Rectangles.
// The client will be the size of the background bitmap
m_rcClient.left = 0;
m_rcClient.top = 0;
m_rcClient.right = bmInfo.bmWidth;
m_rcClient.bottom = bmInfo.bmHeight;
hr = S_OK;
}
return hr;
}
HRESULT CICWApp::SetFirstPageBackgroundBitmap
(
LPTSTR lpszBkgrndBmp
)
{
BITMAP bmInfo;
HRESULT hr = E_FAIL;
// Load the Background Bitmap
if (NULL != (m_hbmFirstPageBkgrnd = (HBITMAP)LoadImage(g_hInstance,
lpszBkgrndBmp,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE)))
{
GetObject(m_hbmFirstPageBkgrnd, sizeof(BITMAP), (LPVOID) &bmInfo);
// Make sure the bitmap is the same size as the main one
if ((RECTWIDTH(m_rcClient) == bmInfo.bmWidth) &&
(RECTHEIGHT(m_rcClient) == bmInfo.bmHeight))
{
hr = S_OK;
}
}
return hr;
}
HRESULT CICWApp::SetTitleParams
(
int iTitleTop,
int iTitleLeft,
LPTSTR lpszFontFace,
long lFontPts,
long lFontWeight,
COLORREF clrFont
)
{
LOGFONT lfTitle;
HFONT hOldFont;
TEXTMETRIC tm;
HDC hdc;
// Fill in the log font for the title
lfTitle.lfHeight = -MulDiv(lFontPts, GetDeviceCaps(GetDC(NULL), LOGPIXELSY), 72);
lfTitle.lfWidth = 0;
lfTitle.lfEscapement = 0;
lfTitle.lfOrientation = 0;
lfTitle.lfWeight = lFontWeight;
lfTitle.lfItalic = FALSE;
lfTitle.lfUnderline = FALSE;
lfTitle.lfStrikeOut = FALSE;
lfTitle.lfCharSet = DEFAULT_CHARSET;
lfTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
lfTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lfTitle.lfQuality = DEFAULT_QUALITY;
lfTitle.lfPitchAndFamily = VARIABLE_PITCH | FF_DONTCARE;
lstrcpy(lfTitle.lfFaceName, lpszFontFace);
if (NULL == (m_hTitleFont = CreateFontIndirect(&lfTitle)))
return E_FAIL;
// Compute the area for the title
if (-1 != iTitleTop)
m_rcTitle.top = iTitleTop;
else
m_rcTitle.top = DEFAULT_TITLE_TOP;
if (-1 != iTitleLeft)
m_rcTitle.left = iTitleLeft;
else
m_rcTitle.left = DEFAULT_TITLE_LEFT;
// The right side will be the width of the client, minus the left border
m_rcTitle.right = RECTWIDTH(m_rcClient) - m_rcTitle.left;
// The bottom will be the top plus the char height for the font
if (NULL != (hdc = GetDC(NULL)))
{
hOldFont = (HFONT)SelectObject(hdc, m_hTitleFont);
GetTextMetrics(hdc, &tm);
SelectObject(hdc, hOldFont);
ReleaseDC(NULL, hdc);
}
else
{
return E_FAIL;
}
m_rcTitle.bottom = m_rcTitle.top + tm.tmHeight;
// Set the font color
m_clrTitleFont = clrFont;
return S_OK;
}
HRESULT CICWApp::SetWizardWindowTop
(
int iTop
)
{
m_iWizardTop = iTop;
// If default positioning is not selected, then ensure the ICW wizard
// page will fit
if (-1 != iTop)
{
if ((m_iWizardTop + m_wMinWizardHeight) > (RECTHEIGHT(m_rcClient) - m_iBtnAreaHeight))
return E_FAIL;
}
return S_OK;
}
HRESULT CICWApp::SetWizardWindowLeft
(
int iLeft
)
{
m_iWizardLeft = iLeft;
if (-1 != iLeft)
{
if ((iLeft + m_wMinWizardWidth) > RECTWIDTH(m_rcClient))
return E_FAIL;
}
return S_OK;
}