WindowsXP-SP1/admin/select/src/dlg.cxx
2020-09-30 16:53:49 +02:00

443 lines
10 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1996.
//
// File: dlg.cxx
//
// Contents: Implementation of modeless dialog base class
//
// Classes: CDlg
//
// History: 4-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
//+--------------------------------------------------------------------------
//
// Member: CDlg::CDlg
//
// Synopsis: ctor
//
// History: 4-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
CDlg::CDlg():
m_hwnd(NULL)
{
TRACE_CONSTRUCTOR(CDlg);
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::~CDlg
//
// Synopsis: dtor
//
// History: 4-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
CDlg::~CDlg()
{
TRACE_DESTRUCTOR(CDlg);
m_hwnd = NULL;
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::_DoModalDlg
//
// Synopsis: Create the dialog and return its window handle
//
// Arguments: [hwndParent] - handle to owner window of dialog to create
// [idd] - resource id of dialog template
//
// Returns: Dialog's return code
//
// History: 04-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
INT_PTR
CDlg::_DoModalDlg(
HWND hwndParent,
INT idd) const
{
TRACE_METHOD(CDlg, _DoModalDlg);
ASSERT(!hwndParent || IsWindow(hwndParent));
INT_PTR iResult = DialogBoxParam(g_hinst,
MAKEINTRESOURCE(idd),
hwndParent,
CDlg::_DlgProc,
(LPARAM) this);
if (iResult == -1)
{
DBG_OUT_LASTERROR;
}
return iResult;
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::_DoModelessDlg
//
// Synopsis: Create the dialog and return its window handle
//
// Arguments: [hwndParent] - handle to owner window of dialog to create
// [idd] - resource id of dialog template
//
// Returns: Dialog window handle, or NULL on failure
//
// History: 4-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
HWND
CDlg::_DoModelessDlg(
HWND hwndParent,
INT idd)
{
TRACE_METHOD(CDlg, _DoModelessDlg);
HWND hwnd;
hwnd = CreateDialogParam(g_hinst,
MAKEINTRESOURCE(idd),
hwndParent,
CDlg::_DlgProc,
(LPARAM) this);
if (!hwnd)
{
DBG_OUT_LASTERROR;
}
return hwnd;
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::_DlgProc
//
// Synopsis: Dispatch selected messages to derived class
//
// Arguments: standard windows dialog
//
// Returns: standard windows dialog
//
// History: 4-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
INT_PTR CALLBACK
CDlg::_DlgProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
BOOL fReturn = TRUE;
CDlg *pThis = (CDlg *)GetWindowLongPtr(hwnd, DWLP_USER);
if (!pThis && message != WM_INITDIALOG)
{
Dbg(DEB_WARN,
"CDlg::_DlgProc received message %#x before WM_INITDIALOG\n",
message);
return FALSE;
}
switch (message)
{
case WM_INITDIALOG:
{
HRESULT hr = S_OK;
//
// pThis isn't valid because we haven't set DWLP_USER yet. Make
// it valid.
//
pThis = (CDlg*) lParam;
ASSERT(pThis);
Dbg(DEB_ITRACE, "CDlg::_DlgProc setting DWLP_USER to %#x\n", pThis);
SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) pThis);
pThis->m_hwnd = hwnd;
BOOL fInitResult = TRUE;
hr = pThis->_OnInit(&fInitResult);
fReturn = fInitResult;
//
// If the initialization failed do not allow the dialog to start.
//
if (FAILED(hr))
{
DestroyWindow(hwnd);
}
break;
}
case WM_COMMAND:
fReturn = pThis->_OnCommand(wParam, lParam);
break;
case WM_SIZE:
fReturn = pThis->_OnSize(wParam, lParam);
break;
case WM_GETMINMAXINFO:
fReturn = pThis->_OnMinMaxInfo((LPMINMAXINFO) lParam);
break;
case WM_NOTIFY:
fReturn = pThis->_OnNotify(wParam, lParam);
break;
case WM_DRAWITEM:
fReturn = pThis->_OnDrawItem(wParam, lParam);
break;
case WM_CTLCOLORSTATIC:
fReturn = (BOOL)pThis->_OnStaticCtlColor((HDC) wParam, (HWND) lParam);
break;
case WM_SYSCOLORCHANGE:
pThis->_OnSysColorChange();
break;
case OPM_PROMPT_FOR_CREDS:
pThis->_OnCredentialPrompt(lParam);
break;
case OPM_NEW_QUERY_RESULTS:
pThis->_OnNewBlock(wParam, lParam);
break;
case OPM_QUERY_COMPLETE:
pThis->_OnQueryDone(wParam, lParam);
break;
case OPM_HIT_QUERY_LIMIT:
pThis->_OnQueryLimit();
break;
case OPM_POPUP_CRED_ERROR:
pThis->_OnPopupCredErr(lParam);
break;
case WM_DESTROY:
//
// It's possible to get a WM_DESTROY message without having gotten
// a WM_INITDIALOG if loading a dll that the dialog needs (e.g.
// comctl32.dll) fails, so guard pThis access here.
//
if (pThis)
{
pThis->_OnDestroy();
pThis->m_hwnd = NULL;
}
break;
case WM_HELP:
case WM_CONTEXTMENU:
pThis->_OnHelp(message, wParam, lParam);
break;
case THREAD_SUCCEEDED:
pThis->OnProgressMessage(message, wParam, lParam);
default:
fReturn = FALSE;
break;
}
return fReturn;
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::_GetChildWindowRect
//
// Synopsis: Init *[prc] with the window rect, in client coordinates, of
// child window [hwndChild].
//
// Arguments: [hwndChild] - child window for which to retrieve rect
// [prc] - pointer to rect struct to receive info
//
// Modifies: *[prc]
//
// History: 07-21-1998 DavidMun Created
//
//---------------------------------------------------------------------------
void
CDlg::_GetChildWindowRect(
HWND hwndChild,
RECT *prc) const
{
ASSERT(hwndChild && IsWindow(hwndChild));
VERIFY(GetWindowRect(hwndChild, prc));
VERIFY(MapWindowPoints(NULL, m_hwnd, (LPPOINT) prc, 2));
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::PerformCredentialPrompt
//
// Synopsis: Pop up a credential dialog.
//
// Arguments: [pcmi] -
//
// Modifies: *[pcmi->pwzUserName], *[pcmi->pwzPassword]
//
// History: 05-04-1998 DavidMun Created
//
// Notes: Called by browse dialog in response to a
// OPM_PROMPT_FOR_CREDS message.
//
//---------------------------------------------------------------------------
void
CDlg::_OnCredentialPrompt(
LPARAM lParam) const
{
TRACE_METHOD(CDlg, PerformCredentialPrompt);
CRED_MSG_INFO *pcmi = reinterpret_cast<CRED_MSG_INFO *>(lParam);
CPasswordDialog PasswordDlg(pcmi->flProvider,
pcmi->pwzServer,
pcmi->pwzUserName,
pcmi->pwzPassword);
pcmi->hr = PasswordDlg.DoModalDialog(m_hwnd);
//
// If this credential prompt is being performed on behalf of the
// worker thread, release it to process the result.
//
if (pcmi->hPrompt)
{
SetEvent(pcmi->hPrompt);
}
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::_OnPopupCredErr
//
// Synopsis: Invoke a messagebox to display an error and set an event
// when it closes.
//
// Arguments: [lParam] - POPUP_MSG_INFO pointer
//
// History: 06-22-2000 DavidMun Created
//
// Notes: Used when worker thread needs to display an error.
//
//---------------------------------------------------------------------------
void
CDlg::_OnPopupCredErr(
LPARAM lParam) const
{
TRACE_METHOD(CDlg, _OnPopupMessage);
POPUP_MSG_INFO *pmi = reinterpret_cast<POPUP_MSG_INFO *>(lParam);
PopupMessage(pmi->hwnd, pmi->ids, pmi->wzUser, pmi->wzError);
ASSERT(pmi->hPrompt);
if (pmi->hPrompt)
{
SetEvent(pmi->hPrompt);
}
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::_ReadEditCtrl
//
// Synopsis: Put the contents of the edit control with resource id [id]
// into the string pointed to by [pstr].
//
// Arguments: [id] - resource id of edit control
// [pstr] - points to string to fill with edit control's
// contents
//
// History: 06-22-2000 DavidMun Created
//
//---------------------------------------------------------------------------
void
CDlg::_ReadEditCtrl(
ULONG id,
String *pstr) const
{
pstr->erase();
SetLastError(0);
int cch = Edit_GetTextLength(_hCtrl(id));
if (cch > 0)
{
PWSTR pwz = new WCHAR [cch + 1];
int iRet = Edit_GetText(_hCtrl(id), pwz, cch + 1);
if (iRet)
{
*pstr = pwz;
}
else
{
DBG_OUT_LASTERROR;
}
delete [] pwz;
}
else
{
#if (DBG == 1)
if (GetLastError())
{
DBG_OUT_LASTERROR;
}
#endif // (DBG == 1)
}
}