//+--------------------------------------------------------------------------- // // 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 #pragma hdrstop #include extern CComModule _Module; // required by atlcom.h #include #ifdef SubclassWindow #undef SubclassWindow #endif #include #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 (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(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); }