windows-nt/Source/XPSP1/NT/net/config/common/ncbase/ncatlps.cpp
2020-09-26 16:20:57 +08:00

240 lines
6.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: N C A T L P S . C P P
//
// Contents: Class implementation for ATL-like property sheet page object.
//
// Notes:
//
// Author: danielwe 28 Feb 1997
//
//----------------------------------------------------------------------------
#include <pch.h>
#pragma hdrstop
#include <atlbase.h>
extern CComModule _Module; // required by atlcom.h
#include <atlcom.h>
#ifdef SubclassWindow
#undef SubclassWindow
#endif
#include <atlwin.h>
#include "ncatlps.h"
CPropSheetPage::~CPropSheetPage ()
{
// If we are attached to a window, DWL_USER contains a pointer to this.
// Remove it since we are going away.
//
if (m_hWnd)
{
const CPropSheetPage* pps;
pps = (CPropSheetPage *) ::GetWindowLongPtr(m_hWnd, DWLP_USER);
if (pps)
{
AssertSz (pps == this, "Why isn't DWL_USER equal to 'this'?");
::SetWindowLongPtr(m_hWnd, DWLP_USER, NULL);
}
}
}
//+---------------------------------------------------------------------------
//
// Member: CPropSheetPage::CreatePage
//
// Purpose: Method to quickly create a property page.
//
// Arguments:
// unId [in] IDD of dialog resource ID
// dwFlags [in] Additional flags to use in the dwFlags field of the
// PROPSHEETPAGE struct.
//
// Returns: HPROPSHEETPAGE
//
// Author: shaunco 28 Feb 1997
//
// Notes:
//
HPROPSHEETPAGE CPropSheetPage::CreatePage(UINT unId, DWORD dwFlags,
PCWSTR pszHeaderTitle,
PCWSTR pszHeaderSubTitle,
PCWSTR pszTitle,
OPTIONAL HINSTANCE hInstance)
{
Assert(unId);
PROPSHEETPAGE psp = {0};
HRSRC hrSrc = NULL;
HGLOBAL hgRes = NULL;
LPVOID lpv;
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = dwFlags;
if (!hInstance)
{
psp.hInstance = _Module.GetModuleInstance();
psp.pszTemplate = MAKEINTRESOURCE(unId);
}
else
{
// If resource dll is external to netshell.dll
hrSrc = FindResource(hInstance, MAKEINTRESOURCE(unId), RT_DIALOG);
if (hrSrc)
{
hgRes = LoadResource(hInstance, hrSrc);
if (hgRes)
{
lpv = LockResource(hgRes);
if (lpv)
{
psp.hInstance = NULL;
psp.dwFlags |= PSP_DLGINDIRECT;
psp.pResource = (LPCDLGTEMPLATE)lpv;
}
else
{
TraceTag(ttidError, "LockResource failed");
return NULL;
}
}
else
{
TraceTag(ttidError, "LoadResource failed with error %ld", GetLastError());
return NULL;
}
}
else
{
TraceTag(ttidError, "FindResource failed with error %ld", GetLastError());
return NULL;
}
}
psp.pfnDlgProc = (DLGPROC)CPropSheetPage::DialogProc;
psp.pfnCallback = static_cast<LPFNPSPCALLBACK>
(CPropSheetPage::PropSheetPageProc);
psp.lParam = (LPARAM)this;
psp.pszHeaderTitle = pszHeaderTitle;
psp.pszHeaderSubTitle = pszHeaderSubTitle;
psp.pszTitle = pszTitle;
return ::CreatePropertySheetPage(&psp);
}
//+---------------------------------------------------------------------------
//
// Member: CPropSheetPage::DialogProc
//
// Purpose: Dialog proc for ATL property sheet pages.
//
// Arguments:
// hWnd [in]
// uMsg [in] See the ATL documentation.
// wParam [in]
// lParam [in]
//
// Returns: LRESULT
//
// Author: danielwe 28 Feb 1997
//
// Notes:
//
LRESULT CALLBACK CPropSheetPage::DialogProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
LRESULT lRes;
PROPSHEETPAGE* ppsp;
CPropSheetPage* pps;
BOOL fRes = FALSE;
if (uMsg == WM_INITDIALOG)
{
ppsp = (PROPSHEETPAGE *)lParam;
pps = (CPropSheetPage *)ppsp->lParam;
::SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR) pps);
pps->Attach(hWnd);
}
else
{
pps = (CPropSheetPage *)::GetWindowLongPtr(hWnd, DWLP_USER);
// Until we get WM_INITDIALOG, just return FALSE
if (!pps)
return FALSE;
}
if (pps->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lRes, 0))
{
switch (uMsg)
{
case WM_COMPAREITEM:
case WM_VKEYTOITEM:
case WM_CHARTOITEM:
case WM_INITDIALOG:
case WM_QUERYDRAGICON:
return lRes;
break;
}
::SetWindowLongPtr(hWnd, DWLP_MSGRESULT, lRes);
fRes = TRUE;
}
return fRes;
}
//+---------------------------------------------------------------------------
//
// Member: CPropSheetPage::PropSheetPageProc
//
// Purpose: PropSheetPageProc for ATL property sheet pages.
//
// Arguments:
// hWnd [in]
// uMsg [in] See Win32 documentation.
// ppsp [in]
//
// Returns: UINT
//
// Author: billbe 6 Jul 1997
//
// Notes:
//
UINT CALLBACK CPropSheetPage::PropSheetPageProc(HWND hWnd, UINT uMsg,
LPPROPSHEETPAGE ppsp)
{
CPropSheetPage* pps;
// The this pointer was stored in the structure's lParam
pps = reinterpret_cast<CPropSheetPage *>(ppsp->lParam);
// This has to be valid since the CreatePage member fcn sets it
Assert(pps);
UINT uRet = TRUE;
// call the correct handler based on uMsg
//
if (PSPCB_CREATE == uMsg)
{
uRet = pps->UCreatePageCallbackHandler();
}
else if (PSPCB_RELEASE == uMsg)
{
pps->DestroyPageCallbackHandler();
}
else
{
AssertSz(FALSE, "Invalid or new message sent to call back!");
}
return (uRet);
}