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

Windows Kernel

Development Platform:

Visual C++

  1. /*  LOOKDLG.C
  2. **
  3. **  Copyright (C) Microsoft, 1993, All Rights Reserved.
  4. **
  5. **
  6. **  History:
  7. **
  8. */
  9. #include "pch.hxx" // PCH
  10. #pragma hdrstop
  11. #include "AccWiz.h"
  12. #include "desk.h"
  13. #include "deskid.h"
  14. #include "look.h"
  15. #include <commdlg.h>
  16. #include <commctrl.h>
  17. #include <regstr.h>
  18. #include "ntprivatewindowsinchelp.h"
  19. #define RGB_PALETTE 0x02000000
  20. void FAR SetMagicColors(HDC, DWORD, WORD);
  21. #define CENTRIES_3D 3
  22. HPALETTE g_hpal3D = NULL;               // only exist if palette device
  23. HPALETTE g_hpalVGA = NULL;              // only exist if palette device
  24. BOOL g_bPalette = FALSE;                // is this a palette device?
  25. int cyBorder;
  26. int cxBorder;
  27. int cxEdge;
  28. int cyEdge;
  29. HWND g_hwndTooltip;
  30. LOOK_FONT g_fonts[NUM_FONTS];
  31. HBRUSH g_brushes[NT40_COLOR_MAX];
  32. BOOL g_bInit = TRUE;
  33. BOOL g_fProprtySheetExiting = FALSE;
  34. #define METRIC_CHANGE 0x0001
  35. #define COLOR_CHANGE  0x0002
  36. #define SCHEME_CHANGE 0x8000
  37. UINT g_fChanged;
  38. LOOK_SIZE g_sizes[NUM_SIZES] = {
  39. /* SIZE_FRAME */        {0, 0, 50},
  40. /* SIZE_SCROLL */       {0, 8, 100},
  41. /* SIZE_CAPTION */      {0, 8, 100},
  42. /* SIZE_SMCAPTION */    {0, 4, 100},
  43. /* SIZE_MENU */         {0, 8, 100},
  44. /* SIZE_DXICON */       {0, 0, 150},    // x spacing
  45. /* SIZE_DYICON */       {0, 0, 150},    // y spacing
  46. /* SIZE_ICON */         {0, 16, 72},    // shell icon size
  47. /* SIZE_SMICON */       {0, 8, 36},     // shell small icon size
  48. };
  49. LOOK_SIZE g_elCurSize;
  50. #define COLORFLAG_SOLID 0x0001
  51. UINT g_colorFlags[NT40_COLOR_MAX] = {
  52. /* COLOR_SCROLLBAR           */ 0,
  53. /* COLOR_DESKTOP             */ 0,
  54. /* COLOR_ACTIVECAPTION       */ COLORFLAG_SOLID,
  55. /* COLOR_INACTIVECAPTION     */ COLORFLAG_SOLID,
  56. /* COLOR_MENU                */ COLORFLAG_SOLID,
  57. /* COLOR_WINDOW              */ COLORFLAG_SOLID,
  58. /* COLOR_WINDOWFRAME         */ COLORFLAG_SOLID,
  59. /* COLOR_MENUTEXT            */ COLORFLAG_SOLID,
  60. /* COLOR_WINDOWTEXT          */ COLORFLAG_SOLID,
  61. /* COLOR_CAPTIONTEXT         */ COLORFLAG_SOLID,
  62. /* COLOR_ACTIVEBORDER        */ 0,
  63. /* COLOR_INACTIVEBORDER      */ 0,
  64. /* COLOR_APPWORKSPACE        */ 0,
  65. /* COLOR_HIGHLIGHT           */ COLORFLAG_SOLID,
  66. /* COLOR_HIGHLIGHTTEXT       */ COLORFLAG_SOLID,
  67. /* COLOR_3DFACE              */ COLORFLAG_SOLID,
  68. /* COLOR_3DSHADOW            */ COLORFLAG_SOLID,
  69. /* COLOR_GRAYTEXT            */ COLORFLAG_SOLID,
  70. /* COLOR_BTNTEXT             */ COLORFLAG_SOLID,
  71. /* COLOR_INACTIVECAPTIONTEXT */ COLORFLAG_SOLID,
  72. /* COLOR_3DHILIGHT           */ COLORFLAG_SOLID,
  73. /* COLOR_3DDKSHADOW          */ COLORFLAG_SOLID,
  74. /* COLOR_3DLIGHT             */ COLORFLAG_SOLID,
  75. /* COLOR_INFOTEXT            */ COLORFLAG_SOLID,
  76. /* COLOR_INFOBK              */ 0,
  77. /* COLOR_3DALTFACE           */ COLORFLAG_SOLID,
  78. /* COLOR_HOTLIGHT            */ COLORFLAG_SOLID,
  79. /* COLOR_GRADIENTACTIVECAPTION */ COLORFLAG_SOLID,
  80. /* COLOR_GRADIENTINACTIVECAPTION */ COLORFLAG_SOLID
  81. };
  82. // strings for color names.
  83. PTSTR s_pszColorNames[NT40_COLOR_MAX] = {
  84. /* COLOR_SCROLLBAR           */ TEXT("Scrollbar"),
  85. /* COLOR_DESKTOP             */ TEXT("Background"),
  86. /* COLOR_ACTIVECAPTION       */ TEXT("ActiveTitle"),
  87. /* COLOR_INACTIVECAPTION     */ TEXT("InactiveTitle"),
  88. /* COLOR_MENU                */ TEXT("Menu"),
  89. /* COLOR_WINDOW              */ TEXT("Window"),
  90. /* COLOR_WINDOWFRAME         */ TEXT("WindowFrame"),
  91. /* COLOR_MENUTEXT            */ TEXT("MenuText"),
  92. /* COLOR_WINDOWTEXT          */ TEXT("WindowText"),
  93. /* COLOR_CAPTIONTEXT         */ TEXT("TitleText"),
  94. /* COLOR_ACTIVEBORDER        */ TEXT("ActiveBorder"),
  95. /* COLOR_INACTIVEBORDER      */ TEXT("InactiveBorder"),
  96. /* COLOR_APPWORKSPACE        */ TEXT("AppWorkspace"),
  97. /* COLOR_HIGHLIGHT           */ TEXT("Hilight"),
  98. /* COLOR_HIGHLIGHTTEXT       */ TEXT("HilightText"),
  99. /* COLOR_3DFACE              */ TEXT("ButtonFace"),
  100. /* COLOR_3DSHADOW            */ TEXT("ButtonShadow"),
  101. /* COLOR_GRAYTEXT            */ TEXT("GrayText"),
  102. /* COLOR_BTNTEXT             */ TEXT("ButtonText"),
  103. /* COLOR_INACTIVECAPTIONTEXT */ TEXT("InactiveTitleText"),
  104. /* COLOR_3DHILIGHT           */ TEXT("ButtonHilight"),
  105. /* COLOR_3DDKSHADOW          */ TEXT("ButtonDkShadow"),
  106. /* COLOR_3DLIGHT             */ TEXT("ButtonLight"),
  107. /* COLOR_INFOTEXT            */ TEXT("InfoText"),
  108. /* COLOR_INFOBK              */ TEXT("InfoWindow"),
  109. /* COLOR_3DALTFACE           */ TEXT("ButtonAlternateFace"),
  110. /* COLOR_HOTLIGHT            */ TEXT("HotTracking"),
  111. /* COLOR_GRADIENTACTIVECAPTION */ TEXT("GradientActiveTitle"),
  112. /* COLOR_GRADIENTINACTIVECAPTION */ TEXT("GradientInactiveTitle")
  113. };
  114. TCHAR g_szColors[] = TEXT("colors");           // colors section name
  115. // Location of the Colors subkey in Registry; Defined in RegStr.h
  116. TCHAR szRegStr_Colors[] = REGSTR_PATH_COLORS;
  117. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  118. //this order has to match the enum order in look.h
  119. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  120. LOOK_ELEMENT g_elements[] = {
  121. /* ELEMENT_APPSPACE        */   {COLOR_APPWORKSPACE,    SIZE_NONE,      FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_APPSPACE, -1,       {-1,-1,-1,-1}, COLOR_NONE},
  122. /* ELEMENT_DESKTOP         */   {COLOR_BACKGROUND,      SIZE_NONE,      FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_DESKTOP, -1,        {-1,-1,-1,-1}, COLOR_NONE},
  123. /* ELEMENT_INACTIVEBORDER  */   {COLOR_INACTIVEBORDER,  SIZE_FRAME,     FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_INACTIVEBORDER, -1, {-1,-1,-1,-1}, COLOR_NONE},
  124. /* ELEMENT_ACTIVEBORDER    */   {COLOR_ACTIVEBORDER,    SIZE_FRAME,     FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_ACTIVEBORDER, -1,   {-1,-1,-1,-1}, COLOR_NONE},
  125. /* ELEMENT_INACTIVECAPTION */   {COLOR_INACTIVECAPTION, SIZE_CAPTION,   TRUE,    COLOR_INACTIVECAPTIONTEXT,FONT_CAPTION,ELNAME_INACTIVECAPTION, -1,{-1,-1,-1,-1}, COLOR_GRADIENTINACTIVECAPTION},
  126. /* ELEMENT_INACTIVESYSBUT1 */   {COLOR_NONE,            SIZE_CAPTION,   FALSE,   COLOR_NONE,             FONT_NONE,     -1, ELEMENT_ACTIVESYSBUT1, {-1,-1,-1,-1}, COLOR_NONE},
  127. /* ELEMENT_INACTIVESYSBUT2 */   {COLOR_NONE,            SIZE_CAPTION,   FALSE,   COLOR_NONE,             FONT_NONE,     -1, ELEMENT_ACTIVESYSBUT1, {-1,-1,-1,-1}, COLOR_NONE},
  128. /* ELEMENT_ACTIVECAPTION   */   {COLOR_ACTIVECAPTION,   SIZE_CAPTION,   TRUE,    COLOR_CAPTIONTEXT,      FONT_CAPTION,  ELNAME_ACTIVECAPTION, -1,  {-1,-1,-1,-1}, COLOR_GRADIENTACTIVECAPTION},
  129. /* ELEMENT_ACTIVESYSBUT1   */   {COLOR_NONE,            SIZE_CAPTION,   FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_CAPTIONBUTTON, -1,  {-1,-1,-1,-1}, COLOR_NONE},
  130. /* ELEMENT_ACTIVESYSBUT2   */   {COLOR_NONE,            SIZE_CAPTION,   FALSE,   COLOR_NONE,             FONT_NONE,     -1, ELEMENT_ACTIVESYSBUT1, {-1,-1,-1,-1}, COLOR_NONE},
  131. /* ELEMENT_MENUNORMAL      */   {COLOR_MENU,            SIZE_MENU,      TRUE,    COLOR_MENUTEXT,         FONT_MENU,     ELNAME_MENU, -1,           {-1,-1,-1,-1}, COLOR_NONE},
  132. /* ELEMENT_MENUSELECTED    */   {COLOR_HIGHLIGHT,       SIZE_MENU,      TRUE,    COLOR_HIGHLIGHTTEXT,    FONT_MENU,     ELNAME_MENUSELECTED, -1,   {-1,-1,-1,-1}, COLOR_NONE},
  133. /* ELEMENT_MENUDISABLED    */   {COLOR_MENU,            SIZE_MENU,      TRUE,    COLOR_NONE,             FONT_MENU,     -1, ELEMENT_MENUNORMAL,    {-1,-1,-1,-1}, COLOR_NONE},
  134. /* ELEMENT_WINDOW          */   {COLOR_WINDOW,          SIZE_NONE,      FALSE,   COLOR_WINDOWTEXT,       FONT_NONE,     ELNAME_WINDOW, -1,         {-1,-1,-1,-1}, COLOR_NONE},
  135. /* ELEMENT_MSGBOX          */   {COLOR_NONE,            SIZE_NONE,      TRUE,    COLOR_WINDOWTEXT,       FONT_MSGBOX,   ELNAME_MSGBOX, -1,         {-1,-1,-1,-1}, COLOR_NONE},
  136. /* ELEMENT_MSGBOXCAPTION   */   {COLOR_ACTIVECAPTION,   SIZE_CAPTION,   TRUE,    COLOR_CAPTIONTEXT,      FONT_CAPTION,  -1, ELEMENT_ACTIVECAPTION, {-1,-1,-1,-1}, COLOR_NONE},
  137. /* ELEMENT_MSGBOXSYSBUT    */   {COLOR_3DFACE,          SIZE_CAPTION,   TRUE,    COLOR_BTNTEXT,          FONT_CAPTION,  -1, ELEMENT_ACTIVESYSBUT1, {-1,-1,-1,-1}, COLOR_NONE},
  138. // do not even try to set a scrollbar color the system will ignore you
  139. /* ELEMENT_SCROLLBAR       */   {COLOR_NONE,            SIZE_SCROLL,    FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_SCROLLBAR, -1,      {-1,-1,-1,-1}, COLOR_NONE},
  140. /* ELEMENT_SCROLLUP        */   {COLOR_NONE,            SIZE_SCROLL,    FALSE,   COLOR_NONE,             FONT_NONE,     -1, ELEMENT_SCROLLBAR,     {-1,-1,-1,-1}, COLOR_NONE},
  141. /* ELEMENT_SCROLLDOWN      */   {COLOR_NONE,            SIZE_SCROLL,    FALSE,   COLOR_NONE,             FONT_NONE,     -1, ELEMENT_SCROLLBAR,     {-1,-1,-1,-1}, COLOR_NONE},
  142. /* ELEMENT_BUTTON          */   {COLOR_3DFACE,          SIZE_NONE,      FALSE,   COLOR_BTNTEXT,          FONT_NONE,     ELNAME_BUTTON, -1,         {-1,-1,-1,-1}, COLOR_NONE},
  143. /* ELEMENT_SMCAPTION       */   {COLOR_NONE,            SIZE_SMCAPTION, TRUE,    COLOR_NONE,             FONT_SMCAPTION,ELNAME_SMALLCAPTION, -1,   {-1,-1,-1,-1}, COLOR_NONE},
  144. /* ELEMENT_ICON            */   {COLOR_NONE,            SIZE_ICON,      FALSE,   COLOR_NONE,             FONT_ICONTITLE,ELNAME_ICON, -1,           {-1,-1,-1,-1}, COLOR_NONE},
  145. /* ELEMENT_ICONHORZSPACING */   {COLOR_NONE,            SIZE_DXICON,    FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_DXICON, -1,         {-1,-1,-1,-1}, COLOR_NONE},
  146. /* ELEMENT_ICONVERTSPACING */   {COLOR_NONE,            SIZE_DYICON,    FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_DYICON, -1,         {-1,-1,-1,-1}, COLOR_NONE},
  147. /* ELEMENT_INFO            */   {COLOR_INFOBK,          SIZE_NONE,      TRUE,    COLOR_INFOTEXT,         FONT_STATUS,   ELNAME_INFO, -1,           {-1,-1,-1,-1}, COLOR_NONE},
  148. };
  149. #if 0
  150. // go fix look.h if you decide to add this back in
  151. /* ELEMENT_SMICON          */   {COLOR_NONE,            SIZE_SMICON,    FALSE,   COLOR_NONE,             FONT_NONE,     ELNAME_SMICON, -1,         {-1,-1,-1,-1}},
  152. #endif
  153. // used by ChooseColor dialog
  154. COLORREF g_CustomColors[16];
  155. // structure used to store a scheme in the registry
  156. #ifdef UNICODE
  157. #   define SCHEME_VERSION 2        // Ver 2 == Unicode
  158. #else
  159. #   define SCHEME_VERSION 1        // Ver 1 == Win95 ANSI
  160. #endif
  161. /*
  162.  * Note -- this must match the High Contrast accessibility code
  163.  *  in windowsginawinlogon.
  164.  */
  165. typedef struct {
  166.     SHORT version;
  167.     WORD  wDummy;               // for alignment
  168.     NONCLIENTMETRICS ncm;
  169.     LOGFONT lfIconTitle;
  170.     COLORREF rgb[NT40_COLOR_MAX];
  171. } SCHEMEDATA;
  172. HWND g_hDlg = NULL;             // nonzero if page is up
  173. int g_iCurElement = -2;         // start off as not even "not set"
  174. int g_LogDPI = 96;              // logical resolution of display
  175. #define ELCUR           (g_elements[g_iCurElement])
  176. #define ELCURFONT       (g_fonts[ELCUR.iFont])
  177. // this one kept separately for range purposes
  178. #define ELCURSIZE       g_elCurSize
  179. int g_iPrevSize = SIZE_NONE;
  180. #define MAXSCHEMENAME 100
  181. TCHAR g_szCurScheme[MAXSCHEMENAME];      // current scheme name
  182. TCHAR g_szLastScheme[MAXSCHEMENAME];     // last scheme they had
  183. HBRUSH g_hbrMainColor = NULL;
  184. HBRUSH g_hbrTextColor = NULL;
  185. HBRUSH g_hbrGradColor = NULL;
  186. const TCHAR c_szRegPathUserMetrics[] = TEXT("Control Panel\Desktop\WindowMetrics");
  187. const TCHAR c_szRegValIconSize[] = TEXT("Shell Icon Size");
  188. const TCHAR c_szRegValSmallIconSize[] = TEXT("Shell Small Icon Size");
  189. void NEAR PASCAL Look_Repaint(HWND hDlg, BOOL bRecalc);
  190. BOOL NEAR PASCAL Look_ChangeColor(HWND hDlg, int iColor, COLORREF rgb);
  191. BOOL CALLBACK SaveSchemeDlgProc(HWND, UINT, WPARAM, LPARAM);
  192. void NEAR PASCAL Look_UpdateSizeBasedOnFont(HWND hDlg, BOOL fComputeIdeal);
  193. void NEAR PASCAL Look_SetCurSizeAndRange(HWND hDlg);
  194. void NEAR PASCAL Look_SyncSize(HWND hDlg);
  195. void NEAR PASCAL Look_DoSizeStuff(HWND hDlg, BOOL fCanComputeIdeal);
  196. //
  197. // bugbug, needs to be in inc16windows.h
  198. //
  199. //int WINAPI EnumFontFamiliesEx(HDC, LPLOGFONT, FONTENUMPROC, LPARAM, DWORD);
  200. COLORREF GetNearestPaletteColor(HPALETTE hpal, COLORREF rgb)
  201. {
  202.     PALETTEENTRY pe;
  203.     GetPaletteEntries(hpal, GetNearestPaletteIndex(hpal, rgb & 0x00FFFFFF), 1, &pe);
  204.     return RGB(pe.peRed, pe.peGreen, pe.peBlue);
  205. }
  206. BOOL IsPaletteColor(HPALETTE hpal, COLORREF rgb)
  207. {
  208.     return GetNearestPaletteColor(hpal, rgb) == (rgb & 0xFFFFFF);
  209. }
  210. COLORREF NearestColor(int iColor, COLORREF rgb)
  211. {
  212.     rgb &= 0x00FFFFFF;
  213.     //
  214.     // if we are on a palette device, we need to do special stuff...
  215.     //
  216.     if (g_bPalette)
  217.     {
  218.         if (g_colorFlags[iColor] & COLORFLAG_SOLID)
  219.         {
  220.             if (IsPaletteColor(g_hpal3D, rgb))
  221.                 rgb |= RGB_PALETTE;
  222.             else
  223.                 rgb = GetNearestPaletteColor(g_hpalVGA, rgb);
  224.         }
  225.         else
  226.         {
  227.             if (IsPaletteColor(g_hpal3D, rgb))
  228.                 rgb |= RGB_PALETTE;
  229.             else if (IsPaletteColor((HPALETTE)GetStockObject(DEFAULT_PALETTE), rgb))
  230.                 rgb ^= 0x000001;    // force a dither
  231.         }
  232.     }
  233.     else
  234.     {
  235.         // map color to nearest color if we need to for this UI element.
  236.         if (g_colorFlags[iColor] & COLORFLAG_SOLID)
  237.         {
  238.             HDC hdc = GetDC(NULL);
  239.             rgb = GetNearestColor(hdc, rgb);
  240.             ReleaseDC(NULL, hdc);
  241.         }
  242.     }
  243.     return rgb;
  244. }
  245. void NEAR PASCAL Set3DPaletteColor(COLORREF rgb, int iColor)
  246. {
  247.     int iPalette;
  248.     PALETTEENTRY pe;
  249.     if (!g_hpal3D)
  250.         return;
  251.     switch (iColor)
  252.     {
  253.         case COLOR_3DFACE:
  254.             iPalette = 16;
  255.             break;
  256.         case COLOR_3DSHADOW:
  257.             iPalette = 17;
  258.             break;
  259.         case COLOR_3DHILIGHT:
  260.             iPalette = 18;
  261.             break;
  262.         default:
  263.             return;
  264.     }
  265.     pe.peRed    = GetRValue(rgb);
  266.     pe.peGreen  = GetGValue(rgb);
  267.     pe.peBlue   = GetBValue(rgb);
  268.     pe.peFlags  = 0;
  269.     SetPaletteEntries(g_hpal3D, iPalette, 1, (LPPALETTEENTRY)&pe);
  270. }
  271. void NEAR PASCAL Look_RebuildSysStuff(BOOL fInit)
  272. {
  273.     int i;
  274.     PALETTEENTRY pal[4];
  275.     HPALETTE hpal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
  276.     SelectObject(g_hdcMem, GetStockObject(BLACK_BRUSH));
  277.     SelectObject(g_hdcMem, GetStockObject(SYSTEM_FONT));
  278.     for (i = 0; i < NUM_FONTS; i++)
  279.     {
  280.         if (g_fonts[i].hfont)
  281.             DeleteObject(g_fonts[i].hfont);
  282.         g_fonts[i].hfont = CreateFontIndirect(&g_fonts[i].lf);
  283.     }
  284.     if (fInit)
  285.     {
  286.         // get current magic colors
  287.         GetPaletteEntries(hpal, 8,  4, pal);
  288.         SetPaletteEntries(g_hpal3D, 16,  4, pal);
  289.         // set up magic colors in the 3d palette
  290.         if (!IsPaletteColor(hpal, g_Options.m_schemePreview.m_rgb[COLOR_3DFACE]))
  291.         {
  292.             Set3DPaletteColor(g_Options.m_schemePreview.m_rgb[COLOR_3DFACE], COLOR_3DFACE);
  293.             Set3DPaletteColor(g_Options.m_schemePreview.m_rgb[COLOR_3DSHADOW], COLOR_3DSHADOW);
  294.             Set3DPaletteColor(g_Options.m_schemePreview.m_rgb[COLOR_3DHILIGHT], COLOR_3DHILIGHT);
  295.         }
  296.     }
  297.     for (i = 0; i < NT40_COLOR_MAX; i++)
  298.     {
  299.         if (g_brushes[i])
  300.             DeleteObject(g_brushes[i]);
  301.         g_brushes[i] = CreateSolidBrush(NearestColor(i, g_Options.m_schemePreview.m_rgb[i]));
  302.     }
  303. }
  304. #ifndef LF32toLF
  305. void NEAR LF32toLF(LPLOGFONT_32 lplf32, LPLOGFONT lplf)
  306. {
  307.     lplf->lfHeight       = (int) lplf32->lfHeight;
  308.     lplf->lfWidth        = (int) lplf32->lfWidth;
  309.     lplf->lfEscapement   = (int) lplf32->lfEscapement;
  310.     lplf->lfOrientation  = (int) lplf32->lfOrientation;
  311.     lplf->lfWeight       = (int) lplf32->lfWeight;
  312.     *((LPCOMMONFONT) &lplf->lfItalic) = lplf32->lfCommon;
  313. }
  314. #endif
  315. void NEAR SetMyNonClientMetrics(LPNONCLIENTMETRICS lpncm)
  316. {
  317.     g_sizes[SIZE_FRAME].CurSize = (int)lpncm->iBorderWidth;
  318.     g_sizes[SIZE_SCROLL].CurSize = (int)lpncm->iScrollWidth;
  319.     g_sizes[SIZE_CAPTION].CurSize = (int)lpncm->iCaptionHeight;
  320.     g_sizes[SIZE_SMCAPTION].CurSize = (int)lpncm->iSmCaptionHeight;
  321.     g_sizes[SIZE_MENU].CurSize = (int)lpncm->iMenuHeight;
  322.     LF32toLF(&(lpncm->lfCaptionFont), &(g_fonts[FONT_CAPTION].lf));
  323.     LF32toLF(&(lpncm->lfSmCaptionFont), &(g_fonts[FONT_SMCAPTION].lf));
  324.     LF32toLF(&(lpncm->lfMenuFont), &(g_fonts[FONT_MENU].lf));
  325.     LF32toLF(&(lpncm->lfStatusFont), &(g_fonts[FONT_STATUS].lf));
  326.     LF32toLF(&(lpncm->lfMessageFont), &(g_fonts[FONT_MSGBOX].lf));
  327. }
  328. /*
  329. ** Fill in a NONCLIENTMETRICS structure with latest preview stuff
  330. */
  331. void NEAR GetMyNonClientMetrics(LPNONCLIENTMETRICS lpncm)
  332. {
  333.     lpncm->iBorderWidth = (LONG)g_sizes[SIZE_FRAME].CurSize;
  334.     lpncm->iScrollWidth = lpncm->iScrollHeight = (LONG)g_sizes[SIZE_SCROLL].CurSize;
  335.     lpncm->iCaptionWidth = lpncm->iCaptionHeight = (LONG)g_sizes[SIZE_CAPTION].CurSize;
  336.     lpncm->iSmCaptionWidth = lpncm->iSmCaptionHeight = (LONG)g_sizes[SIZE_SMCAPTION].CurSize;
  337.     lpncm->iMenuWidth = lpncm->iMenuHeight = (LONG)g_sizes[SIZE_MENU].CurSize;
  338.     LFtoLF32(&(g_fonts[FONT_CAPTION].lf), &(lpncm->lfCaptionFont));
  339.     LFtoLF32(&(g_fonts[FONT_SMCAPTION].lf), &(lpncm->lfSmCaptionFont));
  340.     LFtoLF32(&(g_fonts[FONT_MENU].lf), &(lpncm->lfMenuFont));
  341.     LFtoLF32(&(g_fonts[FONT_STATUS].lf), &(lpncm->lfStatusFont));
  342.     LFtoLF32(&(g_fonts[FONT_MSGBOX].lf), &(lpncm->lfMessageFont));
  343. }
  344. /*
  345. ** clean up any mess made in maintaining system information
  346. ** also, write out any global changes in our setup.
  347. */
  348. void NEAR PASCAL Look_DestroySysStuff(void)
  349. {
  350.     int i;
  351.     HKEY hkAppear;
  352.     SelectObject(g_hdcMem, GetStockObject(BLACK_BRUSH));
  353.     SelectObject(g_hdcMem, GetStockObject(SYSTEM_FONT));
  354.     for (i = 0; i < NUM_FONTS; i++)
  355.     {
  356.         if (g_fonts[i].hfont)
  357.             DeleteObject(g_fonts[i].hfont);
  358.     }
  359.     for (i = 0; i < NT40_COLOR_MAX; i++)
  360.     {
  361.         if (g_brushes[i])
  362.             DeleteObject(g_brushes[i]);
  363.     }
  364.     if (g_hpal3D)
  365.         DeleteObject(g_hpal3D);
  366.     if (g_hpalVGA)
  367.         DeleteObject(g_hpalVGA);
  368.     // save out possible changes to custom color table
  369.     if (RegOpenKey(HKEY_CURRENT_USER, REGSTR_PATH_APPEARANCE, &hkAppear) == ERROR_SUCCESS)
  370.     {
  371.         RegSetValueEx(hkAppear, REGSTR_VAL_CUSTOMCOLORS, 0L, REG_BINARY,
  372.                                 (LPBYTE)g_CustomColors, sizeof(g_CustomColors));
  373.     }
  374. }
  375. #if 0
  376. void NEAR PASCAL Look_SetSysStuff(UINT fChanged)
  377. {
  378.     // COMPATIBILITY:
  379.     //   Do metrics first since the color stuff might cause USER to generate a
  380.     // WM_SYSCOLORCHANGE message and we don't want to send two of them...
  381.     DPRINT("desk.cpl: Look_SetSysStuff");
  382.     
  383.     if( fChanged & METRIC_CHANGE )
  384.     {
  385.         NONCLIENTMETRICS ncm;
  386.         HKEY hkey;
  387.         DPRINT("desk.cpl: Metrics Changed");
  388.         GetMyNonClientMetrics(&ncm);
  389.         ncm.cbSize = sizeof(ncm);
  390.         DPRINT("desk.cpl: Calling SPI_SETNONCLIENTMETRICS");
  391.         SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(ncm),
  392.             (void far *)(LPNONCLIENTMETRICS)&ncm,
  393.             SPIF_UPDATEINIFILE );
  394.         DPRINT("desk.cpl: Calling SPI_SETICONTITLELOGFONT");
  395.         SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(LOGFONT),
  396.             (void far *)(LPLOGFONT)&(g_fonts[FONT_ICONTITLE].lf),
  397.             SPIF_UPDATEINIFILE );
  398.         DPRINT("desk.cpl: Calling SPI_ICONHORIZONTALSPACING");
  399.         SystemParametersInfo(SPI_ICONHORIZONTALSPACING,
  400.             g_sizes[ SIZE_DXICON ].CurSize + g_sizes[ SIZE_ICON ].CurSize,
  401.             NULL, SPIF_UPDATEINIFILE );
  402.         DPRINT("desk.cpl: Calling SPI_ICONVERTICALSPACING");
  403.         SystemParametersInfo(SPI_ICONVERTICALSPACING,
  404.             g_sizes[ SIZE_DYICON ].CurSize + g_sizes[ SIZE_ICON ].CurSize,
  405.             NULL, SPIF_UPDATEINIFILE );
  406.         DPRINT("desk.cpl: Done calling SPI's");
  407.         if( RegCreateKey( HKEY_CURRENT_USER, c_szRegPathUserMetrics, &hkey )
  408.             == ERROR_SUCCESS )
  409.         {
  410.             TCHAR val[ 8 ];
  411.             wsprintf( val, TEXT("%d"), g_sizes[ SIZE_ICON ].CurSize );
  412.             RegSetValueEx( hkey, c_szRegValIconSize, 0, REG_SZ,
  413.                 (LPBYTE)&val, SIZEOF(TCHAR) * (lstrlen( val ) + 1) );
  414. #ifdef THE_SHELL_CAN_HANDLE_CUSTOM_SMALL_ICON_SIZES_YET
  415.             wsprintf( val, TEXT("%d"), g_sizes[ SIZE_SMICON ].CurSize );
  416.             RegSetValueEx( hkey, c_szRegValSmallIconSize, 0, REG_SZ,
  417.                 (LPBYTE)&val, SIZEOF(TCHAR) * (lstrlen( val ) + 1) );
  418. #else
  419.             RegDeleteValue( hkey, c_szRegValSmallIconSize );
  420. #endif
  421.             RegCloseKey( hkey );
  422.         }
  423.         // WM_SETTINGCHANGE is sent at the end of the function
  424.     }
  425.     if( fChanged & COLOR_CHANGE )
  426.     {
  427.         int i;
  428.         int iColors[NT40_COLOR_MAX];
  429.         COLORREF rgbColors[NT40_COLOR_MAX];
  430.         TCHAR szRGB[32];
  431.         COLORREF rgb;
  432.         HKEY     hk;
  433.         HDC      hdc;
  434.         BOOL     bGradient = FALSE;
  435.         if ((g_Options.m_schemePreview.m_rgb[COLOR_ACTIVECAPTION] != g_Options.m_schemePreview.m_rgb[COLOR_GRADIENTACTIVECAPTION]) ||
  436.                 (g_Options.m_schemePreview.m_rgb[COLOR_INACTIVECAPTION] != g_Options.m_schemePreview.m_rgb[COLOR_GRADIENTINACTIVECAPTION])) {
  437.             bGradient = TRUE;
  438.         }
  439.         DPRINT("desk.cpl: Calling SPI_SETGRADIENTCAPTIONS");
  440.         SystemParametersInfo(SPI_SETGRADIENTCAPTIONS, 0, (PVOID)bGradient, SPIF_UPDATEINIFILE);
  441.         
  442.         //
  443.         // restore magic colors back to Win31 defaults.
  444.         //
  445.         hdc = GetDC(NULL);
  446.         SetMagicColors(hdc, 0x00c0dcc0, 8);         // money green
  447.         SetMagicColors(hdc, 0x00f0caa6, 9);         // IBM blue
  448.         SetMagicColors(hdc, 0x00f0fbff, 246);       // off white
  449.         ReleaseDC(NULL, hdc);
  450.         // -------------------------------------------------
  451.         // This call causes user to send a WM_SYSCOLORCHANGE
  452.         // -------------------------------------------------
  453.         for (i=0; i<NT40_COLOR_MAX; i++)
  454.         {
  455.             iColors[i] = i;
  456.             rgbColors[i] = g_Options.m_schemePreview.m_rgb[i] & 0x00FFFFFF;
  457.         }
  458.         SetSysColors(NT40_COLOR_MAX, iColors, rgbColors);
  459.         if(RegCreateKey(HKEY_CURRENT_USER, szRegStr_Colors, &hk) == ERROR_SUCCESS)
  460.         {
  461.             // write out the color information to win.ini
  462.             for (i = 0; i < NT40_COLOR_MAX; i++)
  463.             {
  464.                 rgb = g_Options.m_schemePreview.m_rgb[i];
  465.                 wsprintf(szRGB, TEXT("%d %d %d"), GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
  466.                 // For the time being we will update the INI file also.
  467.                 WriteProfileString(g_szColors, s_pszColorNames[i], szRGB);
  468.                 // Update the registry (Be sure to include the terminating zero in the byte count!)
  469.                 RegSetValueEx(hk, s_pszColorNames[i], 0L, REG_SZ, (LPBYTE)szRGB, SIZEOF(TCHAR) * (lstrlen(szRGB)+1));
  470. #ifdef DEBUG
  471.                 {
  472.                 TCHAR Buff[100];
  473.                 wsprintf(Buff, TEXT("CPL:Write Color: %s=%snr"),s_pszColorNames[i], szRGB);
  474.                 OutputDebugString(Buff);
  475.                 }
  476. #endif  // DEBUG
  477.             }
  478.             RegCloseKey(hk);
  479.         }
  480.     }
  481.     else if( fChanged & METRIC_CHANGE )
  482.     {
  483.         // COMPATIBILITY HACK:
  484.         // no colors were changed, but metrics were
  485.         // EXCEL 5.0 BOZOS tied metrics changes to WM_SYSCOLORCHANGE
  486.         // and ignore the WM_WININICHANGE (now called WM_SETTINGCHANGE)
  487.         // send a bogus WM_SYSCOLORCHANGE
  488.         DPRINT("desk.cpl: Sending WM_SYSCOLORCHANGE");
  489.         SendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
  490.         DPRINT("desk.cpl: Back from sending WM_SYSCOLORCHANGE");
  491.     }
  492.     // if metrics changed at all send a WM_SETTINGCHANGE
  493.     if( fChanged & METRIC_CHANGE ) {
  494.         DPRINT("desk.cpl: Sending WM_SETTINGCHANGE");
  495.         SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (LPARAM)TEXT("WindowMetrics"));
  496.         DPRINT("desk.cpl: Back sending WM_SETTINGCHANGE");
  497.     }
  498. }
  499. #endif
  500. //------------------------ mini font picker controls --------------------------
  501. /*
  502. ** initialize the constant dialog components
  503. **
  504. ** initialize the list of element names.  this stays constant with the
  505. ** possible exception that some items might be added/removed depending
  506. ** on some special case conditions.
  507. */
  508. void NEAR PASCAL Look_DestroyDialog(HWND hDlg)
  509. {
  510.     HFONT hfont, hfontOther;
  511.     hfontOther = (HFONT)SendDlgItemMessage(hDlg, IDC_MAINSIZE, WM_GETFONT, 0, 0L);
  512.     hfont = (HFONT)SendDlgItemMessage(hDlg, IDC_FONTBOLD, WM_GETFONT, 0, 0L);
  513.     if (hfont && (hfont != hfontOther))
  514.         DeleteObject(hfont);
  515.     hfont = (HFONT)SendDlgItemMessage(hDlg, IDC_FONTITAL, WM_GETFONT, 0, 0L);
  516.     if (hfont && (hfont != hfontOther))
  517.         DeleteObject(hfont);
  518.     DestroyWindow(g_hwndTooltip);
  519. }
  520. #define LSE_SETCUR 0x0001
  521. #define LSE_ALWAYS 0x0002
  522. #if 0
  523. void FAR PASCAL Look_SelectElement(HWND hDlg, int iElement, DWORD dwFlags)
  524. {
  525.     BOOL bEnable;
  526.     int i;
  527.     if ((iElement == g_iCurElement) && !(dwFlags & LSE_ALWAYS))
  528.         return;
  529.     g_iCurElement = iElement;
  530.     // if needed, find this element in the combobox and select it
  531.     if (dwFlags & LSE_SETCUR)
  532.     {
  533.         i = (int)SendDlgItemMessage(hDlg, IDC_ELEMENTS, CB_GETCOUNT,0,0L);
  534.         for (i--; i >=0 ; i--)
  535.         {
  536.             // if this is the one that references our element, stop
  537.             if (iElement == (int)LOWORD(SendDlgItemMessage(hDlg, IDC_ELEMENTS, CB_GETITEMDATA, (WPARAM)i, 0L)))
  538.                 break;
  539.         }
  540.         SendDlgItemMessage(hDlg, IDC_ELEMENTS, CB_SETCURSEL, (WPARAM)i,0L);
  541.     }
  542.     bEnable = (ELCUR.iMainColor != COLOR_NONE);
  543.     if (bEnable)
  544.         Color_SetColor(hDlg, IDC_MAINCOLOR, g_brushes[ELCUR.iMainColor]);
  545.     EnableWindow(GetDlgItem(hDlg, IDC_MAINCOLOR), bEnable);
  546.     EnableWindow(GetDlgItem(hDlg, IDC_COLORLABEL), bEnable);
  547.     bEnable = (ELCUR.iGradColor != COLOR_NONE);
  548.     EnableGradientControl(hDlg, bEnable);
  549.     if (bEnable)
  550.         Color_SetColor(hDlg, IDC_GRADCOLOR, g_brushes[ELCUR.iGradColor]);
  551.     bEnable = (ELCUR.iFont != FONT_NONE);
  552.     if (bEnable)
  553.     {
  554.         Font_NewFont(hDlg, ELCUR.iFont);
  555.     }
  556.     Font_EnableControls(hDlg, bEnable);
  557.     // size may be based on font
  558.     Look_DoSizeStuff(hDlg, FALSE);
  559.     bEnable = (ELCUR.iSize != SIZE_NONE);
  560.     EnableWindow(GetDlgItem(hDlg, IDC_MAINSIZE), bEnable);
  561.     EnableWindow(GetDlgItem(hDlg, IDC_SIZEARROWS), bEnable);
  562.     EnableWindow(GetDlgItem(hDlg, IDC_SIZELABEL), bEnable);
  563.     bEnable = (ELCUR.iTextColor != COLOR_NONE);
  564.     if (bEnable)
  565.         Color_SetColor(hDlg, IDC_TEXTCOLOR, g_brushes[ELCUR.iTextColor]);
  566.     EnableWindow(GetDlgItem(hDlg, IDC_TEXTCOLOR), bEnable);
  567.     EnableWindow(GetDlgItem(hDlg, IDC_FNCOLORLABEL), bEnable);
  568. }
  569. #endif
  570. const static DWORD FAR aAppearanceHelpIds[] = {
  571.         IDC_SCHEMES,        IDH_APPEAR_SCHEME,
  572.         IDC_SAVESCHEME,     IDH_APPEAR_SAVEAS,
  573.         IDC_DELSCHEME,      IDH_APPEAR_DELETE,
  574.         IDC_ELEMENTS,       IDH_APPEAR_ITEM,
  575.         IDC_MAINCOLOR,      IDH_APPEAR_BACKGRNDCOLOR,
  576.         IDC_SIZELABEL,      IDH_APPEAR_ITEMSIZE,
  577.         IDC_MAINSIZE,       IDH_APPEAR_ITEMSIZE,
  578.         IDC_SIZEARROWS,     IDH_APPEAR_ITEMSIZE,
  579.         IDC_FONTLABEL,      IDH_APPEAR_FONT,
  580.         IDC_FONTNAME,       IDH_APPEAR_FONT,
  581.         IDC_FONTSIZE,       IDH_APPEAR_FONTSIZE,
  582.         IDC_FONTBOLD,       IDH_APPEAR_FONTBOLD,
  583.         IDC_FONTITAL,       IDH_APPEAR_FONTITALIC,
  584.         IDC_LOOKPREV,       IDH_APPEAR_GRAPHIC,
  585.         IDC_FONTSIZELABEL,  IDH_APPEAR_FONTSIZE,
  586.         IDC_COLORLABEL,     IDH_APPEAR_BACKGRNDCOLOR,
  587.         IDC_TEXTCOLOR,      IDH_APPEAR_FONTCOLOR,
  588.         IDC_FNCOLORLABEL,   IDH_APPEAR_FONTCOLOR,
  589.         0, 0
  590. };
  591. LONG WINAPI MyStrToLong(LPCTSTR sz)
  592. {
  593.     long l=0;
  594.     while (*sz >= TEXT('0') && *sz <= TEXT('9'))
  595.         l = l*10 + (*sz++ - TEXT('0'));
  596.     return l;
  597. }