home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / TaskSwitchXP / TaskSwitchXP_1.0.26.exe / Source / ConfigTsXP / main.cpp < prev    next >
C/C++ Source or Header  |  2004-10-05  |  24KB  |  685 lines

  1. // main.cpp
  2.  
  3. #include "stdafx.h"
  4. #include "ownerdrawXp.h"
  5. #include "resource.h"
  6. #include "main.h"
  7.  
  8. #include <strsafe.h>
  9.  
  10. //-------------------------------------------------
  11.  
  12. INT_PTR CALLBACK Dlg_MainProc(HWND, UINT, WPARAM, LPARAM);
  13. BOOL Main_OnInitDialog(HWND, HWND, LPARAM);
  14. void Main_OnCommand(HWND, int, HWND, UINT);
  15. int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX*, NEWTEXTMETRICEX*, DWORD, LPARAM);
  16. void LoadSettings(HWND);
  17. BOOL SaveSettings(HWND);
  18.  
  19.  
  20. //const WCHAR g_szConfigTsXP[]            = L"_As12__TaskSwitchXP_ConfigTsXP";
  21. const WCHAR g_szMainWnd[]                = L"_As12__TaskSwitchXP_MainWnd_";
  22. const WCHAR g_szRegKeyTs[]                = RS_TASKSWITCHXP_KEY;
  23.  
  24. HINSTANCE g_hinstExe                    = NULL;
  25. int g_nComboItemHeight                    = 0;
  26.  
  27. //-----------------------------------------------------------
  28.  
  29. void ReportError(HWND hwnd, LPCWSTR szError) {
  30.     MessageBeep(MB_ICONERROR);
  31.     MessageBox(hwnd, szError, L"ConfigTsXP error", 
  32.         MB_OK | MB_ICONERROR | MB_TASKMODAL);
  33. }
  34.  
  35. void ReportError(HWND hwnd, UINT uErrorID) {
  36.     WCHAR szError[256];
  37.     LoadString(g_hinstExe, uErrorID, szError, SIZEOF_ARRAY(szError));
  38.     ReportError(hwnd, szError);
  39. }
  40.  
  41. /*void FatalError(UINT uErrorID) {
  42.     ReportError(NULL, uErrorID);
  43.     exit(1);
  44. }*/
  45.  
  46. //-------------------------------------------------
  47.  
  48. BOOL ParseCommandLine() {
  49.     
  50.     int nNumArgs;
  51.     PWSTR *ppArgv = CommandLineToArgvW(GetCommandLineW(), &nNumArgs);
  52.  
  53.     BOOL f = TRUE;
  54.     if (nNumArgs == 2 && (ppArgv[1][0] == L'/' || ppArgv[1][0] == L'-')) {
  55.         if ((ppArgv[1][1] == L'd' || ppArgv[1][1] == L'i') && ppArgv[1][2] == L'\0') {
  56.  
  57.             BOOL fDefault = (BOOL)(ppArgv[1][1] == L'd');
  58.             DWORD cbData, tmp;
  59.             HKEY hkey;
  60.             if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKeyTs, 0, KEY_READ | KEY_WRITE, &hkey)) {
  61.                 fDefault = TRUE;
  62.                 if (RegCreateKeyEx(HKEY_CURRENT_USER, g_szRegKeyTs, 0, NULL, 
  63.                     REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, NULL))
  64.                     return(f);
  65.             }
  66.  
  67.             tmp = DEFAULT_FLAGS;
  68.             cbData = sizeof(DWORD);
  69.             if (fDefault || RegQueryValueEx(hkey, RS_FLAGS, 0, NULL, (PBYTE)&tmp, &cbData))
  70.                 RegSetValueEx(hkey, RS_FLAGS, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  71.  
  72.             WCHAR szFont[LF_FACESIZE] = DEFAULT_CAPFONTNAME;
  73.  
  74.             cbData = sizeof(szFont);
  75.             if (fDefault || RegQueryValueEx(hkey, RS_CAPFONTNAME, 0, NULL, (PBYTE)&tmp, &cbData)) {
  76.                 RegSetValueEx(hkey, RS_CAPFONTNAME, 0, REG_SZ, 
  77.                     (PBYTE)szFont, (lstrlen(szFont) + 1) * sizeof(WCHAR));
  78.             }
  79.             tmp = DEFAULT_CAPFONTATTR;
  80.             cbData = sizeof(DWORD);
  81.             if (fDefault || RegQueryValueEx(hkey, RS_CAPFONTATTR, 0, NULL, (PBYTE)&tmp, &cbData))
  82.                 RegSetValueEx(hkey, RS_CAPFONTATTR, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  83.             tmp = DEFAULT_CAPTEXTCOLOR;
  84.             cbData = sizeof(DWORD);
  85.             if (fDefault || RegQueryValueEx(hkey, RS_CAPTEXTCOLOR, 0, NULL, (PBYTE)&tmp, &cbData))
  86.                 RegSetValueEx(hkey, RS_CAPTEXTCOLOR, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  87.             tmp = DEFAULT_CAPSHADOW;
  88.             cbData = sizeof(DWORD);
  89.             if (fDefault || RegQueryValueEx(hkey, RS_CAPSHADOW, 0, NULL, (PBYTE)&tmp, &cbData))
  90.                 RegSetValueEx(hkey, RS_CAPSHADOW, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  91.             tmp = DEFAULT_PVDELAY;
  92.             cbData = sizeof(DWORD);
  93.             if (fDefault || RegQueryValueEx(hkey, RS_PVDELAY, 0, NULL, (PBYTE)&tmp, &cbData))
  94.                 RegSetValueEx(hkey, RS_PVDELAY, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  95.             tmp = DEFAULT_PVWIDTH;
  96.             cbData = sizeof(DWORD);
  97.             if (fDefault || RegQueryValueEx(hkey, RS_PVWIDTH, 0, NULL, (PBYTE)&tmp, &cbData) || 
  98.                 tmp < MIN_PVWIDTH || tmp > MAX_PVWIDTH)
  99.                 RegSetValueEx(hkey, RS_PVWIDTH, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  100.             tmp = DEFAULT_ICONSX;
  101.             cbData = sizeof(DWORD);
  102.             if (fDefault || RegQueryValueEx(hkey, RS_ICONSX, 0, NULL, (PBYTE)&tmp, &cbData) || 
  103.                 tmp < MIN_ICONSX || tmp > MAX_ICONSX)
  104.                 RegSetValueEx(hkey, RS_ICONSX, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  105.             tmp = DEFAULT_ICONSY;
  106.             cbData = sizeof(DWORD);
  107.             if (fDefault || RegQueryValueEx(hkey, RS_ICONSY, 0, NULL, (PBYTE)&tmp, &cbData) || 
  108.                 tmp < MIN_ICONSY || tmp > MAX_ICONSY)
  109.                 RegSetValueEx(hkey, RS_ICONSY, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  110.             tmp = DEFAULT_PANEHEIGHT;
  111.             cbData = sizeof(DWORD);
  112.             if (fDefault || RegQueryValueEx(hkey, RS_PANEHEIGHT, 0, NULL, (PBYTE)&tmp, &cbData) || 
  113.                 tmp < MIN_PANEHEIGHT || tmp > MAX_PANEHEIGHT)
  114.                 RegSetValueEx(hkey, RS_PANEHEIGHT, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  115.  
  116.             RegCloseKey(hkey);
  117.  
  118.             HWND hwndTs = FindWindowEx(HWND_MESSAGE, NULL, g_szMainWnd, L"");
  119.             if (IsWindow(hwndTs))
  120.                 SendMessage(hwndTs, WM_RELOADSETTINGS, 0, 0);
  121.  
  122.             f = FALSE;
  123.         }
  124.     }
  125.     HeapFree(GetProcessHeap(), 0, ppArgv);
  126.     return(f);
  127. }
  128.  
  129. //-------------------------------------------------
  130.  
  131. BOOL CheckVersion() {
  132.     OSVERSIONINFO vi = { sizeof(OSVERSIONINFO) };
  133.     if (!GetVersionEx(&vi) || vi.dwPlatformId != VER_PLATFORM_WIN32_NT || 
  134.         vi.dwMajorVersion < 5 || vi.dwMinorVersion < 1) {
  135.             MessageBoxA(NULL, "This program requires features present in Windows XP/2003.", 
  136.                 "ConfigTsXP error", MB_OK | MB_ICONERROR | MB_TOPMOST | MB_SETFOREGROUND);
  137.             return(FALSE);
  138.     }
  139.     return(TRUE);
  140. }
  141.  
  142. //-----------------------------------------------------------
  143.  
  144. int APIENTRY wWinMain(HINSTANCE hinstExe, HINSTANCE, LPWSTR, int) {
  145.  
  146.     g_hinstExe = hinstExe; //GetModuleHandle(NULL);
  147.  
  148.     if (!CheckVersion())
  149.         return(1);
  150.  
  151.     if (!ParseCommandLine())
  152.         return(0); // install ok
  153.  
  154.     // global initializations
  155.     INITCOMMONCONTROLSEX iccex = {
  156.         sizeof(INITCOMMONCONTROLSEX),
  157.         ICC_LINK_CLASS | ICC_UPDOWN_CLASS
  158.     };
  159.     if (!InitCommonControlsEx(&iccex)) {
  160.         ReportError(NULL, IDS_ERR_COMMCTRL);
  161.         return(1);
  162.     }
  163.  
  164.     HDC hdcScreen = GetWindowDC(NULL);
  165.     g_nComboItemHeight = (10 * GetDeviceCaps(hdcScreen, LOGPIXELSY)) / 72 + 2;
  166.     ReleaseDC(NULL, hdcScreen);
  167.  
  168.     DialogBox(g_hinstExe, MAKEINTRESOURCE(IDD_MAIN), NULL, Dlg_MainProc);
  169.  
  170.     return(0);
  171. }
  172.  
  173. //-------------------------------------------------
  174. //-------------------------------------------------
  175.  
  176. struct FACENAME {
  177.     WCHAR szFaceName[LF_FACESIZE];
  178. };
  179.  
  180. typedef vector<FACENAME> VECTOR_FONTS;
  181.  
  182. int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *pelfe, NEWTEXTMETRICEX * /*pntme*/, 
  183.                                DWORD dwFontType, LPARAM lParam) {
  184.  
  185.     if (dwFontType == TRUETYPE_FONTTYPE || dwFontType == RASTER_FONTTYPE) {
  186.         VECTOR_FONTS *pvFonts = (VECTOR_FONTS*)lParam;
  187.         _ASSERT(pvFonts);
  188.         int i;
  189.         for (i = (int)pvFonts->size() - 1; i >= 0; i--)
  190.             if (!lstrcmpi(pvFonts->at(i).szFaceName, pelfe->elfLogFont.lfFaceName))
  191.                 break;
  192.         if (i == -1) // :)
  193.             pvFonts->push_back((FACENAME)(*(FACENAME*)&(pelfe->elfLogFont.lfFaceName)));
  194.     }
  195.     return(TRUE);
  196. }
  197.  
  198. //-------------------------------------------------
  199. //-------------------------------------------------
  200.  
  201. void LoadSettings(HWND hwnd) {
  202.  
  203.     HKEY hkey = NULL;
  204.  
  205.     // autostart
  206.     int n;
  207.     DWORD cbData, tmp = BST_UNCHECKED;
  208.     if (!RegOpenKeyEx(HKEY_CURRENT_USER, RS_RUN_KEY, 0, KEY_READ, &hkey)) {
  209.         if (!RegQueryValueEx(hkey, RS_TASKSWITCHXP, 0, NULL, NULL, NULL))
  210.             tmp = BST_CHECKED;
  211.         RegCloseKey(hkey);
  212.     }
  213.     CheckDlgButton(hwnd, IDC_AUTOSTART, tmp);
  214.  
  215.     if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKeyTs, 0, KEY_READ, &hkey))
  216.         hkey = NULL;
  217.  
  218.     // flags
  219.     cbData = sizeof(DWORD);
  220.     if (!hkey || RegQueryValueEx(hkey, RS_FLAGS, 0, NULL, (PBYTE)&tmp, &cbData))
  221.         tmp = DEFAULT_FLAGS;
  222.  
  223.     CheckDlgButton(hwnd, IDC_HIGHPRIORITY, (tmp & TSF_HIGHPRIORITY) ? BST_CHECKED : BST_UNCHECKED);
  224.     CheckDlgButton(hwnd, IDC_NOVISUALSTYLES, (tmp & TSF_NOVISUALSTYLES) ? BST_CHECKED : BST_UNCHECKED);
  225.     CheckDlgButton(hwnd, IDC_LEFTRIGHT, (tmp & TSF_LEFTRIGHT) ? BST_CHECKED : BST_UNCHECKED);
  226.     CheckDlgButton(hwnd, IDC_NOPVREGION, (tmp & TSF_NOPVREGION) ? BST_CHECKED : BST_UNCHECKED);
  227.     CheckDlgButton(hwnd, IDC_SHOWINFO, (tmp & TSF_SHOWINFO) ? BST_CHECKED : BST_UNCHECKED);
  228.     CheckDlgButton(hwnd, IDC_SHOWTOOLTIPS, (tmp & TSF_SHOWTOOLTIPS) ? BST_CHECKED : BST_UNCHECKED);
  229.     CheckDlgButton(hwnd, IDC_MOUSEOVER, (tmp & TSF_MOUSEOVER) ? BST_CHECKED : BST_UNCHECKED);
  230.     CheckDlgButton(hwnd, IDC_MOUSESELECT, (tmp & TSF_MOUSESELECT) ? BST_CHECKED : BST_UNCHECKED);
  231.     CheckDlgButton(hwnd, IDC_MOUSESWITCH, (tmp & TSF_MOUSESWITCH) ? BST_CHECKED : BST_UNCHECKED);    
  232.     CheckDlgButton(hwnd, IDC_INVERSEWHEEL, (tmp & TSF_INVERSEWHEEL) ? BST_CHECKED : BST_UNCHECKED);
  233.     CheckDlgButton(hwnd, IDC_DROPSHADOW, (tmp & TSF_DROPSHADOW) ? BST_CHECKED : BST_UNCHECKED);
  234.     CheckDlgButton(hwnd, IDC_TRANSPARENCY, (tmp & TSF_LAYERED) ? BST_CHECKED : BST_UNCHECKED);
  235.     if (tmp & TSF_LAYERED) {
  236.         n = 255 - (tmp & TSF_LAYEREDMASK) + 21;
  237.         if (n < 0) n = 21;
  238.         if (n > 255) n = 255;
  239.         SendMessage(GetDlgItem(hwnd, IDC_TRANSPARENCYSLIDER), 
  240.             TBM_SETPOS, TRUE, (LPARAM)n);
  241.         SendMessage(hwnd, WM_HSCROLL, TB_ENDTRACK, NULL);
  242.     }
  243.     // position on screen
  244.     if (tmp & TSF_POSTOP) n = 0;
  245.     else if (tmp & TSF_POSBOTTOM) n = 6;
  246.     else n = 3;
  247.     if (tmp & TSF_POSLEFT) ;
  248.     else if (tmp & TSF_POSRIGHT) n += 2;
  249.     else n += 1;
  250.     ComboBox_SetCurSel(GetDlgItem(hwnd, IDC_SCREENPOSCOMBO), n);
  251.  
  252.     HWND h;
  253.     WCHAR szBuff[LF_FACESIZE] = DEFAULT_CAPFONTNAME;
  254.  
  255.     // caption font name
  256.     cbData = sizeof(szBuff);
  257.     if (hkey)
  258.         RegQueryValueEx(hkey, RS_CAPFONTNAME, 0, NULL, (PBYTE)szBuff, &cbData);
  259.     h = GetDlgItem(hwnd, IDC_CAPFONTNAMECOMBO);
  260.     n = ComboBox_FindString(h, -1, szBuff);
  261.     if (n != CB_ERR)
  262.         ComboBox_SetCurSel(h, n);
  263.  
  264.     // caption font size
  265.     cbData = sizeof(DWORD);
  266.     if (!hkey || RegQueryValueEx(hkey, RS_CAPFONTATTR, 0, NULL, (PBYTE)&tmp, &cbData))
  267.         tmp = DEFAULT_CAPFONTATTR;
  268.  
  269.     h = GetDlgItem(hwnd, IDC_CAPFONTSIZECOMBO);
  270.     StringCchPrintf(szBuff, SIZEOF_ARRAY(szBuff), L"%u", (tmp & TSFCF_SIZEMASK)); // font size
  271.     n = ComboBox_FindString(h, -1, szBuff);
  272.     if (n != CB_ERR)
  273.         ComboBox_SetCurSel(h, n);
  274.     else SetWindowText(h, szBuff);
  275.  
  276.     CheckDlgButton(hwnd, IDC_CAPFONTBOLD, // font bold
  277.         (tmp & TSFCF_BOLD) ? BST_CHECKED : BST_UNCHECKED);
  278.     CheckDlgButton(hwnd, IDC_CAPFONTITALIC, // font italic
  279.         (tmp & TSFCF_ITALIC) ? BST_CHECKED : BST_UNCHECKED);
  280.  
  281.     // caption font color
  282.     cbData = sizeof(DWORD);
  283.     if (!hkey || RegQueryValueEx(hkey, RS_CAPTEXTCOLOR, 0, NULL, (PBYTE)&tmp, &cbData))
  284.         tmp = DEFAULT_CAPTEXTCOLOR;
  285.     SetUxButtonColor(GetDlgItem(hwnd, IDC_CAPTEXTCOLOR), tmp);
  286.  
  287.     // caption font shadow color & deep
  288.     cbData = sizeof(DWORD);
  289.     if (!hkey || RegQueryValueEx(hkey, RS_CAPSHADOW, 0, NULL, (PBYTE)&tmp, &cbData))
  290.         tmp = DEFAULT_CAPSHADOW;
  291.     CheckDlgButton(hwnd, IDC_CAPDRAWSHADOW, (tmp & TSFCS_NODEEP) ? BST_UNCHECKED : BST_CHECKED);
  292.     n = (tmp & TSFCS_DEEPMASK) >> 24;
  293.     if (tmp & TSFCS_NEGATIVEDEEP) n = -n;
  294.     SendMessage(GetDlgItem(hwnd, IDC_CAPSHADOWDEEPSPIN), UDM_SETPOS32, 0, n);        
  295.     SetUxButtonColor(GetDlgItem(hwnd, IDC_CAPSHADOWCOLOR), tmp & TSFCS_COLORMASK);
  296.  
  297.     if (hkey)
  298.         RegCloseKey(hkey);
  299. }
  300.  
  301. //-------------------------------------------------
  302.  
  303. BOOL SaveSettings(HWND hwnd) {
  304.     
  305.     HKEY hkey = NULL;
  306.     WCHAR szBuff[1024+16];
  307.  
  308.     // autostart
  309.     if (!RegOpenKeyEx(HKEY_CURRENT_USER, RS_RUN_KEY, 0, KEY_WRITE, &hkey)) {
  310.         if (IsDlgButtonChecked(hwnd, IDC_AUTOSTART) == BST_CHECKED) {
  311.             WCHAR szBuff[1024];
  312.             int n = GetModuleFileName(g_hinstExe, szBuff, SIZEOF_ARRAY(szBuff));
  313.             if (n != 0 && n < SIZEOF_ARRAY(szBuff) - 16) {
  314.  
  315.                 while (n >= 0 && szBuff[n] != L'\\') n--;
  316.                 if (n > 0) n++;
  317.                 StringCchCopy(szBuff + n, SIZEOF_ARRAY(szBuff) - n, L"TaskSwitchXP.exe");
  318.                 RegSetValueEx(hkey, RS_TASKSWITCHXP, 0, REG_SZ, 
  319.                     (PBYTE)szBuff, (lstrlen(szBuff) + 1) * sizeof(WCHAR));
  320.             } else {
  321.                 ReportError(NULL, IDS_ERR_NOINSTDIR);
  322.             }            
  323.         } else 
  324.             RegDeleteValue(hkey, RS_TASKSWITCHXP);
  325.         RegCloseKey(hkey);
  326.     }
  327.  
  328.     // open key
  329.     if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKeyTs, 0, KEY_WRITE, &hkey)) {
  330.         if (RegCreateKeyEx(HKEY_CURRENT_USER, g_szRegKeyTs, 0, NULL, 
  331.             REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, NULL))
  332.             return(FALSE);
  333.     }
  334.  
  335.     // flags
  336.     DWORD tmp = 0;
  337.     if (IsDlgButtonChecked(hwnd, IDC_HIGHPRIORITY) == BST_CHECKED)
  338.         tmp |= TSF_HIGHPRIORITY;
  339.     if (IsDlgButtonChecked(hwnd, IDC_NOVISUALSTYLES) == BST_CHECKED)
  340.         tmp |= TSF_NOVISUALSTYLES;
  341.     if (IsDlgButtonChecked(hwnd, IDC_LEFTRIGHT) == BST_CHECKED)
  342.         tmp |= TSF_LEFTRIGHT;
  343.     if (IsDlgButtonChecked(hwnd, IDC_NOPVREGION) == BST_CHECKED)
  344.         tmp |= TSF_NOPVREGION;
  345.     if (IsDlgButtonChecked(hwnd, IDC_SHOWINFO) == BST_CHECKED)
  346.         tmp |= TSF_SHOWINFO;
  347.     if (IsDlgButtonChecked(hwnd, IDC_SHOWTOOLTIPS) == BST_CHECKED)
  348.         tmp |= TSF_SHOWTOOLTIPS;
  349.     if (IsDlgButtonChecked(hwnd, IDC_MOUSEOVER) == BST_CHECKED)
  350.         tmp |= TSF_MOUSEOVER;
  351.     if (IsDlgButtonChecked(hwnd, IDC_MOUSESELECT) == BST_CHECKED)
  352.         tmp |= TSF_MOUSESELECT;
  353.     if (IsDlgButtonChecked(hwnd, IDC_MOUSESWITCH) == BST_CHECKED)
  354.         tmp |= TSF_MOUSESWITCH;
  355.     if (IsDlgButtonChecked(hwnd, IDC_INVERSEWHEEL) == BST_CHECKED)
  356.         tmp |= TSF_INVERSEWHEEL;
  357.     if (IsDlgButtonChecked(hwnd, IDC_DROPSHADOW) == BST_CHECKED)
  358.         tmp |= TSF_DROPSHADOW;
  359.     if (IsDlgButtonChecked(hwnd, IDC_TRANSPARENCY) == BST_CHECKED) {
  360.         tmp |= (255 - (DWORD)SendMessage(GetDlgItem(hwnd, 
  361.             IDC_TRANSPARENCYSLIDER), TBM_GETPOS, 0, 0) + 21) & TSF_LAYEREDMASK;
  362.         tmp |= TSF_LAYERED;
  363.     } else
  364.         tmp |= TSF_LAYEREDMASK;
  365.     int n = ComboBox_GetCurSel(GetDlgItem(hwnd, IDC_SCREENPOSCOMBO));
  366.     if (n != CB_ERR) {
  367.         if (n < 3)
  368.             tmp |= TSF_POSTOP;
  369.         else if (n > 5)
  370.             tmp |= TSF_POSBOTTOM;
  371.         if (!(n % 3))
  372.             tmp |= TSF_POSLEFT;
  373.         else if (!((n + 1) % 3))
  374.             tmp |= TSF_POSRIGHT;
  375.     }
  376.     RegSetValueEx(hkey, RS_FLAGS, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  377.  
  378.     // caption font name
  379.     HWND h = GetDlgItem(hwnd, IDC_CAPFONTNAMECOMBO);
  380.     n = ComboBox_GetCurSel(h);
  381.     if (n != CB_ERR) {
  382.         if (ComboBox_GetLBTextLen(h, n) < LF_FACESIZE) {
  383.             if (ComboBox_GetLBText(h, n, szBuff) != CB_ERR) {
  384.                 RegSetValueEx(hkey, RS_CAPFONTNAME, 0, REG_SZ, 
  385.                     (PBYTE)szBuff, (lstrlen(szBuff) + 1) * sizeof(WCHAR));
  386.             }
  387.         }
  388.     }
  389.  
  390.     // caption font size
  391.     tmp = 10;
  392.     if (GetDlgItemText(hwnd, IDC_CAPFONTSIZECOMBO, szBuff, SIZEOF_ARRAY(szBuff))) {
  393.         tmp = _wtol(szBuff);
  394.         if (tmp < 8) tmp = 8;
  395.         else if (tmp > TSFCF_SIZEMASK)
  396.             tmp = TSFCF_SIZEMASK;
  397.     }
  398.     if (IsDlgButtonChecked(hwnd, IDC_CAPFONTBOLD) == BST_CHECKED)
  399.         tmp |= TSFCF_BOLD;
  400.     if (IsDlgButtonChecked(hwnd, IDC_CAPFONTITALIC) == BST_CHECKED)
  401.         tmp |= TSFCF_ITALIC;
  402.     RegSetValueEx(hkey, RS_CAPFONTATTR, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  403.  
  404.     // caption font color
  405.     tmp = (DWORD)GetUxButtonColor(GetDlgItem(hwnd, IDC_CAPTEXTCOLOR));
  406.     RegSetValueEx(hkey, RS_CAPTEXTCOLOR, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  407.  
  408.     // caption font shadow color & deep
  409.     tmp = (DWORD)GetUxButtonColor(GetDlgItem(hwnd, IDC_CAPSHADOWCOLOR)) & TSFCS_COLORMASK;
  410.     n = (int)SendMessage(GetDlgItem(hwnd, IDC_CAPSHADOWDEEPSPIN), UDM_GETPOS32, 0, 0);
  411.     if (n < 0) {
  412.         tmp |= TSFCS_NEGATIVEDEEP;
  413.         n = -n;
  414.     }
  415.     tmp |= (n << 24) & TSFCS_DEEPMASK;
  416.     if (IsDlgButtonChecked(hwnd, IDC_CAPDRAWSHADOW) == BST_UNCHECKED)
  417.         tmp |= TSFCS_NODEEP;
  418.     RegSetValueEx(hkey, RS_CAPSHADOW, 0, REG_DWORD, (PBYTE)&tmp, sizeof(DWORD));
  419.  
  420.     RegCloseKey(hkey);
  421.  
  422.     return(TRUE);
  423. }
  424.  
  425. //-------------------------------------------------
  426. //-------------------------------------------------
  427.  
  428. BOOL Main_OnInitDialog(HWND hwnd, HWND /*hwndFocus*/, LPARAM /*lParam*/) {
  429.  
  430.     HICON hIcon = LoadIcon(g_hinstExe, MAKEINTRESOURCE(IDI_MAIN));
  431.     SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
  432.     SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
  433.  
  434.     InitOwnerDrawCtrls(hwnd);
  435.  
  436.     if (g_pfnEnableThemeDialogTexture)
  437.         g_pfnEnableThemeDialogTexture(hwnd, ETDT_ENABLETAB);
  438.  
  439.     HWND h = GetDlgItem(hwnd, IDC_TRANSPARENCYSLIDER);
  440.     SendMessage(h, TBM_SETRANGE,  TRUE, MAKELONG(21, 255));
  441.     SendMessage(h, TBM_SETTICFREQ,  13, 0);
  442.     SendMessage(h, TBM_SETBUDDY,  FALSE, (LPARAM)GetDlgItem(hwnd, IDC_TRANSPARENCYTEXT));
  443.  
  444.     WCHAR szBuff[64];
  445.     h = GetDlgItem(hwnd, IDC_SCREENPOSCOMBO);
  446.     ComboBox_ResetContent(h);
  447.     for (UINT id = IDS_SCREENPOS1; id <= IDS_SCREENPOS9; id++) {
  448.         LoadString(g_hinstExe, id, szBuff, SIZEOF_ARRAY(szBuff));
  449.         ComboBox_AddString(h, szBuff);
  450.     }
  451.     ComboBox_SetCurSel(h, 4);
  452.  
  453.     h = GetDlgItem(hwnd, IDC_CAPSHADOWDEEPSPIN);
  454.     SendMessage(h, UDM_SETRANGE32, (WPARAM)-16, 16);
  455.     SendMessage(h, UDM_SETPOS32, 0, 2);
  456.     Edit_LimitText(GetDlgItem(hwnd, IDC_CAPSHADOWDEEPEDIT), 3);
  457.  
  458.     LOGFONT lf;
  459.     lf.lfCharSet = ANSI_CHARSET;
  460.     lf.lfFaceName[0] = L'\0';
  461.     lf.lfPitchAndFamily = 0;
  462.  
  463.     vector<FACENAME> vFonts;
  464.     
  465.     HDC hdcScreen = GetWindowDC(NULL);
  466.     EnumFontFamiliesEx(hdcScreen, &lf, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)&vFonts, 0);
  467.     ReleaseDC(NULL, hdcScreen);
  468.  
  469.     h = GetDlgItem(hwnd, IDC_CAPFONTNAMECOMBO);
  470.     for (int i = 0; i < (int)vFonts.size(); i++)
  471.         ComboBox_AddString(h, vFonts[i].szFaceName);
  472.     vFonts.clear();
  473.     ComboBox_SetCurSel(h, 0);
  474.     
  475.     h = GetDlgItem(hwnd, IDC_CAPFONTSIZECOMBO);
  476.     for (int i = 6; i <= 24; i++) {
  477.         StringCchPrintf(szBuff, SIZEOF_ARRAY(szBuff), L"%d", i);
  478.         ComboBox_AddString(h, szBuff);
  479.     }
  480.     ComboBox_SetCurSel(h, 4);
  481.  
  482.     if (GetObject(GetWindowFont(hwnd), sizeof(LOGFONT), (LPVOID)&lf)) {
  483.         lf.lfWeight = FW_BOLD;
  484.         HFONT hfont = CreateFontIndirect(&lf);
  485.         SetWindowFont(GetDlgItem(hwnd, IDC_CAPFONTBOLD), hfont, FALSE);
  486.         lf.lfWeight = FW_NORMAL;
  487.         lf.lfItalic = TRUE;
  488.         hfont = CreateFontIndirect(&lf);
  489.         SetWindowFont(GetDlgItem(hwnd, IDC_CAPFONTITALIC), hfont, FALSE);
  490.     }
  491.  
  492.     SubClassUxColorButton(GetDlgItem(hwnd, IDC_CAPTEXTCOLOR), RGB(255,255,255));
  493.     SubClassUxColorButton(GetDlgItem(hwnd, IDC_CAPSHADOWCOLOR), RGB(0,0,0));
  494.     SubClassUxIconButton(GetDlgItem(hwnd, IDOK), IDI_OK, 0);
  495.  
  496.     LoadSettings(hwnd);
  497.  
  498.     Main_OnCommand(hwnd, IDC_MOUSESELECT, GetDlgItem(hwnd, IDC_MOUSESELECT), BN_CLICKED);
  499.     Main_OnCommand(hwnd, IDC_TRANSPARENCY, GetDlgItem(hwnd, IDC_TRANSPARENCY), BN_CLICKED);
  500.     Main_OnCommand(hwnd, IDC_CAPDRAWSHADOW, GetDlgItem(hwnd, IDC_CAPDRAWSHADOW), BN_CLICKED);
  501.  
  502.     return(TRUE);
  503. }
  504.  
  505. //-------------------------------------------------
  506.  
  507. void Main_OnCommand(HWND hwnd, int id, HWND /*hwndCtl*/, UINT codeNotify) {
  508.  
  509.     if (codeNotify == BN_CLICKED) {
  510.         switch (id) {
  511.  
  512.             case IDC_MOUSESELECT: {
  513.                 BOOL fEnable = (BOOL)(IsDlgButtonChecked(hwnd, IDC_MOUSESELECT) == BST_CHECKED);
  514.                 EnableWindow(GetDlgItem(hwnd, IDC_MOUSESWITCH), fEnable);
  515.                 break;
  516.                                   }
  517.  
  518.             case IDC_TRANSPARENCY: {
  519.                 BOOL fEnable = (BOOL)(IsDlgButtonChecked(hwnd, IDC_TRANSPARENCY) == BST_CHECKED);
  520.                 EnableWindow(GetDlgItem(hwnd, IDC_TRANSPARENCYSLIDER), fEnable);
  521.                 EnableWindow(GetDlgItem(hwnd, IDC_TRANSPARENCYTEXT), fEnable);
  522.                 break;
  523.                                    }
  524.  
  525.             case IDC_CAPDRAWSHADOW: {
  526.                 BOOL fEnable = (BOOL)(IsDlgButtonChecked(hwnd, IDC_CAPDRAWSHADOW) == BST_CHECKED);
  527.                 EnableWindow(GetDlgItem(hwnd, IDC_CAPSHADOWDEEPTEXT), fEnable);
  528.                 EnableWindow(GetDlgItem(hwnd, IDC_CAPSHADOWDEEPEDIT), fEnable);
  529.                 EnableWindow(GetDlgItem(hwnd, IDC_CAPSHADOWDEEPSPIN), fEnable);
  530.                 EnableWindow(GetDlgItem(hwnd, IDC_CAPSHADOWCOLORTEXT), fEnable);
  531.                 EnableWindow(GetDlgItem(hwnd, IDC_CAPSHADOWCOLOR), fEnable);
  532.                 break;
  533.                                     }
  534.  
  535.             case IDC_CAPTEXTCOLOR:
  536.             case IDC_CAPSHADOWCOLOR: {
  537.  
  538.                 static COLORREF s_pcrCustColors[16] = { 
  539.                     0xffffff, 0xffffff, 0xffffff, 0xffffff, 
  540.                     0xffffff, 0xffffff, 0xffffff, 0xffffff, 
  541.                     0xffffff, 0xffffff, 0xffffff, 0xffffff, 
  542.                     0xffffff, 0xffffff, 0xffffff, 0xffffff };
  543.  
  544.                 CHOOSECOLOR cc = { 0 };                
  545.                 cc.lStructSize = sizeof(CHOOSECOLOR);
  546.                 cc.hwndOwner = hwnd;
  547.                 cc.lpCustColors = s_pcrCustColors;
  548.                 cc.Flags = CC_RGBINIT | CC_FULLOPEN;
  549.  
  550.                 HWND h = GetDlgItem(hwnd, id);
  551.                 cc.rgbResult = GetUxButtonColor(h);
  552.  
  553.                 if (ChooseColor(&cc))
  554.                     SetUxButtonColor(h, cc.rgbResult);
  555.                 break;
  556.                                      }
  557.  
  558.             case IDOK: {
  559.                 SaveSettings(hwnd);
  560.                 HWND hwndTs = FindWindowEx(HWND_MESSAGE, NULL, g_szMainWnd, L"");
  561.                 if (IsWindow(hwndTs)) {
  562.                     SendMessage(hwndTs, WM_RELOADSETTINGS, 0, 0);
  563.                 }
  564.                 //break;
  565.                        }
  566.             case IDCANCEL:
  567.                 EndDialog(hwnd, 0);
  568.                 break;
  569.         }
  570.     }
  571. }
  572.  
  573. //-------------------------------------------------
  574.  
  575. void Main_OnDrawItem(const LPDRAWITEMSTRUCT pdi) {
  576.  
  577.     if (pdi->CtlID == IDC_CAPFONTNAMECOMBO) {
  578.         WCHAR szFontName[LF_FACESIZE];
  579.         int len = ComboBox_GetLBTextLen(pdi->hwndItem, pdi->itemID);
  580.         if (len > 0 && len < LF_FACESIZE) {
  581.             if (ComboBox_GetLBText(pdi->hwndItem, pdi->itemID, szFontName) != CB_ERR) {
  582.  
  583.                 HFONT hfont = CreateFont(-MulDiv(10, GetDeviceCaps(pdi->hDC, LOGPIXELSY), 72),
  584.                     0, 0, 0, FW_NORMAL, FALSE, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, 
  585.                     CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, szFontName);
  586.  
  587.                 COLORREF crBkOld = SetBkColor(pdi->hDC, GetSysColor(
  588.                     (pdi->itemState & ODS_DISABLED) ? COLOR_3DFACE 
  589.                     : (pdi->itemState & ODS_SELECTED) ? COLOR_HIGHLIGHT : COLOR_WINDOW));
  590.                 COLORREF crTextOld = SetTextColor(pdi->hDC, GetSysColor(
  591.                     (pdi->itemState & ODS_DISABLED) ? COLOR_GRAYTEXT 
  592.                     : ((pdi->itemState & ODS_SELECTED) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT)));
  593.  
  594.                 HFONT hfontOld = (HFONT)SelectObject(pdi->hDC, 
  595.                     hfont ? hfont : GetStockObject(DEFAULT_GUI_FONT));
  596.  
  597.                 TEXTMETRIC tm;
  598.                 GetTextMetrics(pdi->hDC, &tm);
  599.  
  600.                 int x = LOWORD(GetDialogBaseUnits()) / 2,
  601.                     y = (pdi->rcItem.bottom + pdi->rcItem.top - tm.tmHeight) / 2;
  602.  
  603.                 ExtTextOut(pdi->hDC, x, y, ETO_CLIPPED | ETO_OPAQUE, &pdi->rcItem, 
  604.                     szFontName, lstrlen(szFontName), NULL);
  605.  
  606.                 if (pdi->itemState & ODS_SELECTED)
  607.                     DrawFocusRect(pdi->hDC, &pdi->rcItem);
  608.  
  609.                 SelectObject(pdi->hDC, hfontOld);
  610.                 if (hfont)
  611.                     DeleteObject(hfont);
  612.                 SetBkColor(pdi->hDC, crBkOld);
  613.                 SetTextColor(pdi->hDC, crTextOld);
  614.             }
  615.         }
  616.     } else if (pdi->CtlID == IDC_CAPTEXTCOLOR || 
  617.         pdi->CtlID == IDC_CAPSHADOWCOLOR || pdi->CtlID == IDOK) {
  618.             DrawUxButton(pdi);
  619.         }
  620. }
  621.  
  622. //-------------------------------------------------
  623.  
  624. INT_PTR CALLBACK Dlg_MainProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  625.  
  626.     switch (uMsg) {
  627.  
  628.         case WM_DRAWITEM: {
  629.             Main_OnDrawItem((LPDRAWITEMSTRUCT)lParam);
  630.             break;
  631.                           }
  632.         case WM_MEASUREITEM: {
  633.             LPMEASUREITEMSTRUCT pmi = (LPMEASUREITEMSTRUCT)lParam;
  634.             if (pmi->CtlID == IDC_CAPFONTNAMECOMBO)
  635.                 pmi->itemHeight = g_nComboItemHeight;
  636.             break;
  637.                                 }
  638.  
  639.         case WM_HSCROLL: {
  640.             WCHAR szBuff[32];
  641.             int nPos = (int)SendDlgItemMessage(hwnd, IDC_TRANSPARENCYSLIDER, TBM_GETPOS, 0, 0);
  642.             nPos = (nPos - 21) * 100 / 260;
  643.             StringCchPrintf(szBuff, SIZEOF_ARRAY(szBuff), L"%d%%", nPos);
  644.             SetDlgItemText(hwnd, IDC_TRANSPARENCYTEXT, szBuff);
  645.             break;
  646.                          }
  647.  
  648.         case WM_NOTIFY: {
  649.             LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam);
  650.             if (pnmhdr->idFrom == IDC_ABOUTLINK || pnmhdr->idFrom == IDC_HOMELINK) {
  651.                 switch (pnmhdr->code) {
  652.                     case NM_CLICK:
  653.                     case NM_RETURN: {
  654.                         PNMLINK pnmlink = reinterpret_cast<PNMLINK>(lParam);
  655.                         if (!lstrcmp(pnmlink->item.szID, L"idHome") || 
  656.                             !lstrcmp(pnmlink->item.szID, L"idEmail")) {
  657.                             ShellExecute(NULL, L"open", pnmlink->item.szUrl, NULL, NULL, SW_SHOWNORMAL);
  658.                         }
  659.                         break;
  660.                                     }
  661.                 }
  662.             }
  663.             break;
  664.                         }
  665.         HANDLE_MSG(hwnd, WM_COMMAND, Main_OnCommand);
  666.  
  667.         case WM_HELP:
  668.             HtmlHelp(GetDesktopWindow(), 
  669.                 L"TaskSwitchXP.chm::/config.html", HH_DISPLAY_TOPIC, NULL);
  670.             break;
  671.  
  672.         case WM_THEMECHANGED:
  673.             UxThemeChanged(hwnd);
  674.             break;
  675.  
  676.         HANDLE_MSG(hwnd, WM_INITDIALOG, Main_OnInitDialog);
  677.     }
  678.     return(0);
  679. }
  680.  
  681. //-------------------------------------------------
  682. //-------------------------------------------------
  683. //-------------------------------------------------
  684. //-------------------------------------------------
  685.