pgmintx2.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 10k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "pch.hxx" // pch
  2. #pragma hdrstop
  3. #include "resource.h"
  4. #include "pgMinTx2.h"
  5. CMinText2Pg::CMinText2Pg(
  6. LPPROPSHEETPAGE ppsp
  7. ) : WizardPage(ppsp, IDS_LKPREV_MINTEXT2TITLE, IDS_LKPREV_MINTEXT2SUBTITLE)
  8. {
  9. m_dwPageId = IDD_FNTWIZMINTEXT2;
  10. ppsp->pszTemplate = MAKEINTRESOURCE(m_dwPageId);
  11. m_pDisplayModes = NULL;
  12. m_nDisplayModes = 0;
  13. m_nBestDisplayMode = -1;
  14. }
  15. CMinText2Pg::~CMinText2Pg(
  16. VOID
  17. )
  18. {
  19. if(m_pDisplayModes)
  20. delete [] m_pDisplayModes;
  21. }
  22. LRESULT
  23. CMinText2Pg::OnInitDialog(
  24. HWND hwnd,
  25. WPARAM wParam,
  26. LPARAM lParam
  27. )
  28. {
  29. // Enumerate available video modes
  30. // JMC: TODO: Make Multi Monitory support
  31. // Check if SM_CMONITORS is > 0 then set text so we don't
  32. // change resolution.
  33. DEVMODE dm;
  34. // Calculate number of display modes
  35. for(m_nDisplayModes=0;m_nDisplayModes<2000;m_nDisplayModes++) // Limit to 2000 display modes.  If it is this high, something is wrong
  36. if(!EnumDisplaySettings(NULL, m_nDisplayModes, &dm))
  37. break;
  38. m_pDisplayModes = new CDisplayModeInfo[m_nDisplayModes];
  39. for(int i=0;i<m_nDisplayModes;i++)
  40. EnumDisplaySettings(NULL, i, &m_pDisplayModes[i].m_DevMode);
  41. UpdateControls();
  42. return 1;
  43. }
  44. void CMinText2Pg::UpdateControls()
  45. {
  46. // This algorithm chooses which check boxes to set based on the
  47. // minimal legible font size specified in g_Options.m_nMinimalFontSize
  48. // HACK:
  49. g_Options.m_nMinimalFontSize = MulDiv(abs(g_Options.m_schemePreview.m_ncm.lfCaptionFont.lfHeight), 72, g_Options.m_nLogPixelsY);
  50. BOOL bSwitchRes = FALSE;
  51. BOOL bChangeFonts = FALSE;
  52. BOOL bUseMagnify = FALSE;
  53. switch(g_Options.m_nMinimalFontSize)
  54. {
  55. case 8:
  56. case 10:
  57. case 12:
  58. bChangeFonts = TRUE;
  59. break;
  60. case 14:
  61. case 16:
  62. case 18:
  63. bChangeFonts = TRUE;
  64. bSwitchRes = TRUE;
  65. break;
  66. case 20:
  67. case 22:
  68. case 24:
  69. bChangeFonts = TRUE;
  70. bUseMagnify = TRUE;
  71. }
  72. m_nBestDisplayMode = -1;
  73. DEVMODE dvmdOrig;
  74. memset(&dvmdOrig, 0, sizeof(dvmdOrig));
  75. HDC hdc = GetDC(NULL);  // Screen DC used to get current display settings
  76. dvmdOrig.dmPelsWidth        = GetDeviceCaps(hdc, HORZRES);
  77. dvmdOrig.dmPelsHeight       = GetDeviceCaps(hdc, VERTRES);
  78. dvmdOrig.dmBitsPerPel       = GetDeviceCaps(hdc, BITSPIXEL);
  79. dvmdOrig.dmDisplayFrequency = GetDeviceCaps(hdc, VREFRESH);
  80. ReleaseDC(NULL, hdc);
  81. for(int i=0;i<m_nDisplayModes;i++)
  82. {
  83. // Skip anything 'higher' than current mode
  84. if( m_pDisplayModes[i].m_DevMode.dmPelsWidth > dvmdOrig.dmPelsWidth
  85. || m_pDisplayModes[i].m_DevMode.dmPelsHeight > dvmdOrig.dmPelsHeight
  86. || m_pDisplayModes[i].m_DevMode.dmBitsPerPel > dvmdOrig.dmBitsPerPel
  87. || m_pDisplayModes[i].m_DevMode.dmDisplayFrequency > dvmdOrig.dmDisplayFrequency )
  88. continue;
  89. // Skip this if it is 'worse' than the current best mode
  90. if( -1 != m_nBestDisplayMode
  91. && ( m_pDisplayModes[i].m_DevMode.dmPelsWidth < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsWidth
  92. || m_pDisplayModes[i].m_DevMode.dmPelsHeight < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsHeight
  93. || m_pDisplayModes[i].m_DevMode.dmBitsPerPel < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmBitsPerPel
  94. || m_pDisplayModes[i].m_DevMode.dmDisplayFrequency < m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmDisplayFrequency ) )
  95. continue;
  96. // Skip anything 'less than' 640 x 480
  97. if( m_pDisplayModes[i].m_DevMode.dmPelsWidth < 640
  98. || m_pDisplayModes[i].m_DevMode.dmPelsHeight < 480 )
  99. continue;
  100. // See if this is 'smaller' than the current resolution
  101. if( m_pDisplayModes[i].m_DevMode.dmPelsHeight < dvmdOrig.dmPelsHeight )
  102. m_nBestDisplayMode = i;
  103. }
  104. // JMC: TODO: Handle if the user does not have permission to change
  105. // the display settings!!!!!!!!!!!!!!
  106. if(-1 == m_nBestDisplayMode)
  107. {
  108. bSwitchRes = FALSE;
  109. SetWindowText(GetDlgItem(m_hwnd, IDC_SZRESMESSAGE),
  110. __TEXT("There are no display resolutions that would be better for the size text you chose."));
  111. EnableWindow(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), FALSE);
  112. }
  113. else
  114. {
  115. TCHAR sz[200];
  116. wsprintf(sz, __TEXT("You are currently at %i x %i.  By switching to %i x %i, the text on screen will be more readable."),
  117. dvmdOrig.dmPelsWidth,
  118. dvmdOrig.dmPelsHeight,
  119. m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsWidth,
  120. m_pDisplayModes[m_nBestDisplayMode].m_DevMode.dmPelsHeight);
  121. SetWindowText(GetDlgItem(m_hwnd, IDC_SZRESMESSAGE), sz);
  122. EnableWindow(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), TRUE);
  123. }
  124. Button_SetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION), bSwitchRes);
  125. Button_SetCheck(GetDlgItem(m_hwnd, IDC_CHANGEFONTS), bChangeFonts);
  126. Button_SetCheck(GetDlgItem(m_hwnd, IDC_USEMAGNIFY), bUseMagnify);
  127. }
  128. LRESULT
  129. CMinText2Pg::OnCommand(
  130. HWND hwnd,
  131. WPARAM wParam,
  132. LPARAM lParam
  133. )
  134. {
  135. LRESULT lResult = 1;
  136. WORD wNotifyCode = HIWORD(wParam);
  137. WORD wCtlID      = LOWORD(wParam);
  138. HWND hwndCtl     = (HWND)lParam;
  139. // JMC: NOTE: DO NOT CALL UpdateControls()
  140. // UpdateControls() should only be called when entering this page
  141. // since it sets the check boxes based on the minimal font size
  142. // determined by the previous wizard page
  143. /*
  144. switch(wCtlID)
  145. {
  146. case IDC_BTN_INCREASE_SIZE:
  147. UpdateControls();
  148. lResult = 0;
  149. break;
  150.   default:
  151.   break;
  152.   }
  153. */
  154. return lResult;
  155. }
  156. LRESULT
  157. CMinText2Pg::OnPSN_SetActive(
  158.  HWND hwnd, 
  159.  INT idCtl, 
  160.  LPPSHNOTIFY pnmh
  161.  )
  162. {
  163. // Call the base class
  164. WizardPage::OnPSN_SetActive(hwnd, idCtl, pnmh);
  165. // Make sure our check boxes reflect any change in the minimal
  166. // font size specified by g_Options.m_nMinimalFontSize
  167. UpdateControls();
  168. return TRUE;
  169. }
  170. LRESULT
  171. CMinText2Pg::OnPSN_WizNext(
  172.    HWND hwnd,
  173.    INT idCtl,
  174.    LPPSHNOTIFY pnmh
  175.    )
  176. {
  177. // Get original data
  178. DEVMODE dvmdOrig;
  179. memset(&dvmdOrig, 0, sizeof(dvmdOrig));
  180. HDC hdc = GetDC(NULL);  // Screen DC used to get current display settings
  181. int nLogPixelsY = GetDeviceCaps(hdc, LOGPIXELSY);
  182. // JMC: HOW DO WE GET dmDisplayFlags?
  183. // TODO: Maybe use ChangeDisplaySettings(NULL, 0) to restore original mode
  184. dvmdOrig.dmSize = sizeof(dvmdOrig);
  185. dvmdOrig.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | /* DM_DISPLAYFLAGS | */DM_DISPLAYFREQUENCY;
  186. dvmdOrig.dmPelsWidth        = GetDeviceCaps(hdc, HORZRES);
  187. dvmdOrig.dmPelsHeight       = GetDeviceCaps(hdc, VERTRES);
  188. dvmdOrig.dmBitsPerPel       = GetDeviceCaps(hdc, BITSPIXEL);
  189. dvmdOrig.dmDisplayFrequency = GetDeviceCaps(hdc, VREFRESH);
  190. ReleaseDC(NULL, hdc);
  191. NONCLIENTMETRICS ncm;
  192. memset(&ncm, 0, sizeof(ncm));
  193. ncm.cbSize = sizeof(ncm);
  194. SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
  195. NONCLIENTMETRICS ncmOrig = ncm;
  196. LOGFONT lfIconOrig;
  197. SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfIconOrig), &lfIconOrig, 0);
  198. BOOL bChangeRes = Button_GetCheck(GetDlgItem(m_hwnd, IDC_SWITCHRESOLUTION)) && -1 != m_nBestDisplayMode;
  199. BOOL bChangeFont = Button_GetCheck(GetDlgItem(m_hwnd, IDC_CHANGEFONTS));
  200. BOOL bMagnifier = Button_GetCheck(GetDlgItem(m_hwnd, IDC_USEMAGNIFY));
  201. BOOL bSomethingChanged = bChangeRes || bChangeFont || bMagnifier;
  202. if(bSomethingChanged)
  203. {
  204. if(IDOK != MessageBox(m_hwnd,
  205. __TEXT("These changes are going to take effect immediately.  If you don't 
  206. like the new settings, you will be given an opportunity to undo the changes.  If for some 
  207. reason your display becomes illegible, press the ESCAPE key once."), __TEXT("Accessability Wizard"), MB_OKCANCEL))
  208. {
  209. SetWindowLong(hwnd, DWL_MSGRESULT, m_dwPageId);
  210. return TRUE;
  211. }
  212. }
  213. if(bChangeRes)
  214. {
  215. // Change the resolution
  216. if(DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettings(&m_pDisplayModes[m_nBestDisplayMode].m_DevMode, CDS_TEST))
  217. {
  218. // JMC: TODO: What should we do.  This may mean that a RESTART is required
  219. }
  220. else
  221. ChangeDisplaySettings(&m_pDisplayModes[m_nBestDisplayMode].m_DevMode, CDS_UPDATEREGISTRY | CDS_GLOBAL);
  222. }
  223. if(bChangeFont)
  224. {
  225. LOGFONT lf;
  226. memset(&lf, 0, sizeof(lf));
  227. lf.lfHeight = -MulDiv(g_Options.m_nMinimalFontSize, nLogPixelsY, 72);
  228. lf.lfWeight = FW_BOLD;
  229. lstrcpy(lf.lfFaceName, __TEXT("Tahoma"));
  230. // Captions are BOLD
  231. ncm.lfCaptionFont = lf;
  232. lf.lfWeight = FW_NORMAL;
  233. ncm.lfSmCaptionFont = lf;// JMC: TODO: Use a different Small Caption Font
  234. ncm.lfMenuFont = lf;
  235. ncm.lfStatusFont = lf;
  236. ncm.lfMessageFont = lf;
  237. // DYNAMICS
  238. // JMC: TODO: Change caption height / menu height / button width to match.
  239. // JMC: HACK
  240. lf.lfWeight = FW_BOLD; // Caption is BOLD
  241. HFONT hFont = CreateFontIndirect(&lf);
  242. lf.lfWeight = FW_NORMAL; // Still need lf for ICON
  243. TEXTMETRIC tm;
  244. HDC hdc = GetDC(m_hwnd);
  245. HFONT hfontOld = (HFONT)SelectObject(hdc, hFont);
  246. GetTextMetrics(hdc, &tm);
  247. if (hfontOld)
  248. SelectObject(hdc, hfontOld);
  249. ReleaseDC(m_hwnd, hdc);
  250. int cyBorder = GetSystemMetrics(SM_CYBORDER);
  251. int nSize = abs(lf.lfHeight) + abs(tm.tmExternalLeading) + 2 * cyBorder;
  252. nSize = max(nSize, GetSystemMetrics(SM_CYICON)/2 + 2 * cyBorder);
  253. ncm.iCaptionWidth = nSize;
  254. ncm.iCaptionHeight = nSize;
  255. ncm.iSmCaptionWidth = nSize;
  256. ncm.iSmCaptionHeight = nSize;
  257. ncm.iMenuWidth = nSize;
  258. ncm.iMenuHeight = nSize;
  259. SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(ncm), &ncm, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  260. SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(lf), &lf, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  261. SendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
  262. SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (LPARAM)__TEXT("WindowMetrics"));
  263. }
  264. if(bMagnifier)
  265. {
  266. ShellExecute(NULL, NULL, __TEXT("Magnify.exe"), NULL, NULL, SW_SHOWNORMAL);
  267. }
  268. if(bSomethingChanged && IDYES != MessageBox(m_hwnd, __TEXT("Are these settings acceptable"), __TEXT("Accessability Wizard"), MB_YESNOCANCEL))
  269. {
  270. // Restore original settings
  271. ChangeDisplaySettings(&dvmdOrig, CDS_UPDATEREGISTRY | CDS_GLOBAL);
  272. SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(ncmOrig), &ncmOrig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  273. SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(lfIconOrig), &lfIconOrig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  274. SendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
  275. SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (LPARAM)__TEXT("WindowMetrics"));
  276. SetWindowLong(hwnd, DWL_MSGRESULT, m_dwPageId);
  277. return TRUE;
  278. }
  279. return WizardPage::OnPSN_WizNext(hwnd, idCtl, pnmh);
  280. }