Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
4.0 KiB

#include "precomp.hxx"
#include "PropertyPage.h"
void PropertyPage::FillPropSheetPage()
{
ZeroMemory(&psp, sizeof(psp));
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_USECALLBACK;
psp.pszTemplate = MAKEINTRESOURCE(resID);
psp.hInstance = hInstance;
psp.lParam = (LPARAM) this;
psp.pfnDlgProc = PropertyPageStaticDlgProc;
psp.pfnCallback = PropertyPageStaticCallback;
}
HPROPSHEETPAGE PropertyPage::CreatePropertyPage()
{
HPROPSHEETPAGE hp;
FillPropSheetPage();
return ::CreatePropertySheetPage(&psp);
}
UINT CALLBACK PropertyPage::PropertyPageStaticCallback(HWND hwnd, UINT msg, LPPROPSHEETPAGE ppsp)
{
PropertyPage * pThis = (PropertyPage*) ppsp->lParam;
switch (msg) {
case PSPCB_CREATE:
return pThis->CallbackCreate();
case PSPCB_RELEASE:
pThis->CallbackRelease();
return FALSE; // return value ignored
default:
break;
}
return TRUE;
}
INT_PTR PropertyPage::PropertyPageStaticDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
Dialog *pThis;
pThis = (PropertyPage*) GetWindowLongPtr(hDlg, DWLP_USER);
if (msg == WM_INITDIALOG) {
pThis = (PropertyPage *) ((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (ULONG_PTR) pThis);
return pThis->OnInitDialog(hDlg);
}
if (pThis) {
return pThis->MainDlgProc(msg, wParam, lParam);
}
return FALSE;
}
INT_PTR PropertyPage::OnNotify(NMHDR * nmhdr)
{
INT_PTR res = Dialog::OnNotify(nmhdr);
LPPSHNOTIFY lppsn = (LPPSHNOTIFY) nmhdr;
switch (nmhdr->code) {
case PSN_APPLY:
OnApply(lppsn);
return TRUE;
case PSN_KILLACTIVE:
OnKillActive(lppsn);
return TRUE;
case PSN_SETACTIVE:
OnSetActive(lppsn);
return TRUE;
case PSN_HELP:
OnHelp(lppsn);
return TRUE;
case PSN_RESET:
OnReset(lppsn);
return FALSE;
case PSN_QUERYCANCEL:
OnQueryCancel(lppsn);
return TRUE;
default:
return FALSE;
}
}
void PropertyPage::OnApply(LPPSHNOTIFY lppsn)
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
}
void PropertyPage::OnSetActive(LPPSHNOTIFY lppsn)
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0);
}
void PropertyPage::OnKillActive(LPPSHNOTIFY lppsn)
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0);
}
void PropertyPage::OnQueryCancel(LPPSHNOTIFY lppsn)
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0);
}
void PropertyPage::SetModified(BOOL bChanged) {
assert(::IsWindow(hDlg));
assert(GetParent(hDlg) != NULL);
UINT uMsg = bChanged ? PSM_CHANGED : PSM_UNCHANGED;
::SendMessage(GetParent(hDlg), uMsg, (WPARAM)hDlg, 0L);
}
//
// SHBrowseForFolder callback
//
int
CALLBACK
BrowseCallback(
HWND hwnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData
)
{
switch (uMsg)
{
case BFFM_INITIALIZED:
// set the initial seclection to our default folder
// (from the registry or SIDL_MYPICTURES).
// the lpData points to the folder path.
// It must contain a path.
assert(lpData && _T('\0') != *((LPTSTR)lpData));
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
break;
case BFFM_VALIDATEFAILED:
IdMessageBox(hwnd, IDS_ERROR_INVALID_FOLDER);
return 1;
default:
break;
}
return 0;
}
extern HINSTANCE gHInst;
int
IdMessageBox(
HWND hwnd,
int MsgId,
DWORD Options,
int CaptionId
)
{
TCHAR MsgText[MAX_PATH];
TCHAR Caption[MAX_PATH];
assert(MsgId);
if (MsgId)
LoadString(gHInst, MsgId, MsgText, sizeof(MsgText) / sizeof(TCHAR));
else
LoadString(gHInst, IDS_ERROR_UNKNOWN, MsgText, sizeof(MsgText) / sizeof(TCHAR));
if (CaptionId)
LoadString(gHInst, CaptionId, Caption, sizeof(Caption) / sizeof(TCHAR));
else
LoadString(gHInst, IDS_APPLETNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
return MessageBox(hwnd, MsgText, Caption, Options);
}