|
|
// Copyright (C) Microsoft Corporation 1993-1997, All Rights reserved.
#include "header.h"
#include "cprop.h"
// enumerated type so debugger can show us what codes are being sent
typedef enum { tPSN_SETACTIVE = (PSN_FIRST-0), tPSN_KILLACTIVE = (PSN_FIRST-1), tPSN_APPLY = (PSN_FIRST-2), tPSN_RESET = (PSN_FIRST-3), tPSN_HELP = (PSN_FIRST-5), tPSN_WIZBACK = (PSN_FIRST-6), tPSN_WIZNEXT = (PSN_FIRST-7), tPSN_WIZFINISH = (PSN_FIRST-8), tPSN_QUERYCANCEL = (PSN_FIRST-9), } TYPE_PSN;
int CALLBACK CPropSheetProc(HWND hdlg, UINT msg, LPARAM lParam);
BOOL CALLBACK CPropPageProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { CPropPage* pThis = (CPropPage*) GetWindowLongPtr(hdlg, GWLP_USERDATA);; TYPE_PSN code; BOOL fResult;
switch (msg) { case WM_INITDIALOG: pThis = (CPropPage*) ((LPPROPSHEETPAGE) lParam)->lParam; CDlgProc(hdlg, msg, wParam, (LPARAM) pThis); //BUG 2035: Return TRUE to tell windows to set the keyboard focus.
// m_fFocusChanged is FALSE if the derived class hasn't changed it.
return !pThis->m_fFocusChanged;
case WM_COMMAND: if (!pThis || pThis->m_fShuttingDown) return FALSE; // pThis == NULL if a spin control is being initialized
switch (HIWORD(wParam)) { case BN_CLICKED: pThis->OnButton(LOWORD(wParam)); break;
case LBN_SELCHANGE: // same value as CBN_SELCHANGE
pThis->OnSelChange(LOWORD(wParam)); break;
case LBN_DBLCLK: // same value as CBN_DBLCLK
pThis->OnDoubleClick(LOWORD(wParam)); break;
case EN_CHANGE: pThis->OnEditChange(LOWORD(wParam)); break; }
// If m_pmsglist is set, OnCommand will call OnMsg
if (!pThis->OnCommand(wParam, lParam)) return FALSE; break;
case WM_NOTIFY: code = (TYPE_PSN) ((NMHDR*) lParam) ->code; switch(code) { case tPSN_APPLY: // OK or Apply Now
pThis->m_fInitializing = FALSE; if (pThis->m_pBeginOrEnd) pThis->m_pBeginOrEnd(pThis); else pThis->OnBeginOrEnd(); return FALSE;
case tPSN_WIZNEXT: case tPSN_WIZFINISH: pThis->m_fInitializing = FALSE; fResult = -1;
if (pThis->m_pBeginOrEnd) fResult = pThis->m_pBeginOrEnd(pThis); else fResult = pThis->OnBeginOrEnd();
if (!fResult) { pThis->SetResult(-1); return TRUE; } else return pThis->OnNotify((UINT) code); break;
default: return pThis->OnNotify((UINT) code);
} break;
case WM_HELP: pThis->OnHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle); break;
case WM_CONTEXTMENU: pThis->OnContextMenu((HWND) wParam); break;
case WM_DRAWITEM: if (!pThis) return FALSE;
if (pThis->m_pCheckBox && GetDlgItem(hdlg, (int)wParam) == pThis->m_pCheckBox->m_hWnd) { ASSERT(IsValidWindow(pThis->m_pCheckBox->m_hWnd)); pThis->m_pCheckBox->DrawItem((DRAWITEMSTRUCT*) lParam); return TRUE; } else return pThis->OnDlgMsg(msg, wParam, lParam) != NULL;
case WM_VKEYTOITEM: if (pThis && pThis->m_pCheckBox && (HWND) lParam == pThis->m_pCheckBox->m_hWnd) { if (LOWORD(wParam) == VK_SPACE) { int cursel = (int)pThis->m_pCheckBox->GetCurSel(); if (cursel != LB_ERR) pThis->m_pCheckBox->ToggleItem(cursel); } return -1; // always perform default action
} else return pThis->OnDlgMsg(msg, wParam, lParam)!=NULL;
default: if (pThis) return pThis->OnDlgMsg(msg, wParam, lParam)!=NULL; else return FALSE; }
return FALSE; }
CPropSheet::CPropSheet(PCSTR pszTitle, DWORD dwFlags, HWND hwndParent) { ZERO_INIT_CLASS(CPropSheet);
m_psh.dwSize = sizeof(m_psh); m_psh.dwFlags = dwFlags; m_psh.hwndParent = hwndParent; m_psh.hInstance = _Module.GetResourceInstance(); m_psh.pszCaption = pszTitle; m_psh.phpage = (HPROPSHEETPAGE*) lcCalloc(sizeof(HPROPSHEETPAGE) * MAXPROPPAGES); m_fNoCsHelp = FALSE; }
CPropPage::CPropPage(int idTemplate) : CDlg((HWND) NULL, idTemplate) { ClearMemory(&m_psp, sizeof(m_psp));
m_psp.dwSize = sizeof(m_psp); m_psp.dwFlags = PSP_DEFAULT; m_psp.hInstance = _Module.GetResourceInstance(); // means the dll can't create a property sheet [REVIEW: What does this comment meand 3/98 dalero]
m_psp.lParam = (LPARAM) this; m_idTemplate = idTemplate; if (idTemplate) { m_psp.pszTemplate = MAKEINTRESOURCE(idTemplate); ASSERT(m_psp.pszTemplate); } m_psp.pfnDlgProc = (DLGPROC) CPropPageProc; m_fCenterWindow = FALSE; // Don't automatically center the window
}
CPropSheet::~CPropSheet() { lcFree(m_psh.phpage); }
void CPropSheet::AddPage(CPropPage* pPage) { HPROPSHEETPAGE hprop = CreatePropertySheetPage(&pPage->m_psp); ASSERT_COMMENT(hprop, "Failed to create property sheet page."); if (hprop) m_psh.phpage[m_psh.nPages++] = hprop; }
int CPropSheet::DoModal(void) { if (m_fNoCsHelp) { m_psh.dwFlags |= PSH_USECALLBACK; m_psh.pfnCallback = CPropSheetProc; }
int err = (int)PropertySheet(&m_psh); ASSERT(err >= 0); return err; }
/***************************************************************************
FUNCTION: CPropSheetProc
PURPOSE: Called to remove context-sensitive help
***************************************************************************/
int CALLBACK CPropSheetProc(HWND hdlg, UINT msg, LPARAM lParam) { if (msg == PSCB_INITIALIZED) { SetWindowLong(hdlg, GWL_EXSTYLE, (GetWindowLong(hdlg, GWL_EXSTYLE) & ~WS_EX_CONTEXTHELP)); } return 0; }
|