Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

247 lines
5.5 KiB

//+--------------------------------------------------------------------------
//
// 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)
{
}
//+--------------------------------------------------------------------------
//
// Member: CDlg::~CDlg
//
// Synopsis: dtor
//
// History: 4-22-1997 DavidMun Created
//
//---------------------------------------------------------------------------
CDlg::~CDlg()
{
}
//+--------------------------------------------------------------------------
//
// 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)
{
INT iResult = (INT)DialogBoxParam(GetModuleHandle(NULL),
MAKEINTRESOURCE(idd),
hwndParent,
CDlg::_DlgProc,
(LPARAM) this);
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)
{
HWND hwnd;
hwnd = CreateDialogParam(GetModuleHandle(NULL),
MAKEINTRESOURCE(idd),
hwndParent,
CDlg::_DlgProc,
(LPARAM) this);
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);
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;
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_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;
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)
{
GetWindowRect(hwndChild, prc);
ScreenToClient(m_hwnd, (LPPOINT) &prc->left);
ScreenToClient(m_hwnd, (LPPOINT) &prc->right);
}