248 lines
5.5 KiB
C++
248 lines
5.5 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)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
|
|
|
|
|
|
|