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 11extern HINSTANCE g_hInstance; 12#ifndef _UNICODE 13extern bool g_IsNT; 14#endif 15 16namespace NWindows { 17namespace NControl { 18 19static 20#ifdef Z7_OLD_WIN_SDK 21 BOOL 22#else 23 INT_PTR 24#endif 25APIENTRY 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 39bool 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/* 54PROPSHEETPAGE fields depend from 55#if (_WIN32_WINNT >= 0x0600) 56#elif (_WIN32_WINNT >= 0x0501) 57#elif (_WIN32_IE >= 0x0400) 58PROPSHEETHEADER 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 74INT_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.Front(); 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.Front(); 160 sheet.pfnCallback = NULL; 161 return ::PropertySheetW(&sheet); 162 } 163} 164 165}} 166