Leaked source code of windows server 2003
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.

504 lines
16 KiB

  1. //Copyright (c) 1997-2000 Microsoft Corporation
  2. #include "pch.hxx" // pch
  3. #pragma hdrstop
  4. #include "resource.h"
  5. #include "pgWelco2.h"
  6. #define STRSAFE_NO_DEPRECATE
  7. #include "strsafe.h"
  8. // Intelli-menu regsitry
  9. #define REGSTR_EXPLORER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer")
  10. #define REGSTR_INTELLIMENU REGSTR_EXPLORER TEXT("\\Advanced")
  11. #define REGSTR_IE TEXT("Software\\Microsoft\\Internet Explorer\\Main")
  12. #define STRMENU TEXT("IntelliMenus")
  13. #define FAVMENU TEXT("FavIntelliMenus")
  14. CWelcome2Pg::CWelcome2Pg(
  15. LPPROPSHEETPAGE ppsp
  16. ) : WizardPage(ppsp, IDS_WELCOME2TITLE, IDS_WELCOME2SUBTITLE)
  17. {
  18. m_dwPageId = IDD_WIZWELCOME2;
  19. ppsp->pszTemplate = MAKEINTRESOURCE(m_dwPageId);
  20. m_pDisplayModes = NULL;
  21. m_nDisplayModes = 0;
  22. m_nBestDisplayMode = -1;
  23. m_IntlVal = FALSE;
  24. // These are our state variables so we know not to do these things twice.
  25. m_bMagnifierRun = FALSE;
  26. m_bResolutionSwitched = FALSE;
  27. m_bFontsChanged = FALSE;
  28. }
  29. CWelcome2Pg::~CWelcome2Pg(
  30. VOID
  31. )
  32. {
  33. if(m_pDisplayModes)
  34. delete [] m_pDisplayModes;
  35. }
  36. LRESULT
  37. CWelcome2Pg::OnInitDialog(
  38. HWND hwnd,
  39. WPARAM wParam,
  40. LPARAM lParam
  41. )
  42. {
  43. // Enumerate available video modes
  44. // Check if SM_CMONITORS is > 0 then set text so we don't
  45. // change resolution.
  46. DEVMODE dm;
  47. // Calculate number of display modes
  48. for(m_nDisplayModes=0;m_nDisplayModes<2000;m_nDisplayModes++) // Limit to 2000 display modes. If it is this high, something is wrong
  49. if(!EnumDisplaySettings(NULL, m_nDisplayModes, &dm))
  50. break;
  51. m_pDisplayModes = new CDisplayModeInfo[m_nDisplayModes];
  52. for(int i=0;i<m_nDisplayModes;i++)
  53. EnumDisplaySettings(NULL, i, &m_pDisplayModes[i].m_DevMode);
  54. m_nBestDisplayMode = -1;
  55. memset(&m_dvmdOrig, 0, sizeof(m_dvmdOrig));
  56. HDC hdc = GetDC(NULL); // Screen DC used to get current display settings
  57. // JMC: HOW DO WE GET dmDisplayFlags?
  58. // TODO: Maybe use ChangeDisplaySettings(NULL, 0) to restore original mode
  59. m_dvmdOrig.dmSize = sizeof(m_dvmdOrig);
  60. m_dvmdOrig.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | /* DM_DISPLAYFLAGS | */(g_Options.m_bWin95?0:DM_DISPLAYFREQUENCY);
  61. m_dvmdOrig.dmPelsWidth = GetDeviceCaps(hdc, HORZRES);
  62. m_dvmdOrig.dmPelsHeight = GetDeviceCaps(hdc, VERTRES);
  63. m_dvmdOrig.dmBitsPerPel = GetDeviceCaps(hdc, BITSPIXEL);
  64. m_dvmdOrig.dmDisplayFrequency = g_Options.m_bWin95?0:GetDeviceCaps(hdc, VREFRESH);
  65. ReleaseDC(NULL, hdc);
  66. for(i=0;i<m_nDisplayModes;i++)
  67. {
  68. // Skip anything 'higher' than current mode
  69. if( m_pDisplayModes[i].m_DevMode.dmPelsWidth > m_dvmdOrig.dmPelsWidth
  70. || m_pDisplayModes[i].m_DevMode.dmPelsHeight > m_dvmdOrig.dmPelsHeight
  71. || m_pDisplayModes[i].m_DevMode.dmBitsPerPel > m_dvmdOrig.dmBitsPerPel
  72. || (!g_Options.m_bWin95 && m_pDisplayModes[i].m_DevMode.dmDisplayFrequency > m_dvmdOrig.dmDisplayFrequency) )
  73. continue;
  74. // Skip this if it is 'worse' than the current best mode
  75. if( -1 != m_nBestDisplayMode
  76. && ( m_pDisplayModes[i].m_DevMode.dmPelsWidth < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsWidth
  77. || m_pDisplayModes[i].m_DevMode.dmPelsHeight < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsHeight
  78. || m_pDisplayModes[i].m_DevMode.dmBitsPerPel < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmBitsPerPel
  79. || (!g_Options.m_bWin95 && m_pDisplayModes[i].m_DevMode.dmDisplayFrequency < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmDisplayFrequency) ) )
  80. continue;
  81. // Skip anything 'less than' 800 x 600 (JMC: Used to be 640 x 480)
  82. if( m_pDisplayModes[i].m_DevMode.dmPelsWidth < 800
  83. || m_pDisplayModes[i].m_DevMode.dmPelsHeight < 600 )
  84. continue;
  85. // See if this is 'smaller' than the current resolution
  86. if( m_pDisplayModes[i].m_DevMode.dmPelsHeight < m_dvmdOrig.dmPelsHeight )
  87. m_nBestDisplayMode = i;
  88. }
  89. // Get original metrics
  90. GetNonClientMetrics(&m_ncmOrig, &m_lfIconOrig);
  91. SetCheckBoxesFromWelcomePageInfo();
  92. // Set the Personalized menu check box
  93. HKEY hKey;
  94. DWORD dwType;
  95. TCHAR lpszData[24];
  96. DWORD dwCount = 24;
  97. if(ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, REGSTR_INTELLIMENU, 0, KEY_QUERY_VALUE, &hKey))
  98. {
  99. if ( ERROR_SUCCESS == RegQueryValueEx( hKey, STRMENU, NULL, &dwType, (LPBYTE)lpszData, &dwCount ) )
  100. {
  101. lpszData[ARRAYSIZE(lpszData)-1] = TEXT('\0'); // ensure NUL termination
  102. if ( lstrcmp(lpszData, TEXT("No") ) == 0 )
  103. m_IntlVal = TRUE;
  104. }
  105. }
  106. Button_SetCheck(GetDlgItem(hwnd, IDC_PERMENU), m_IntlVal);
  107. return 1;
  108. }
  109. void CWelcome2Pg::UpdateControls()
  110. {
  111. BOOL bChangeRes = Button_GetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION));
  112. BOOL bChangeFont = Button_GetCheck(GetDlgItem(m_hwnd, IDC_CHANGEFONTS));
  113. BOOL bMagnifier = Button_GetCheck(GetDlgItem(m_hwnd, IDC_USEMAGNIFY));
  114. DWORD_PTR result;
  115. if(bChangeRes && !m_bResolutionSwitched)
  116. {
  117. if(IDOK != StringTableMessageBox(m_hwnd,IDS_WIZCHANGESHAPPENINGTEXT, IDS_WIZCHANGESHAPPENINGTITLE, MB_OKCANCEL))
  118. {
  119. // The user does not want to do this
  120. Button_SetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), FALSE);
  121. }
  122. else
  123. {
  124. // Lets change the resolution
  125. if(DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettings(&m_pDisplayModes[m_nBestDisplayMode].m_DevMode, CDS_TEST))
  126. {
  127. }
  128. else
  129. ChangeDisplaySettings(&m_pDisplayModes[m_nBestDisplayMode].m_DevMode, CDS_UPDATEREGISTRY | CDS_GLOBAL);
  130. if(IDOK != StringTableMessageBox(m_hwnd, IDS_WIZCANCELCHANGESTEXT, IDS_WIZCANCELCHANGESTITLE, MB_OKCANCEL))
  131. {
  132. // Restore original settings
  133. ChangeDisplaySettings(&m_dvmdOrig, CDS_UPDATEREGISTRY | CDS_GLOBAL);
  134. Button_SetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), FALSE);
  135. }
  136. else
  137. m_bResolutionSwitched = TRUE; // We REALLY changed the settings
  138. }
  139. }
  140. else if (!bChangeRes && m_bResolutionSwitched)
  141. {
  142. m_bResolutionSwitched = FALSE;
  143. // Restore original settings
  144. ChangeDisplaySettings(&m_dvmdOrig, CDS_UPDATEREGISTRY | CDS_GLOBAL);
  145. }
  146. if(bChangeFont && !m_bFontsChanged)
  147. {
  148. m_bFontsChanged = TRUE;
  149. // Get current metrics
  150. NONCLIENTMETRICS ncm;
  151. memset(&ncm, 0, sizeof(ncm));
  152. ncm.cbSize = sizeof(ncm);
  153. SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
  154. LOGFONT lf;
  155. memset(&lf, 0, sizeof(lf));
  156. lf.lfHeight = -MulDiv(g_Options.m_nMinimalFontSize, g_Options.m_nLogPixelsY, 72);
  157. lf.lfWeight = FW_BOLD;
  158. lf.lfCharSet = g_Options.m_lfCharSet;
  159. LoadString(g_hInstDll, IDS_SYSTEMFONTNAME, lf.lfFaceName, ARRAYSIZE(lf.lfFaceName));
  160. // Captions are BOLD
  161. ncm.lfCaptionFont = lf;
  162. lf.lfWeight = FW_NORMAL;
  163. ncm.lfSmCaptionFont = lf;
  164. ncm.lfMenuFont = lf;
  165. ncm.lfStatusFont = lf;
  166. ncm.lfMessageFont = lf;
  167. // DYNAMICS
  168. // JMC: TODO: Change caption height / menu height / button width to match.
  169. // JMC: HACK
  170. lf.lfWeight = FW_BOLD; // Caption is BOLD
  171. HFONT hFont = CreateFontIndirect(&lf);
  172. lf.lfWeight = FW_NORMAL; // Still need lf for ICON
  173. TEXTMETRIC tm;
  174. HDC hdc = GetDC(m_hwnd);
  175. HFONT hfontOld = (HFONT)SelectObject(hdc, hFont);
  176. GetTextMetrics(hdc, &tm);
  177. if (hfontOld)
  178. SelectObject(hdc, hfontOld);
  179. ReleaseDC(m_hwnd, hdc);
  180. /*int cyBorder = GetSystemMetrics(SM_CYBORDER);
  181. int nSize = abs(lf.lfHeight) + abs(tm.tmExternalLeading) + 2 * cyBorder;
  182. nSize = max(nSize, GetSystemMetrics(SM_CYICON)/2 + 2 * cyBorder);*/
  183. // The above calculation of metric sizes is incorrect, Morever, The other values
  184. // are also wrong..So using hardcoded values: Based on Display.cpl
  185. // BUG: Changes maybe required for 9x here!!
  186. if (g_Options.m_nMinimalFontSize >= 14 )
  187. ncm.iCaptionWidth = ncm.iCaptionHeight = 26;
  188. else
  189. ncm.iCaptionWidth = ncm.iCaptionHeight = 18;
  190. ncm.iSmCaptionWidth = 15;
  191. ncm.iSmCaptionHeight = 15;
  192. ncm.iMenuWidth = 18;
  193. ncm.iMenuHeight = 18;
  194. SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(ncm), &ncm, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  195. SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(lf), &lf, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  196. SendMessageTimeout(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0, SMTO_ABORTIFHUNG, 5000, &result );
  197. SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (LPARAM)__TEXT("WindowMetrics"),
  198. SMTO_ABORTIFHUNG, 5000, &result);
  199. // HACK - TODO Remove this from here
  200. g_Options.m_schemePreview.m_PortableNonClientMetrics.LoadOriginal();
  201. g_Options.m_schemeCurrent.m_PortableNonClientMetrics.LoadOriginal();
  202. }
  203. else if (!bChangeFont && m_bFontsChanged)
  204. {
  205. m_bFontsChanged = FALSE;
  206. SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(m_ncmOrig), &m_ncmOrig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  207. SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(m_lfIconOrig), &m_lfIconOrig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  208. SendMessageTimeout(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0, SMTO_ABORTIFHUNG, 5000, &result);
  209. SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (LPARAM)__TEXT("WindowMetrics"),
  210. SMTO_ABORTIFHUNG, 5000, &result);
  211. // HACK - TODO Remove this from here
  212. g_Options.m_schemePreview.m_PortableNonClientMetrics.LoadOriginal();
  213. g_Options.m_schemeCurrent.m_PortableNonClientMetrics.LoadOriginal();
  214. }
  215. if(bMagnifier && !m_bMagnifierRun)
  216. {
  217. // Start magnifier
  218. m_bMagnifierRun = TRUE;
  219. TCHAR szMagnifyPath[_MAX_PATH+2];
  220. TCHAR szSystemDir[_MAX_PATH];
  221. TCHAR szSystemDirPath[_MAX_PATH+2];
  222. const TCHAR c_szMagnifier[] = TEXT("\\Magnify.exe\"");
  223. const TCHAR c_szQuote[] = TEXT("\"");
  224. LPTSTR pszDestEnd;
  225. size_t cchRemaining;
  226. LPTSTR pszIEDestEnd;
  227. size_t cchIERemaining;
  228. HRESULT hrSystemDir;
  229. // Form quoted system path
  230. GetSystemDirectory(szSystemDir,ARRAYSIZE(szSystemDir));
  231. StringCchCopyEx(szSystemDirPath, ARRAYSIZE(szSystemDirPath), c_szQuote, &pszDestEnd, &cchRemaining, 0);
  232. StringCchCopyEx(pszDestEnd, cchRemaining, szSystemDir, &pszDestEnd, &cchRemaining, 0);
  233. hrSystemDir = StringCchCopyEx(pszDestEnd, cchRemaining, c_szQuote, &pszDestEnd,&cchRemaining, 0);
  234. // Form quoted executable path
  235. StringCchCopyEx(szMagnifyPath, ARRAYSIZE(szMagnifyPath),c_szQuote,&pszDestEnd,&cchRemaining, 0);
  236. StringCchCopyEx(pszDestEnd,cchRemaining,szSystemDir, &pszDestEnd, &cchRemaining, 0);
  237. if (S_OK==hrSystemDir && S_OK==StringCchCopyEx(pszDestEnd,cchRemaining,c_szMagnifier,&pszDestEnd,&cchRemaining, 0))
  238. {
  239. ShellExecute(NULL, NULL, szMagnifyPath, NULL, szSystemDirPath, SW_SHOWNORMAL/*SW_SHOWMINIMIZED*/);
  240. }
  241. }
  242. else if (!bMagnifier && m_bMagnifierRun)
  243. {
  244. // Stop magnifier
  245. m_bMagnifierRun = FALSE;
  246. TCHAR szMag[200];
  247. LoadString(g_hInstDll, IDS_NAMEOFMAGNIFIER, szMag, ARRAYSIZE(szMag));
  248. if(HWND hwnd = FindWindow(NULL, szMag))
  249. SendMessage(hwnd, WM_CLOSE, 0, 0);
  250. }
  251. }
  252. void CWelcome2Pg::SetCheckBoxesFromWelcomePageInfo()
  253. {
  254. // This algorithm chooses which check boxes to set based on the
  255. // minimal legible font size specified in g_Options.m_nMinimalFontSize
  256. // HACK:
  257. // g_Options.m_nMinimalFontSize = MulDiv(abs(g_Options.m_schemePreview.m_ncm.lfCaptionFont.lfHeight), 72, g_Options.m_nLogPixelsY);
  258. BOOL bSwitchRes = FALSE;
  259. BOOL bChangeFonts = FALSE;
  260. BOOL bUseMagnify = FALSE;
  261. switch(g_Options.m_nMinimalFontSize)
  262. {
  263. case 8:
  264. case 9: // Required for JPN
  265. case 10:
  266. case 11: // Required For JPN
  267. bChangeFonts = TRUE;
  268. break;
  269. case 12:
  270. bChangeFonts = TRUE;
  271. bSwitchRes = TRUE;
  272. break;
  273. case 14:
  274. case 15: // Required for JPN
  275. case 16:
  276. case 18:
  277. case 20:
  278. case 22:
  279. case 24:
  280. bChangeFonts = TRUE;
  281. bUseMagnify = TRUE;
  282. break;
  283. }
  284. // JMC: TODO: Handle if the user does not have permission to change
  285. // the display settings!!!!!!!!!!!!!!
  286. if(-1 == m_nBestDisplayMode)
  287. {
  288. bSwitchRes = FALSE;
  289. // SetWindowText(GetDlgItem(m_hwnd, IDC_SZRESMESSAGE),
  290. // __TEXT("There are no display resolutions that would be better for the size text you chose."));
  291. EnableWindow(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), FALSE);
  292. }
  293. else
  294. {
  295. #if 0 // We don't display special text any more
  296. TCHAR sz[200];
  297. TCHAR szTemp[1024];
  298. LoadString(g_hInstDll, IDS_DISPLAYRESOLUTIONINFO, szTemp, ARRAYSIZE(szTemp));
  299. wsprintf(sz, szTemp,
  300. m_dvmdOrig.dmPelsWidth,
  301. m_dvmdOrig.dmPelsHeight,
  302. m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsWidth,
  303. m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsHeight);
  304. SetWindowText(GetDlgItem(m_hwnd, IDC_SZRESMESSAGE), sz);
  305. #endif
  306. EnableWindow(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), TRUE);
  307. }
  308. Button_SetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), bSwitchRes);
  309. Button_SetCheck(GetDlgItem(m_hwnd, IDC_CHANGEFONTS), bChangeFonts);
  310. Button_SetCheck(GetDlgItem(m_hwnd, IDC_USEMAGNIFY), bUseMagnify);
  311. UpdateControls();
  312. }
  313. LRESULT
  314. CWelcome2Pg::OnCommand(
  315. HWND hwnd,
  316. WPARAM wParam,
  317. LPARAM lParam
  318. )
  319. {
  320. LRESULT lResult = 1;
  321. WORD wNotifyCode = HIWORD(wParam);
  322. WORD wCtlID = LOWORD(wParam);
  323. HWND hwndCtl = (HWND)lParam;
  324. // NOTE: DO NOT CALL UpdateControls()
  325. // UpdateControls() should only be called when entering this page
  326. // since it sets the check boxes based on the minimal font size
  327. // determined by the previous wizard page
  328. switch(wCtlID)
  329. {
  330. case IDC_SWITCHRESOLUTION:
  331. case IDC_CHANGEFONTS:
  332. case IDC_USEMAGNIFY:
  333. UpdateControls();
  334. lResult = 0;
  335. break;
  336. default:
  337. break;
  338. }
  339. return lResult;
  340. }
  341. LRESULT
  342. CWelcome2Pg::OnPSN_SetActive(
  343. HWND hwnd,
  344. INT idCtl,
  345. LPPSHNOTIFY pnmh
  346. )
  347. {
  348. // Call the base class
  349. WizardPage::OnPSN_SetActive(hwnd, idCtl, pnmh);
  350. // Make sure our check boxes reflect any change in the minimal
  351. // font size specified by g_Options.m_nMinimalFontSize
  352. if(g_Options.m_bWelcomePageTouched)
  353. {
  354. g_Options.m_bWelcomePageTouched = FALSE;
  355. SetCheckBoxesFromWelcomePageInfo();
  356. }
  357. return TRUE;
  358. }
  359. LRESULT
  360. CWelcome2Pg::OnPSN_WizNext(
  361. HWND hwnd,
  362. INT idCtl,
  363. LPPSHNOTIFY pnmh
  364. )
  365. {
  366. BOOL bIMenu = Button_GetCheck(GetDlgItem(m_hwnd, IDC_PERMENU));
  367. if (!m_bFontsChanged)
  368. {
  369. g_Options.m_schemePreview.m_nSelectedSize = g_Options.m_schemeOriginal.m_nSelectedSize;
  370. }
  371. // If Intelli-menus are changed
  372. if(bIMenu != m_IntlVal)
  373. {
  374. HKEY hKey;
  375. DWORD_PTR result;
  376. LPTSTR psz = bIMenu ? TEXT("No") : TEXT("Yes");
  377. // Change the Registry entries....
  378. if ( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, REGSTR_INTELLIMENU, 0, KEY_SET_VALUE, &hKey) )
  379. {
  380. RegSetValueEx( hKey, STRMENU, 0, REG_SZ, (LPBYTE)psz,
  381. (lstrlen(psz) + 1) * sizeof(TCHAR) );
  382. RegCloseKey(hKey);
  383. }
  384. if ( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, REGSTR_IE, 0, KEY_SET_VALUE, &hKey) )
  385. {
  386. RegSetValueEx( hKey, FAVMENU, 0, REG_SZ, (LPBYTE)psz,
  387. (lstrlen(psz) + 1) * sizeof(TCHAR) );
  388. RegCloseKey(hKey);
  389. }
  390. m_IntlVal = bIMenu;
  391. SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
  392. (LPARAM) 0, SMTO_ABORTIFHUNG, 5000, &result);
  393. }
  394. return WizardPage::OnPSN_WizNext(hwnd, idCtl, pnmh);
  395. }
  396. LRESULT
  397. CWelcome2Pg::OnPSN_WizBack(
  398. HWND hwnd,
  399. INT idCtl,
  400. LPPSHNOTIFY pnmh
  401. )
  402. {
  403. // Undo any changes
  404. Button_SetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), FALSE);
  405. Button_SetCheck(GetDlgItem(m_hwnd, IDC_CHANGEFONTS), FALSE);
  406. Button_SetCheck(GetDlgItem(m_hwnd, IDC_USEMAGNIFY), FALSE);
  407. // While going back. Just update variables only. Don't apply changes.
  408. // DONOT call UpdateControls(): a-anilk
  409. BOOL bChangeRes = Button_GetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION));
  410. BOOL bChangeFont = Button_GetCheck(GetDlgItem(m_hwnd, IDC_CHANGEFONTS));
  411. BOOL bMagnifier = Button_GetCheck(GetDlgItem(m_hwnd, IDC_USEMAGNIFY));
  412. m_bFontsChanged = FALSE;
  413. return WizardPage::OnPSN_WizBack(hwnd, idCtl, pnmh);
  414. }