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.
144 lines
3.9 KiB
144 lines
3.9 KiB
// Windows/Control/PropertyPage.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#ifndef _UNICODE
|
|
#include "../../Common/StringConvert.h"
|
|
#endif
|
|
|
|
#include "PropertyPage.h"
|
|
|
|
extern HINSTANCE g_hInstance;
|
|
#ifndef _UNICODE
|
|
extern bool g_IsNT;
|
|
#endif
|
|
|
|
namespace NWindows {
|
|
namespace NControl {
|
|
|
|
static INT_PTR APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CWindow tempDialog(dialogHWND);
|
|
if (message == WM_INITDIALOG)
|
|
tempDialog.SetUserDataLongPtr(((PROPSHEETPAGE *)lParam)->lParam);
|
|
CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
|
|
if (dialog == NULL)
|
|
return FALSE;
|
|
if (message == WM_INITDIALOG)
|
|
dialog->Attach(dialogHWND);
|
|
try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
|
|
catch(...) { return TRUE; }
|
|
}
|
|
|
|
bool CPropertyPage::OnNotify(UINT /* controlID */, LPNMHDR lParam)
|
|
{
|
|
switch (lParam->code)
|
|
{
|
|
case PSN_APPLY: SetMsgResult(OnApply(LPPSHNOTIFY(lParam))); break;
|
|
case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive(LPPSHNOTIFY(lParam)))); break;
|
|
case PSN_SETACTIVE: SetMsgResult(OnSetActive(LPPSHNOTIFY(lParam))); break;
|
|
case PSN_RESET: OnReset(LPPSHNOTIFY(lParam)); break;
|
|
case PSN_HELP: OnNotifyHelp(LPPSHNOTIFY(lParam)); break;
|
|
default: return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title)
|
|
{
|
|
#ifndef _UNICODE
|
|
AStringVector titles;
|
|
#endif
|
|
#ifndef _UNICODE
|
|
CRecordVector<PROPSHEETPAGEA> pagesA;
|
|
#endif
|
|
CRecordVector<PROPSHEETPAGEW> pagesW;
|
|
|
|
unsigned i;
|
|
#ifndef _UNICODE
|
|
for (i = 0; i < pagesInfo.Size(); i++)
|
|
titles.Add(GetSystemString(pagesInfo[i].Title));
|
|
#endif
|
|
|
|
for (i = 0; i < pagesInfo.Size(); i++)
|
|
{
|
|
const CPageInfo &pageInfo = pagesInfo[i];
|
|
#ifndef _UNICODE
|
|
{
|
|
PROPSHEETPAGE page;
|
|
page.dwSize = sizeof(page);
|
|
page.dwFlags = PSP_HASHELP;
|
|
page.hInstance = g_hInstance;
|
|
page.pszTemplate = MAKEINTRESOURCE(pageInfo.ID);
|
|
page.pszIcon = NULL;
|
|
page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
|
|
|
|
if (titles[i].IsEmpty())
|
|
page.pszTitle = NULL;
|
|
else
|
|
{
|
|
page.dwFlags |= PSP_USETITLE;
|
|
page.pszTitle = titles[i];
|
|
}
|
|
page.lParam = (LPARAM)pageInfo.Page;
|
|
page.pfnCallback = NULL;
|
|
pagesA.Add(page);
|
|
}
|
|
#endif
|
|
{
|
|
PROPSHEETPAGEW page;
|
|
page.dwSize = sizeof(page);
|
|
page.dwFlags = PSP_HASHELP;
|
|
page.hInstance = g_hInstance;
|
|
page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID);
|
|
page.pszIcon = NULL;
|
|
page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
|
|
|
|
if (pageInfo.Title.IsEmpty())
|
|
page.pszTitle = NULL;
|
|
else
|
|
{
|
|
page.dwFlags |= PSP_USETITLE;
|
|
page.pszTitle = pageInfo.Title;
|
|
}
|
|
page.lParam = (LPARAM)pageInfo.Page;
|
|
page.pfnCallback = NULL;
|
|
pagesW.Add(page);
|
|
}
|
|
}
|
|
|
|
#ifndef _UNICODE
|
|
if (!g_IsNT)
|
|
{
|
|
PROPSHEETHEADER sheet;
|
|
sheet.dwSize = sizeof(sheet);
|
|
sheet.dwFlags = PSH_PROPSHEETPAGE;
|
|
sheet.hwndParent = hwndParent;
|
|
sheet.hInstance = g_hInstance;
|
|
AString titleA (GetSystemString(title));
|
|
sheet.pszCaption = titleA;
|
|
sheet.nPages = pagesInfo.Size();
|
|
sheet.nStartPage = 0;
|
|
sheet.ppsp = &pagesA.Front();
|
|
sheet.pfnCallback = NULL;
|
|
return ::PropertySheetA(&sheet);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
PROPSHEETHEADERW sheet;
|
|
sheet.dwSize = sizeof(sheet);
|
|
sheet.dwFlags = PSH_PROPSHEETPAGE;
|
|
sheet.hwndParent = hwndParent;
|
|
sheet.hInstance = g_hInstance;
|
|
sheet.pszCaption = title;
|
|
sheet.nPages = pagesInfo.Size();
|
|
sheet.nStartPage = 0;
|
|
sheet.ppsp = &pagesW.Front();
|
|
sheet.pfnCallback = NULL;
|
|
return ::PropertySheetW(&sheet);
|
|
}
|
|
}
|
|
|
|
}}
|