269 lines
5.9 KiB
C++
269 lines
5.9 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) const
|
||
|
{
|
||
|
INT_PTR iResult = 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_DRAWITEM:
|
||
|
fReturn = pThis->_OnDrawItem(wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_CTLCOLORSTATIC:
|
||
|
fReturn = static_cast<ULONG>(pThis->_OnStaticCtlColor((HDC) wParam, (HWND) lParam));
|
||
|
break;
|
||
|
|
||
|
case WM_SYSCOLORCHANGE:
|
||
|
pThis->_OnSysColorChange();
|
||
|
break;
|
||
|
/*
|
||
|
case WM_SETFOCUS:
|
||
|
pThis->_OnSetFocus((HWND)wParam);
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
|
||
|
#define VERIFY(x) x
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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)
|
||
|
{
|
||
|
|
||
|
VERIFY(GetWindowRect(hwndChild, prc));
|
||
|
VERIFY(MapWindowPoints(NULL, m_hwnd, (LPPOINT) prc, 2));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|