1 // Windows/Control/PropertyPage.cpp
2 
3 #include "StdAfx.h"
4 
5 #ifndef _UNICODE
6 #include "../../Common/StringConvert.h"
7 #endif
8 
9 #include "PropertyPage.h"
10 
11 extern HINSTANCE g_hInstance;
12 #ifndef _UNICODE
13 extern bool g_IsNT;
14 #endif
15 
16 namespace NWindows {
17 namespace NControl {
18 
MyProperyPageProcedure(HWND dialogHWND,UINT message,WPARAM wParam,LPARAM lParam)19 static INT_PTR APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
20 {
21   CWindow tempDialog(dialogHWND);
22   if (message == WM_INITDIALOG)
23     tempDialog.SetUserDataLongPtr(((PROPSHEETPAGE *)lParam)->lParam);
24   CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
25   if (dialog == NULL)
26     return FALSE;
27   if (message == WM_INITDIALOG)
28     dialog->Attach(dialogHWND);
29   try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
30   catch(...) { return TRUE; }
31 }
32 
OnNotify(UINT,LPNMHDR lParam)33 bool CPropertyPage::OnNotify(UINT /* controlID */, LPNMHDR lParam)
34 {
35   switch (lParam->code)
36   {
37     case PSN_APPLY: SetMsgResult(OnApply(LPPSHNOTIFY(lParam))); break;
38     case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive(LPPSHNOTIFY(lParam)))); break;
39     case PSN_SETACTIVE: SetMsgResult(OnSetActive(LPPSHNOTIFY(lParam))); break;
40     case PSN_RESET: OnReset(LPPSHNOTIFY(lParam)); break;
41     case PSN_HELP: OnNotifyHelp(LPPSHNOTIFY(lParam)); break;
42     default: return false;
43   }
44   return true;
45 }
46 
MyPropertySheet(const CObjectVector<CPageInfo> & pagesInfo,HWND hwndParent,const UString & title)47 INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title)
48 {
49   #ifndef _UNICODE
50   AStringVector titles;
51   #endif
52   #ifndef _UNICODE
53   CRecordVector<PROPSHEETPAGEA> pagesA;
54   #endif
55   CRecordVector<PROPSHEETPAGEW> pagesW;
56 
57   unsigned i;
58   #ifndef _UNICODE
59   for (i = 0; i < pagesInfo.Size(); i++)
60     titles.Add(GetSystemString(pagesInfo[i].Title));
61   #endif
62 
63   for (i = 0; i < pagesInfo.Size(); i++)
64   {
65     const CPageInfo &pageInfo = pagesInfo[i];
66     #ifndef _UNICODE
67     {
68       PROPSHEETPAGE page;
69       page.dwSize = sizeof(page);
70       page.dwFlags = PSP_HASHELP;
71       page.hInstance = g_hInstance;
72       page.pszTemplate = MAKEINTRESOURCE(pageInfo.ID);
73       page.pszIcon = NULL;
74       page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
75 
76       if (titles[i].IsEmpty())
77         page.pszTitle = NULL;
78       else
79       {
80         page.dwFlags |= PSP_USETITLE;
81         page.pszTitle = titles[i];
82       }
83       page.lParam = (LPARAM)pageInfo.Page;
84       page.pfnCallback = NULL;
85       pagesA.Add(page);
86     }
87     #endif
88     {
89       PROPSHEETPAGEW page;
90       page.dwSize = sizeof(page);
91       page.dwFlags = PSP_HASHELP;
92       page.hInstance = g_hInstance;
93       page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID);
94       page.pszIcon = NULL;
95       page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
96 
97       if (pageInfo.Title.IsEmpty())
98         page.pszTitle = NULL;
99       else
100       {
101         page.dwFlags |= PSP_USETITLE;
102         page.pszTitle = pageInfo.Title;
103       }
104       page.lParam = (LPARAM)pageInfo.Page;
105       page.pfnCallback = NULL;
106       pagesW.Add(page);
107     }
108   }
109 
110   #ifndef _UNICODE
111   if (!g_IsNT)
112   {
113     PROPSHEETHEADER sheet;
114     sheet.dwSize = sizeof(sheet);
115     sheet.dwFlags = PSH_PROPSHEETPAGE;
116     sheet.hwndParent = hwndParent;
117     sheet.hInstance = g_hInstance;
118     AString titleA (GetSystemString(title));
119     sheet.pszCaption = titleA;
120     sheet.nPages = pagesInfo.Size();
121     sheet.nStartPage = 0;
122     sheet.ppsp = &pagesA.Front();
123     sheet.pfnCallback = NULL;
124     return ::PropertySheetA(&sheet);
125   }
126   else
127   #endif
128   {
129     PROPSHEETHEADERW sheet;
130     sheet.dwSize = sizeof(sheet);
131     sheet.dwFlags = PSH_PROPSHEETPAGE;
132     sheet.hwndParent = hwndParent;
133     sheet.hInstance = g_hInstance;
134     sheet.pszCaption = title;
135     sheet.nPages = pagesInfo.Size();
136     sheet.nStartPage = 0;
137     sheet.ppsp = &pagesW.Front();
138     sheet.pfnCallback = NULL;
139     return ::PropertySheetW(&sheet);
140   }
141 }
142 
143 }}
144