/* * explorer - Dialog box property sheet for "explorer ui tweaks" */ #include "tweakui.h" #pragma BEGIN_CONST_DATA typedef struct SCEI { /* Shortcut effect info */ PCTSTR ptszDll; int iIcon; } SCEI; const SCEI CODESEG rgscei[] = { { g_tszPathShell32, 29 }, { g_tszPathMe, IDI_ALTLINK - 1 }, { g_tszPathMe, IDI_BLANK - 1 }, }; KL const c_klHackPtui = { &g_hkLMSMWCV, c_tszAppletTweakUI, c_tszHackPtui }; KL const c_klLinkOvl = { &pcdii->hkLMExplorer, c_tszShellIcons, c_tszLinkOvl }; KL const c_klWelcome = { &pcdii->hkCUExplorer, c_tszTips, c_tszShow }; KL const c_klAltColor = { &pcdii->hkCUExplorer, 0, c_tszAltColor }; KL const c_klHotlight = { &c_hkCU, c_tszCplColors, c_tszHotTrackColor }; KL const c_klNoConnection = { &pcdii->hkCUExplorer, 0, TEXT("NoFileFolderConnection") }; #define clrDefAlt RGB(0x00, 0x00, 0xFF) #define clrDefHot RGB(0x00, 0x00, 0xFF) const static DWORD CODESEG rgdwHelp[] = { IDC_LINKGROUP, IDH_LINKEFFECT, IDC_LINKARROW, IDH_LINKEFFECT, IDC_LIGHTARROW, IDH_LINKEFFECT, IDC_NOARROW, IDH_LINKEFFECT, IDC_CUSTOMARROW, IDH_LINKEFFECT, IDC_CUSTOMCHANGE, IDH_LINKEFFECT, IDC_LINKBEFORETEXT, IDH_LINKEFFECT, IDC_LINKBEFORE, IDH_LINKEFFECT, IDC_LINKAFTERTEXT, IDH_LINKEFFECT, IDC_LINKAFTER, IDH_LINKEFFECT, IDC_LINKHELP, IDH_LINKEFFECT, IDC_SETGROUP, IDH_GROUP, IDC_CLRGROUP, IDH_GROUP, IDC_COMPRESSTXT, IDH_COMPRESSCLR, IDC_COMPRESSCLR, IDH_COMPRESSCLR, IDC_COMPRESSBTN, IDH_COMPRESSCLR, IDC_HOTTRACKTXT, IDH_HOTTRACKCLR, IDC_HOTTRACKCLR, IDH_HOTTRACKCLR, IDC_HOTTRACKBTN, IDH_HOTTRACKCLR, IDC_RESET, IDH_RESET, 0, 0, }; #pragma END_CONST_DATA /***************************************************************************** * * CustomColor * * A little class the manages the little custom color buttons. * *****************************************************************************/ class CustomColor { public: void Init(HWND hwnd); void Destroy(); void SetColor(COLORREF clr); COLORREF GetColor(); private: COLORREF _clr; /* The color */ HWND _hwnd; /* Button control we party on */ HBITMAP _hbm; /* Solid bitmap for button */ RECT _rc; /* Rectangle dimensions of bitmap */ }; /***************************************************************************** * * CustomColor::Init * * Say which control is in charge. * *****************************************************************************/ void CustomColor::Init(HWND hwnd) { HDC hdc; _hwnd = hwnd; GetClientRect(_hwnd, &_rc); hdc = GetDC(hwnd); if (hdc) { _hbm = CreateCompatibleBitmap(hdc, _rc.right, _rc.bottom); ReleaseDC(hwnd, hdc); } else { _hbm = NULL; } SendMessage(_hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)_hbm); } /***************************************************************************** * * CustomColor::Destroy * * Clean up the custom color stuff. * *****************************************************************************/ void CustomColor::Destroy() { if (_hwnd) { SendMessage(_hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)NULL); } if (_hbm) { DeleteObject(_hbm); } } /***************************************************************************** * * CustomColor::SetColor * * Set the custom color. * *****************************************************************************/ void CustomColor::SetColor(COLORREF clr) { /* * Fill the bitmap with the new color. */ _clr = clr; HDC hdc = CreateCompatibleDC(NULL); if (hdc) { HBITMAP hbmPrev = SelectBitmap(hdc, _hbm); SetBkColor(hdc, _clr); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &_rc, NULL, 0, NULL); SelectObject(hdc, hbmPrev); DeleteDC(hdc); } /* * Okay, repaint with the new bitmap. */ InvalidateRect(_hwnd, NULL, TRUE); } /***************************************************************************** * * CustomColor::GetColor * * Get the custom color. * *****************************************************************************/ COLORREF __inline CustomColor::GetColor() { return _clr; } /***************************************************************************** * * EDII * *****************************************************************************/ typedef struct EDII { HIMAGELIST himl; /* Private image list */ WNDPROC wpAfter; /* Subclass procedure */ UINT idcCurEffect; /* currently selected effect */ BOOL fIconDirty; /* if the shortcut icon is dirty */ int iIcon; /* Custom shortcut effect icon */ CustomColor ccComp; /* Compressed files */ CustomColor ccHot; /* Hot-track */ TCH tszPathDll[MAX_PATH]; /* Custom shortcut effect dll */ } EDII, *PEDII; EDII edii; #define pedii (&edii) /***************************************************************************** * * GetRestriction * * Determine whether a restriction is set. Restrictions are reverse-sense, * so we un-reverse them here, so that this returns 1 if the feature is * enabled. * *****************************************************************************/ BOOL PASCAL GetRestriction(LPCTSTR ptszKey) { return GetRegDword(g_hkCUSMWCV, c_tszRestrictions, ptszKey, 0) == 0; } /***************************************************************************** * * SetRestriction * * Set a restriction. Again, since restrictions are reverse-sense, we * un-reverse them here, so that passing 1 enables the feature. * *****************************************************************************/ BOOL PASCAL SetRestriction(LPCTSTR ptszKey, BOOL f) { return SetRegDword(g_hkCUSMWCV, c_tszRestrictions, ptszKey, !f); } /***************************************************************************** * * Explorer_HackPtui * * Patch up a bug in comctl32, where a blank overlay image gets * the wrong rectangle set into it because comctl32 gets confused * when all the pixels are transparent. As a result, the link * overlay becomes THE ENTIRE IMAGELIST instead of nothing. * * We do this by (hack!) swiping himlIcons and himlIconsSmall * from SHELL32, and then (ptui!) partying DIRECTLY INTO THEM * and fixing up the rectangle coordinates. * * I'm really sorry I have to do this, but if I don't, people will * just keep complaining. * * Helper procedures: * * Explorer_HackPtuiCough - fixes one himl COMCTL32's data structures. * *****************************************************************************/ /* * On entry to Explorer_HackPtuiCough, the pointer has already been * validated. */ BOOL PASCAL Explorer_HackPtuiCough(LPBYTE lpb, LPVOID pvRef) { #if 0 if (*(LPWORD)lpb == 0x4C49 && *(LPDWORD)(lpb + 0x78) == 0 && *(LPDWORD)(lpb + 0x88) == 0) { #else if (*(LPWORD)lpb == 0x4C49) { #endif *(LPDWORD)(lpb + 0x78) = 1; *(LPDWORD)(lpb + 0x88) = 1; return 1; } else { return 0; } } void PASCAL Explorer_HackPtui(void) { if (g_fBuggyComCtl32 && GetIntPkl(0, &c_klHackPtui)) { if (WithSelector((DWORD_PTR)GetSystemImageList(0), 0x8C, (WITHPROC)Explorer_HackPtuiCough, 0, 1) && WithSelector((DWORD_PTR)GetSystemImageList(SHGFI_SMALLICON), 0x8C, (WITHPROC)Explorer_HackPtuiCough, 0, 1)) { RedrawWindow(0, 0, 0, RDW_INVALIDATE | RDW_ALLCHILDREN); } } } /***************************************************************************** * * Explorer_SetAfterImage * * The link overlay image has changed, so update the "after" image, too. * All we have to do is invalidate the window; our WM_PAINT handler will * paint the new effect. * *****************************************************************************/ INLINE void Explorer_SetAfterImage(HWND hdlg) { InvalidateRect(GetDlgItem(hdlg, IDC_LINKAFTER), 0, 1); } /***************************************************************************** * * Explorer_After_OnPaint * * Paint the merged images. * * I used to use ILD_TRANSPARENT, except for some reason the background * wasn't erased by WM_ERASEBKGND. (Probably because statics don't * process that message.) * *****************************************************************************/ LRESULT PASCAL Explorer_After_OnPaint(HWND hwnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); if (hdc) { ImageList_SetBkColor(pedii->himl, GetSysColor(COLOR_BTNFACE)); ImageList_Draw(pedii->himl, 0, hdc, 0, 0, ILD_NORMAL | INDEXTOOVERLAYMASK(1)); EndPaint(hwnd, &ps); } return 0; } /***************************************************************************** * * Explorer_After_WndProc * * Subclass window procedure for the after-image. * *****************************************************************************/ LRESULT EXPORT Explorer_After_WndProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_PAINT: return Explorer_After_OnPaint(hwnd); } return CallWindowProc(pedii->wpAfter, hwnd, wm, wp, lp); } /***************************************************************************** * * Explorer_GetIconSpecFromRegistry * * The output buffer must be MAX_PATH characters in length. * * Returns the icon index. * *****************************************************************************/ int PASCAL Explorer_GetIconSpecFromRegistry(LPTSTR ptszBuf) { int iIcon; if (GetStrPkl(ptszBuf, cbCtch(MAX_PATH), &c_klLinkOvl)) { iIcon = ParseIconSpec(ptszBuf); } else { ptszBuf[0] = TEXT('\0'); iIcon = 0; } return iIcon; } /***************************************************************************** * * Explorer_RefreshOverlayImage * * There was a change to the shortcut effects. Put a new overlay * image into the imagelist and update the After image as well. * *****************************************************************************/ void PASCAL Explorer_RefreshOverlayImage(HWND hdlg) { HICON hicon = ExtractIcon(hinstCur, pedii->tszPathDll, pedii->iIcon); if ((UINT_PTR)hicon <= 1) { hicon = ExtractIcon(hinstCur, g_tszPathShell32, 29); /* default */ } ImageList_ReplaceIcon(pedii->himl, 1, hicon); SafeDestroyIcon(hicon); Explorer_SetAfterImage(hdlg); } /***************************************************************************** * * Explorer_OnEffectChange * * There was a change to the shortcut effects. * * Put the new effect icon into the image list and update stuff. * *****************************************************************************/ void PASCAL Explorer_OnEffectChange(HWND hdlg, UINT id) { if (id != pedii->idcCurEffect) { if (id == IDC_CUSTOMARROW) { EnableDlgItem(hdlg, IDC_CUSTOMCHANGE, TRUE); } else { EnableDlgItem(hdlg, IDC_CUSTOMCHANGE, FALSE); lstrcpy(pedii->tszPathDll, rgscei[id - IDC_LINKFIRST].ptszDll); pedii->iIcon = rgscei[id - IDC_LINKFIRST].iIcon; } pedii->idcCurEffect = id; pedii->fIconDirty = 1; Explorer_RefreshOverlayImage(hdlg); Common_SetDirty(hdlg); } } /***************************************************************************** * * Explorer_ChangeEffect * * The user wants to customize the link effect. * *****************************************************************************/ void PASCAL Explorer_ChangeEffect(HWND hdlg) { if (PickIcon(hdlg, pedii->tszPathDll, cA(pedii->tszPathDll), &pedii->iIcon)) { pedii->fIconDirty = 1; Explorer_RefreshOverlayImage(hdlg); Common_SetDirty(hdlg); } } #if 0 /***************************************************************************** * * Explorer_FactoryReset * * Restore to factory settings. * *****************************************************************************/ BOOL PASCAL Explorer_FactoryReset(HWND hdlg) { if (pedii->idcCurEffect != IDC_LINKARROW) { if (pedii->idcCurEffect) { CheckDlgButton(hdlg, pedii->idcCurEffect, 0); } CheckDlgButton(hdlg, IDC_LINKARROW, 1); Explorer_OnEffectChange(hdlg, IDC_LINKARROW); } CheckDlgButton(hdlg, IDC_PREFIX, 1); CheckDlgButton(hdlg, IDC_EXITSAVE, 1); CheckDlgButton(hdlg, IDC_BANNER, 1); CheckDlgButton(hdlg, IDC_WELCOME, 1); if (mit.ReadCabinetState) { CheckDlgButton(hdlg, IDC_MAKEPRETTY, 1); pedii->ccComp.SetColor(clrDefAlt); } if (GetSysColorBrush(COLOR_HOTLIGHT)) { pedii->ccHot.SetColor(clrDefHot); } Common_SetDirty(hdlg); return 1; } #endif /***************************************************************************** * * Explorer_ChangeColor * *****************************************************************************/ BOOL PASCAL Explorer_ChangeColor(HWND hdlg, int id) { CHOOSECOLOR cc; CustomColor *pcc = id == IDC_COMPRESSBTN ? &pedii->ccComp : &pedii->ccHot; DWORD rgdw[16]; HKEY hk; ZeroMemory(rgdw, cbX(rgdw)); if (RegOpenKey(HKEY_CURRENT_USER, c_tszRegPathAppearance, &hk) == 0) { DWORD cb = cbX(rgdw); RegQueryValueEx(hk, c_tszCustomColors, 0, 0, (LPBYTE)rgdw, &cb); RegCloseKey(hk); } cc.lStructSize = cbX(cc); cc.hwndOwner = hdlg; cc.rgbResult = pcc->GetColor(); cc.lpCustColors = rgdw; cc.Flags = CC_RGBINIT; if (ChooseColor(&cc) && pcc->GetColor() != cc.rgbResult) { pcc->SetColor(cc.rgbResult); Common_SetDirty(hdlg); } return 1; } /***************************************************************************** * * Explorer_OnCommand * * Ooh, we got a command. * *****************************************************************************/ void PASCAL Explorer_OnCommand(HWND hdlg, int id, UINT codeNotify) { switch (id) { case IDC_LINKARROW: case IDC_LIGHTARROW: case IDC_NOARROW: case IDC_CUSTOMARROW: if (codeNotify == BN_CLICKED) { Explorer_OnEffectChange(hdlg, id); } break; case IDC_CUSTOMCHANGE: if (codeNotify == BN_CLICKED) Explorer_ChangeEffect(hdlg); break; case IDC_COMPRESSBTN: case IDC_HOTTRACKBTN: if (codeNotify == BN_CLICKED) Explorer_ChangeColor(hdlg, id); break; #if 0 case IDC_RESET: /* Reset to factory default */ if (codeNotify == BN_CLICKED) Explorer_FactoryReset(hdlg); break; #endif } } /***************************************************************************** * * Explorer_GetLinkPrefix * Explorer_SetLinkPrefix * *****************************************************************************/ BOOL PASCAL Explorer_GetLinkPrefix(LPARAM lParam, LPVOID pvRef) { return Link_GetShortcutTo(); } BOOL PASCAL Explorer_SetLinkPrefix(BOOL f, LPARAM lParam, LPVOID pvRef) { if (!Link_SetShortcutTo(f) && pvRef) { LPBOOL pf = (LPBOOL)pvRef; *pf = TRUE; } return TRUE; } /***************************************************************************** * * Explorer_GetRestriction * Explorer_GetRestrictionClassic * Explorer_SetRestriction * *****************************************************************************/ BOOL PASCAL Explorer_GetRestriction(LPARAM lParam, LPVOID pvRef) { LPCTSTR pszRest = (LPCTSTR)pvRef; return GetRestriction(pszRest); } BOOL PASCAL Explorer_GetRestrictionClassic(LPARAM lParam, LPVOID pvRef) { if (g_fIE4) { return -1; } else { LPCTSTR pszRest = (LPCTSTR)pvRef; return GetRestriction(pszRest); } } BOOL PASCAL Explorer_SetRestriction(BOOL f, LPARAM lParam, LPVOID pvRef) { LPCTSTR pszRest = (LPCTSTR)pvRef; BOOL fRc = SetRestriction(pszRest, f); return fRc; } /***************************************************************************** * * Explorer_GetWelcome * Explorer_SetWelcome * *****************************************************************************/ BOOL PASCAL Explorer_GetWelcome(LPARAM lParam, LPVOID pvRef) { if (g_fIE4) { return -1; } else { return GetDwordPkl(&c_klWelcome, 1); } } BOOL PASCAL Explorer_SetWelcome(BOOL f, LPARAM lParam, LPVOID pvRef) { BOOL fRc = SetDwordPkl(&c_klWelcome, f); return fRc; } /***************************************************************************** * * Explorer_Get8Dot3 * Explorer_Set8Dot3 * * The setting is valid only if ReadCabinetState exists and we are not v5. * *****************************************************************************/ BOOL PASCAL Explorer_Get8Dot3(LPARAM lParam, LPVOID pvRef) { CABINETSTATE cs; if (!g_fShell5 && mit.ReadCabinetState && mit.ReadCabinetState(&cs, cbX(cs))) { return !cs.fDontPrettyNames; } else { return -1; } } BOOL PASCAL Explorer_Set8Dot3(BOOL f, LPARAM lParam, LPVOID pvRef) { BOOL fRc = FALSE; CABINETSTATE cs; if (mit.ReadCabinetState(&cs, cbX(cs))) { if (cs.fDontPrettyNames == f) { fRc = TRUE; } else { cs.fDontPrettyNames = f; fRc = mit.WriteCabinetState(&cs); if (fRc && pvRef) { LPBOOL pf = (LPBOOL)pvRef; *pf = TRUE; } } } return fRc; } /***************************************************************************** * * Explorer_GetConnectedFiles * Explorer_SetConnectedFiles * *****************************************************************************/ BOOL PASCAL Explorer_GetConnectedFiles(LPARAM lParam, LPVOID pvRef) { if (g_fShell5) { return !GetDwordPkl(&c_klNoConnection, 0); } else { return -1; } } BOOL PASCAL Explorer_SetConnectedFiles(BOOL f, LPARAM lParam, LPVOID pvRef) { BOOL fRc = SetDwordPkl(&c_klNoConnection, !f); return fRc; } /***************************************************************************** * * c_rgcliExplorer * *****************************************************************************/ /* * Note that this needs to be in sync with the IDS_EXPLOREREFFECTS * strings. */ CHECKLISTITEM c_rgcliExplorer[] = { { Explorer_GetLinkPrefix, Explorer_SetLinkPrefix, 0, }, { Explorer_GetRestriction, Explorer_SetRestriction, (LPARAM)c_tszNoExitSave, }, { Explorer_GetRestrictionClassic, Explorer_SetRestriction, (LPARAM)c_tszNoBanner, }, { Explorer_GetWelcome, Explorer_SetWelcome, 0, }, { Explorer_Get8Dot3, Explorer_Set8Dot3, 0, }, { Explorer_GetConnectedFiles, Explorer_SetConnectedFiles, 0 }, }; /***************************************************************************** * * Explorer_OnInitDialog * * Find out which link icon people are using. * * When we initialize the image list, we just throw something random * into position 1. Explorer_OnEffectChange will put the right thing in. * *****************************************************************************/ BOOL PASCAL Explorer_OnInitDialog(HWND hwndList) { int iscei; CABINETSTATE cs; HWND hdlg = GetParent(hwndList); pedii->iIcon = Explorer_GetIconSpecFromRegistry(pedii->tszPathDll); if (pedii->tszPathDll[0]) { for (iscei = 0; iscei < cA(rgscei); iscei++) { if (pedii->iIcon == rgscei[iscei].iIcon && lstrcmpi(pedii->tszPathDll, rgscei[iscei].ptszDll) == 0) { break; } } } else { iscei = 0; /* Default */ } if (iscei == IDC_LINKARROW - IDC_LINKFIRST && GetIntPkl(0, &c_klHackPtui)) { iscei = IDC_NOARROW - IDC_LINKFIRST; } /* * Don't need to listen to WM_SETTINGCHANGE because we place the * icon inside a static control which will not resize dynamically. */ pedii->himl = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 1, 2, 1); if (pedii->himl) { HICON hicon; hicon = (HICON)SendDlgItemMessage(hdlg, IDC_LINKBEFORE, STM_GETICON, 0, 0L); /* We start with whatever icon got dropped into IDC_BEFORE. */ ImageList_AddIcon(pedii->himl, hicon); /* zero */ ImageList_AddIcon(pedii->himl, hicon); /* one */ if (pedii->tszPathDll[0]) { hicon = ExtractIcon(hinstCur, pedii->tszPathDll, pedii->iIcon); if (ImageList_AddIcon(pedii->himl, hicon) != 1) { /* Oh dear */ } SafeDestroyIcon(hicon); } ImageList_SetOverlayImage(pedii->himl, 1, 1); pedii->wpAfter = SubclassWindow(GetDlgItem(hdlg, IDC_LINKAFTER), Explorer_After_WndProc); } else { /* Oh dear */ } CheckDlgButton(hdlg, IDC_LINKFIRST + iscei, TRUE); pedii->idcCurEffect = -1; Explorer_OnEffectChange(hdlg, IDC_LINKFIRST + iscei); if (!RegCanModifyKey(pcdii->hkLMExplorer, c_tszShellIcons)) { EnableDlgItems(hdlg, IDC_LINKFIRST, IDC_LINKLAST, FALSE); } int iColorsLeft = 2; if (mit.ReadCabinetState && g_fNT) { pedii->ccComp.Init(GetDlgItem(hdlg, IDC_COMPRESSBTN)); pedii->ccComp.SetColor(GetDwordPkl(&c_klAltColor, clrDefAlt)); } else { DestroyDlgItems(hdlg, IDC_COMPRESSFIRST, IDC_COMPRESSLAST); iColorsLeft--; } /* * If COLOR_HOTLIGHT is supported, then do that too. */ if (GetSysColorBrush(COLOR_HOTLIGHT)) { pedii->ccHot.Init(GetDlgItem(hdlg, IDC_HOTTRACKBTN)); pedii->ccHot.SetColor(GetSysColor(COLOR_HOTLIGHT)); } else { DestroyDlgItems(hdlg, IDC_HOTTRACKFIRST, IDC_HOTTRACKLAST); iColorsLeft--; } if (!iColorsLeft) { DestroyDlgItems(hdlg, IDC_CLRGROUP, IDC_CLRGROUP); } pedii->fIconDirty = 0; Checklist_OnInitDialog(hwndList, c_rgcliExplorer, cA(c_rgcliExplorer), IDS_EXPLOREREFFECTS, 0); PropSheet_UnChanged(GetParent(hdlg), hdlg); return 1; } /***************************************************************************** * * Explorer_ApplyOverlay * * This applies the overlay customization. * * HackPtui makes life (unfortunately) difficult. We signal that * HackPtui is necessary by setting the "HackPtui" registry * entry to 1. * *****************************************************************************/ void PASCAL Explorer_ApplyOverlay(void) { /* * Assume that nothing special is needed. */ DelPkl(&c_klLinkOvl); DelPkl(&c_klHackPtui); switch (pedii->idcCurEffect) { case IDC_LINKARROW: break; /* Nothing to do */ case IDC_NOARROW: /* This is the tough one */ if (g_fBuggyComCtl32) { SetIntPkl(1, &c_klHackPtui); } else { TCH tszBuild[MAX_PATH + 1 + 6]; /* comma + 65535 */ default: wsprintf(tszBuild, c_tszSCommaU, pedii->tszPathDll, pedii->iIcon); SetStrPkl(&c_klLinkOvl, tszBuild); } break; } Misc_RebuildIcoCache(); pedii->fIconDirty = 0; } /***************************************************************************** * * Explorer_OnApply * * Write the changes to the registry and force a refresh. * * HackPtui makes life (unfortunately) difficult. We signal that * HackPtui is necessary by setting the "HackPtui" registry * entry to 1. * *****************************************************************************/ void NEAR PASCAL Explorer_OnApply(HWND hdlg) { CABINETSTATE cs; BOOL fNeedLogoff = FALSE; Checklist_OnApply(hdlg, c_rgcliExplorer, &fNeedLogoff, FALSE); if (fNeedLogoff) { Common_NeedLogoff(hdlg); } if (pedii->fIconDirty) { Explorer_ApplyOverlay(); } if (mit.ReadCabinetState) { if (g_fNT && pedii->ccComp.GetColor() != GetDwordPkl(&c_klAltColor, clrDefAlt)) { SetDwordPkl(&c_klAltColor, pedii->ccComp.GetColor()); if (g_fNT5) { SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); } else { Common_NeedLogoff(hdlg); } } } if (GetSysColorBrush(COLOR_HOTLIGHT)) { if (GetSysColor(COLOR_HOTLIGHT) != pedii->ccHot.GetColor()) { COLORREF clrHotlight = pedii->ccHot.GetColor(); TCHAR tsz[64]; int iColor = COLOR_HOTLIGHT; wsprintf(tsz, TEXT("%d %d %d"), GetRValue(clrHotlight), GetGValue(clrHotlight), GetBValue(clrHotlight)); SetStrPkl(&c_klHotlight, tsz); SetSysColors(1, &iColor, &clrHotlight); } } } /***************************************************************************** * * Explorer_OnDestroy * * Clean up * *****************************************************************************/ void PASCAL Explorer_OnDestroy(HWND hdlg) { ImageList_Destroy(pedii->himl); pedii->ccComp.Destroy(); pedii->ccHot.Destroy(); } /***************************************************************************** * * Explorer_OnWhatsThis * *****************************************************************************/ void PASCAL Explorer_OnWhatsThis(HWND hwnd, int iItem) { LV_ITEM lvi; Misc_LV_GetItemInfo(hwnd, &lvi, iItem, LVIF_PARAM); WinHelp(hwnd, c_tszMyHelp, HELP_CONTEXTPOPUP, IDH_PREFIX + lvi.lParam); } /***************************************************************************** * * Oh yeah, we need this too. * *****************************************************************************/ #pragma BEGIN_CONST_DATA LVCI lvciExplorer[] = { { IDC_WHATSTHIS, Explorer_OnWhatsThis }, { 0, 0 }, }; LVV lvvExplorer = { Explorer_OnCommand, 0, /* Explorer_OnInitContextMenu */ 0, /* Explorer_Dirtify */ 0, /* Explorer_GetIcon */ Explorer_OnInitDialog, Explorer_OnApply, Explorer_OnDestroy, 0, /* Explorer_OnSelChange */ 6, /* iMenu */ rgdwHelp, 0, /* Double-click action */ lvvflCanCheck, /* We need check boxes */ lvciExplorer, }; #pragma END_CONST_DATA /***************************************************************************** * * Our window procedure. * *****************************************************************************/ INT_PTR EXPORT Explorer_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam) { return LV_DlgProc(&lvvExplorer, hdlg, wm, wParam, lParam); }