484 lines
11 KiB
C++
484 lines
11 KiB
C++
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1994 - 1998.
|
||
|
//
|
||
|
// File: password.cxx
|
||
|
//
|
||
|
// Contents: Implementation of class used to prompt user for credentials.
|
||
|
//
|
||
|
// Classes: CMessageDlg
|
||
|
//
|
||
|
// History: 06-28-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#include "headers.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
inline LONG
|
||
|
WindowRectWidth(
|
||
|
const RECT &rc)
|
||
|
{
|
||
|
return rc.right - rc.left;
|
||
|
}
|
||
|
|
||
|
|
||
|
inline LONG
|
||
|
WindowRectHeight(
|
||
|
const RECT &rc)
|
||
|
{
|
||
|
return rc.bottom - rc.top;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: PopupMessage
|
||
|
//
|
||
|
// Synopsis: Invoke a modal dialog to display a formatted message string.
|
||
|
//
|
||
|
// Arguments: [idsMessage] - resource id of printf style format string
|
||
|
// [...] - arguments required for string
|
||
|
//
|
||
|
// History: 07-06-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
void
|
||
|
PopupMessage(
|
||
|
ULONG idsMessage,
|
||
|
...)
|
||
|
{
|
||
|
va_list valArgs;
|
||
|
va_start(valArgs, idsMessage);
|
||
|
|
||
|
CMessageDlg MessageDlg;
|
||
|
|
||
|
MessageDlg.DoModalDialog(NULL,
|
||
|
IDI_ERROR,
|
||
|
NULL,
|
||
|
0,
|
||
|
0,
|
||
|
idsMessage,
|
||
|
valArgs);
|
||
|
va_end(valArgs);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: PopupMessageEx
|
||
|
//
|
||
|
// Synopsis: Invoke a modal dialog to display a formatted message string.
|
||
|
//
|
||
|
// Arguments: [idIcon] - resource identifier of system icon
|
||
|
// [idsMessage] - resource id of printf style format string
|
||
|
// [...] - arguments required for string
|
||
|
//
|
||
|
// History: 07-06-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
void
|
||
|
PopupMessageEx(
|
||
|
PCWSTR idIcon,
|
||
|
ULONG idsMessage,
|
||
|
...)
|
||
|
{
|
||
|
va_list valArgs;
|
||
|
va_start(valArgs, idsMessage);
|
||
|
|
||
|
CMessageDlg MessageDlg;
|
||
|
|
||
|
MessageDlg.DoModalDialog(NULL,
|
||
|
idIcon,
|
||
|
NULL,
|
||
|
0,
|
||
|
0,
|
||
|
idsMessage,
|
||
|
valArgs);
|
||
|
va_end(valArgs);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: PopupMessageAndCode
|
||
|
//
|
||
|
// Synopsis: Invoke a modal dialog to display a formatted message string
|
||
|
// and error code.
|
||
|
//
|
||
|
// Arguments: [pwzFileName] - error code's file name
|
||
|
// [ulLineNo] - error code's line number
|
||
|
// [hr] - error code's HRESULT
|
||
|
// [idsMessage] - resource id of printf style format string
|
||
|
// [...] - arguments required for string
|
||
|
//
|
||
|
// History: 07-06-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
void
|
||
|
PopupMessageAndCode(
|
||
|
PCWSTR pwzFileName,
|
||
|
ULONG ulLineNo,
|
||
|
HRESULT hr,
|
||
|
ULONG idsMessage,
|
||
|
...)
|
||
|
{
|
||
|
va_list valArgs;
|
||
|
va_start(valArgs, idsMessage);
|
||
|
|
||
|
CMessageDlg MessageDlg;
|
||
|
|
||
|
MessageDlg.DoModalDialog(NULL,
|
||
|
IDI_ERROR,
|
||
|
pwzFileName,
|
||
|
ulLineNo,
|
||
|
hr,
|
||
|
idsMessage,
|
||
|
valArgs);
|
||
|
va_end(valArgs);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: LoadStr
|
||
|
//
|
||
|
// Synopsis: Load string with resource id [ids] into buffer [wszBuf],
|
||
|
// which is of size [cchBuf] characters.
|
||
|
//
|
||
|
// Arguments: [ids] - string to load
|
||
|
// [wszBuf] - buffer for string
|
||
|
// [cchBuf] - size of buffer
|
||
|
// [wszDefault] - NULL or string to use if load fails
|
||
|
//
|
||
|
// Returns: S_OK or error from LoadString
|
||
|
//
|
||
|
// Modifies: *[wszBuf]
|
||
|
//
|
||
|
// History: 12-11-1996 DavidMun Created
|
||
|
//
|
||
|
// Notes: If the load fails and no default is supplied, [wszBuf] is
|
||
|
// set to an empty string.
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
HRESULT
|
||
|
LoadStr(
|
||
|
ULONG ids,
|
||
|
LPWSTR wszBuf,
|
||
|
ULONG cchBuf,
|
||
|
LPCWSTR wszDefault)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
ULONG cchLoaded;
|
||
|
|
||
|
cchLoaded = LoadString(GetModuleHandle(NULL), ids, wszBuf, cchBuf);
|
||
|
|
||
|
if (!cchLoaded)
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
|
||
|
if (wszDefault)
|
||
|
{
|
||
|
lstrcpyn(wszBuf, wszDefault, cchBuf);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*wszBuf = L'\0';
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMessageDlg::DoModalDialog
|
||
|
//
|
||
|
// Synopsis: Invoke a modal dialog to display a message.
|
||
|
//
|
||
|
// Arguments: [hinstIcon] - NULL or module handle where icon lives
|
||
|
// [idIcon] - resource identifier of icon to display
|
||
|
// [pwzFile] - error code's file name
|
||
|
// [ulLine] - error code's line number
|
||
|
// [ulErrorCode] - error code's error value
|
||
|
// [idsMessage] - resource id of printf style format string
|
||
|
// [valArgs] - arguments required for string
|
||
|
//
|
||
|
// Returns: HRESULT
|
||
|
//
|
||
|
// History: 07-06-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
INT_PTR
|
||
|
CMessageDlg::DoModalDialog(
|
||
|
HINSTANCE hinstIcon,
|
||
|
PCWSTR idIcon,
|
||
|
PCWSTR pwzFile,
|
||
|
ULONG ulLine,
|
||
|
ULONG ulErrorCode,
|
||
|
ULONG idsMessage,
|
||
|
va_list valArgs)
|
||
|
{
|
||
|
|
||
|
m_hinstIcon = hinstIcon;
|
||
|
m_idIcon = idIcon;
|
||
|
|
||
|
if (pwzFile)
|
||
|
{
|
||
|
wsprintf(m_wzErrorCode, L"%ws %u %x", pwzFile, ulLine, ulErrorCode);
|
||
|
}
|
||
|
|
||
|
WCHAR wzMessageFmt[MAX_PATH];
|
||
|
LoadStr(idsMessage, wzMessageFmt, MAX_PATH, L"");
|
||
|
|
||
|
PWSTR pwzTemp = NULL;
|
||
|
|
||
|
ULONG ulResult;
|
||
|
|
||
|
ulResult = FormatMessageW(FORMAT_MESSAGE_FROM_STRING
|
||
|
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
||
|
wzMessageFmt,
|
||
|
0,
|
||
|
0,
|
||
|
(LPWSTR) &pwzTemp,
|
||
|
0,
|
||
|
&valArgs);
|
||
|
|
||
|
if (ulResult)
|
||
|
{
|
||
|
m_pwzMessage = new WCHAR[lstrlen(pwzTemp) + 1];
|
||
|
lstrcpy(m_pwzMessage, pwzTemp);
|
||
|
LocalFree(pwzTemp);
|
||
|
}
|
||
|
|
||
|
return _DoModalDlg(NULL, IDD_ERROR);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMessageDlg::_OnInit
|
||
|
//
|
||
|
// Synopsis: Initialize dialog controls
|
||
|
//
|
||
|
// Arguments: [pfSetFocus] - unused
|
||
|
//
|
||
|
// Returns: S_OK
|
||
|
//
|
||
|
// History: 06-28-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
HRESULT
|
||
|
CMessageDlg::_OnInit(
|
||
|
bool *pfSetFocus)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// The error dialog has these components:
|
||
|
//
|
||
|
// 1. caption
|
||
|
// 2. icon
|
||
|
// 3. error message
|
||
|
// 4. error code
|
||
|
//
|
||
|
// The last is optional.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Set the icon.
|
||
|
//
|
||
|
|
||
|
HICON hIcon = LoadIcon(m_hinstIcon, m_idIcon);
|
||
|
|
||
|
if (hIcon)
|
||
|
{
|
||
|
SendDlgItemMessage(m_hwnd,
|
||
|
IDC_POPUP_MSG_ICON,
|
||
|
STM_SETICON,
|
||
|
(WPARAM)hIcon,
|
||
|
0L);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set the error message static
|
||
|
//
|
||
|
|
||
|
Static_SetText(_hCtrl(IDC_ERRORMSG), m_pwzMessage);
|
||
|
|
||
|
//
|
||
|
// If there is an error code string, set it, otherwise hide
|
||
|
// the edit control and its label and resize the dialog to
|
||
|
// eliminate the empty space.
|
||
|
//
|
||
|
|
||
|
if (*m_wzErrorCode)
|
||
|
{
|
||
|
Static_SetText(_hCtrl(IDC_ERROR_CODE_EDIT), m_wzErrorCode);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnableWindow(_hCtrl(IDC_ERROR_CODE_LBL), false);
|
||
|
EnableWindow(_hCtrl(IDC_ERROR_CODE_EDIT), false);
|
||
|
ShowWindow(_hCtrl(IDC_ERROR_CODE_LBL), SW_HIDE);
|
||
|
ShowWindow(_hCtrl(IDC_ERROR_CODE_EDIT), SW_HIDE);
|
||
|
|
||
|
RECT rcClose;
|
||
|
RECT rcEdit;
|
||
|
|
||
|
_GetChildWindowRect(_hCtrl(IDCANCEL), &rcClose);
|
||
|
_GetChildWindowRect(_hCtrl(IDC_ERROR_CODE_EDIT), &rcEdit);
|
||
|
|
||
|
//
|
||
|
// Move the Close button up on top of the hidden edit control
|
||
|
//
|
||
|
|
||
|
SetWindowPos(_hCtrl(IDCANCEL),
|
||
|
NULL,
|
||
|
rcClose.left,
|
||
|
rcEdit.top,
|
||
|
0,
|
||
|
0,
|
||
|
SWP_NOSIZE | SWP_NOZORDER);
|
||
|
|
||
|
//
|
||
|
// Shrink the dialog vertically by the amount the button was
|
||
|
// moved up
|
||
|
//
|
||
|
|
||
|
LONG cyDelta = rcClose.top - rcEdit.top;
|
||
|
RECT rcDialog;
|
||
|
|
||
|
GetWindowRect(m_hwnd, &rcDialog);
|
||
|
|
||
|
SetWindowPos(m_hwnd,
|
||
|
NULL,
|
||
|
0,
|
||
|
0,
|
||
|
WindowRectWidth(rcDialog),
|
||
|
WindowRectHeight(rcDialog) - cyDelta,
|
||
|
SWP_NOMOVE | SWP_NOZORDER);
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMessageDlg::_OnCommand
|
||
|
//
|
||
|
// Synopsis: Handle user input.
|
||
|
//
|
||
|
// Arguments: standard windows
|
||
|
//
|
||
|
// Returns: standard windows
|
||
|
//
|
||
|
// History: 06-28-1998 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
bool
|
||
|
CMessageDlg::_OnCommand(
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
bool fNotHandled = false;
|
||
|
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDCANCEL:
|
||
|
EndDialog(m_hwnd, 0);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
fNotHandled = true;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return fNotHandled;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: InvokeWinHelp
|
||
|
//
|
||
|
// Synopsis: Helper (ahem) function to invoke winhelp.
|
||
|
//
|
||
|
// Arguments: [message] - WM_CONTEXTMENU or WM_HELP
|
||
|
// [wParam] - depends on [message]
|
||
|
// [wszHelpFileName] - filename with or without path
|
||
|
// [aulControlIdToHelpIdMap] - see WinHelp API
|
||
|
//
|
||
|
// History: 06-10-1997 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
void
|
||
|
InvokeWinHelp(
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam,
|
||
|
PCWSTR wszHelpFileName,
|
||
|
ULONG aulControlIdToHelpIdMap[])
|
||
|
{
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_CONTEXTMENU: // Right mouse click - "What's This" context menu
|
||
|
WinHelp((HWND) wParam,
|
||
|
wszHelpFileName,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(DWORD_PTR) aulControlIdToHelpIdMap);
|
||
|
break;
|
||
|
|
||
|
case WM_HELP: // Help from the "?" dialog
|
||
|
{
|
||
|
const LPHELPINFO pHelpInfo = (LPHELPINFO) lParam;
|
||
|
|
||
|
if (pHelpInfo && pHelpInfo->iContextType == HELPINFO_WINDOW)
|
||
|
{
|
||
|
WinHelp((HWND) pHelpInfo->hItemHandle,
|
||
|
wszHelpFileName,
|
||
|
HELP_WM_HELP,
|
||
|
(DWORD_PTR) aulControlIdToHelpIdMap);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|