diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2021-12-27 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2022-03-18 15:35:13 +0500 |
commit | f19f813537c7aea1c20749c914e756b54a9c3cf5 (patch) | |
tree | 816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /CPP/Windows/Control/PropertyPage.cpp | |
parent | 98e06a519b63b81986abe76d28887f6984a7732b (diff) | |
download | 7zip-21.07.tar.gz 7zip-21.07.tar.bz2 7zip-21.07.zip |
'21.07'21.07
Diffstat (limited to 'CPP/Windows/Control/PropertyPage.cpp')
-rw-r--r-- | CPP/Windows/Control/PropertyPage.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/CPP/Windows/Control/PropertyPage.cpp b/CPP/Windows/Control/PropertyPage.cpp new file mode 100644 index 0000000..ce8696d --- /dev/null +++ b/CPP/Windows/Control/PropertyPage.cpp | |||
@@ -0,0 +1,143 @@ | |||
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 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 | |||
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 | |||
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 | }} | ||