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
19 static
20 #ifdef Z7_OLD_WIN_SDK
21 BOOL
22 #else
23 INT_PTR
24 #endif
MyProperyPageProcedure(HWND dialogHWND,UINT message,WPARAM wParam,LPARAM lParam)25 APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
26 {
27 CWindow tempDialog(dialogHWND);
28 if (message == WM_INITDIALOG)
29 tempDialog.SetUserDataLongPtr(((PROPSHEETPAGE *)lParam)->lParam);
30 CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
31 if (dialog == NULL)
32 return FALSE;
33 if (message == WM_INITDIALOG)
34 dialog->Attach(dialogHWND);
35 try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
36 catch(...) { return TRUE; }
37 }
38
OnNotify(UINT,LPNMHDR lParam)39 bool CPropertyPage::OnNotify(UINT /* controlID */, LPNMHDR lParam)
40 {
41 switch (lParam->code)
42 {
43 case PSN_APPLY: SetMsgResult(OnApply2(LPPSHNOTIFY(lParam))); break;
44 case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive2(LPPSHNOTIFY(lParam)))); break;
45 case PSN_SETACTIVE: SetMsgResult(OnSetActive2(LPPSHNOTIFY(lParam))); break;
46 case PSN_RESET: OnReset2(LPPSHNOTIFY(lParam)); break;
47 case PSN_HELP: OnNotifyHelp2(LPPSHNOTIFY(lParam)); break;
48 default: return false;
49 }
50 return true;
51 }
52
53 /*
54 PROPSHEETPAGE fields depend from
55 #if (_WIN32_WINNT >= 0x0600)
56 #elif (_WIN32_WINNT >= 0x0501)
57 #elif (_WIN32_IE >= 0x0400)
58 PROPSHEETHEADER fields depend from
59 #if (_WIN32_IE >= 0x0400)
60 */
61 #if defined(PROPSHEETPAGEA_V1_SIZE) && !defined(Z7_OLD_WIN_SDK)
62 #ifndef _UNICODE
63 #define my_compatib_PROPSHEETPAGEA PROPSHEETPAGEA_V1
64 #endif
65 #define my_compatib_PROPSHEETPAGEW PROPSHEETPAGEW_V1
66 #else
67 // for old mingw:
68 #ifndef _UNICODE
69 #define my_compatib_PROPSHEETPAGEA PROPSHEETPAGEA
70 #endif
71 #define my_compatib_PROPSHEETPAGEW PROPSHEETPAGEW
72 #endif
73
MyPropertySheet(const CObjectVector<CPageInfo> & pagesInfo,HWND hwndParent,const UString & title)74 INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title)
75 {
76 unsigned i;
77 #ifndef _UNICODE
78 AStringVector titles;
79 for (i = 0; i < pagesInfo.Size(); i++)
80 titles.Add(GetSystemString(pagesInfo[i].Title));
81 CRecordVector<my_compatib_PROPSHEETPAGEA> pagesA;
82 #endif
83 CRecordVector<my_compatib_PROPSHEETPAGEW> pagesW;
84
85 for (i = 0; i < pagesInfo.Size(); i++)
86 {
87 const CPageInfo &pageInfo = pagesInfo[i];
88 #ifndef _UNICODE
89 {
90 my_compatib_PROPSHEETPAGEA page;
91 memset(&page, 0, sizeof(page));
92 page.dwSize = sizeof(page);
93 page.dwFlags = PSP_HASHELP;
94 page.hInstance = g_hInstance;
95 page.pszTemplate = MAKEINTRESOURCEA(pageInfo.ID);
96 // page.pszIcon = NULL;
97 page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
98
99 if (!titles[i].IsEmpty())
100 {
101 page.pszTitle = titles[i];
102 page.dwFlags |= PSP_USETITLE;
103 }
104 // else page.pszTitle = NULL;
105 page.lParam = (LPARAM)pageInfo.Page;
106 // page.pfnCallback = NULL;
107 pagesA.Add(page);
108 }
109 #endif
110 {
111 my_compatib_PROPSHEETPAGEW page;
112 memset(&page, 0, sizeof(page));
113 page.dwSize = sizeof(page);
114 page.dwFlags = PSP_HASHELP;
115 page.hInstance = g_hInstance;
116 page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID);
117 // page.pszIcon = NULL;
118 page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
119
120 if (!pageInfo.Title.IsEmpty())
121 {
122 page.pszTitle = pageInfo.Title;
123 page.dwFlags |= PSP_USETITLE;
124 }
125 // else page.pszTitle = NULL;
126 page.lParam = (LPARAM)pageInfo.Page;
127 // page.pfnCallback = NULL;
128 pagesW.Add(page);
129 }
130 }
131
132 #ifndef _UNICODE
133 if (!g_IsNT)
134 {
135 PROPSHEETHEADERA sheet;
136 sheet.dwSize = sizeof(sheet);
137 sheet.dwFlags = PSH_PROPSHEETPAGE;
138 sheet.hwndParent = hwndParent;
139 sheet.hInstance = g_hInstance;
140 AString titleA (GetSystemString(title));
141 sheet.pszCaption = titleA;
142 sheet.nPages = pagesA.Size();
143 sheet.nStartPage = 0;
144 sheet.ppsp = (LPCPROPSHEETPAGEA)(const void *)pagesA.ConstData();
145 sheet.pfnCallback = NULL;
146 return ::PropertySheetA(&sheet);
147 }
148 else
149 #endif
150 {
151 PROPSHEETHEADERW sheet;
152 sheet.dwSize = sizeof(sheet);
153 sheet.dwFlags = PSH_PROPSHEETPAGE;
154 sheet.hwndParent = hwndParent;
155 sheet.hInstance = g_hInstance;
156 sheet.pszCaption = title;
157 sheet.nPages = pagesW.Size();
158 sheet.nStartPage = 0;
159 sheet.ppsp = (LPCPROPSHEETPAGEW)(const void *)pagesW.ConstData();
160 sheet.pfnCallback = NULL;
161 return ::PropertySheetW(&sheet);
162 }
163 }
164
165 }}
166