/* BACKDLG.C ** ** Copyright (C) Microsoft, 1993, All Rights Reserved. ** ** ** History: ** */ #include "precomp.h" #include "shlwapi.h" #define MAX_RHS 256 TCHAR g_szPattern[] = TEXT("pattern"); TCHAR szDesktop[] = TEXT("desktop"); TCHAR szWallpaper[] = TEXT("wallpaper"); TCHAR szTileWall[] = TEXT("TileWallpaper"); TCHAR szDotBMP[] = TEXT(".bmp"); TCHAR szBMP[] = TEXT("\\*.bmp"); TCHAR szDefExt[] = TEXT("bmp"); BOOL g_bValidBitmap = FALSE; // the currently selected wallpaper is valid TCHAR g_szCurPattern[MAX_PATH]; TCHAR g_szCurWallpaper[MAX_PATH]; TCHAR g_szTempItem[MAX_PATH]; // which is more of a waste, stack or data? BOOL g_Back_bInit = TRUE; // assume we are in initialization process BOOL g_Back_bChanged = FALSE; // changes have been made static void NukeExt(LPTSTR sz); static void AddExt(LPTSTR sz, LPTSTR x); static LPTSTR NEAR PASCAL NiceName(LPTSTR sz); INT_PTR CALLBACK PatternDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam); #include "help.h" const static DWORD FAR aBckgrndHelpIds[] = { IDC_NO_HELP_1, IDH_COMM_GROUPBOX, IDC_NO_HELP_2, IDH_COMM_GROUPBOX, IDC_PATLIST, IDH_DSKTPBACKGROUND_PATTLIST, IDC_EDITPAT, IDH_DSKTPBACKGROUND_EDITPAT, IDC_WALLLIST, IDH_DSKTPBACKGROUND_WALLLIST, IDC_BROWSEWALL, IDH_DSKTPBACKGROUND_BROWSE, IDC_TXT_DISPLAY, IDH_DSKTPBACKGROUND_DISPLAY, IDC_TILE, IDH_DSKTPBACKGROUND_TILE, IDC_CENTER, IDH_DSKTPBACKGROUND_CENTER, IDC_BACKPREV, IDH_DSKTPBACKGROUND_MONITOR, 0, 0 }; static const TCHAR szRegStr_Desktop[] = REGSTR_PATH_DESKTOP; static const TCHAR szRegStr_Setup[] = REGSTR_PATH_SETUP TEXT("\\Setup"); static const TCHAR szSharedDir[] = TEXT("SharedDir"); // we're mainly trying to filter multilingual upgrade cases // where the text for "(None)" is unpredictable // BOOL NEAR PASCAL IsProbablyAValidPattern( LPCTSTR pat ) { BOOL sawanumber = FALSE; while( *pat ) { if( ( *pat < TEXT('0') ) || ( *pat > TEXT('9') ) ) { // it's not a number, it better be a space if( *pat != TEXT(' ') ) return FALSE; } else sawanumber = TRUE; // NOTE: we avoid the need for AnsiNext by only advancing on US TCHARs pat++; } // TRUE if we saw at least one digit and there were only digits and spaces return sawanumber; } #ifdef DEBUG #define REG_INTEGER 1000 int fTraceRegAccess = 0; void NEAR PASCAL RegDetails(int iWrite, HKEY hk, LPCTSTR lpszSubKey, LPCTSTR lpszValueName, DWORD dwType, LPTSTR lpszString, int iValue) { TCHAR Buff[256]; TCHAR far *lpszReadWrite[] = { TEXT("DESK.CPL:Read"), TEXT("DESK.CPL:Write") }; if(!fTraceRegAccess) return; switch(dwType) { case REG_SZ: wsprintf(Buff, TEXT("%s String:hk=%#08lx, %s:%s=%s\n\r"), lpszReadWrite[iWrite], hk, lpszSubKey, lpszValueName, lpszString); break; case REG_INTEGER: wsprintf(Buff, TEXT("%s int:hk=%#08lx, %s:%s=%d\n\r"), lpszReadWrite[iWrite], hk, lpszSubKey, lpszValueName, iValue); break; case REG_BINARY: wsprintf(Buff, TEXT("%s Binary:hk=%#08lx, %s:%s=%#0lx;DataSize:%d\r\n"), lpszReadWrite[iWrite], hk, lpszSubKey, lpszValueName, lpszString, iValue); break; } OutputDebugString(Buff); } #endif // DEBUG //--------------------------------------------------------------------------- // GetIntFromSubKey // hKey is the handle to the subkey // (already pointing to the proper location). //--------------------------------------------------------------------------- int NEAR PASCAL GetIntFromSubkey(HKEY hKey, LPCTSTR lpszValueName, int iDefault) { TCHAR szValue[20]; DWORD dwSizeofValueBuff = sizeof(szValue); DWORD dwType; int iRetValue = iDefault; if((RegQueryValueEx(hKey, lpszValueName, NULL, &dwType, (LPBYTE)szValue, &dwSizeofValueBuff) == ERROR_SUCCESS) && dwSizeofValueBuff) { // BOGUS: This handles only the string type entries now! if(dwType == REG_SZ) iRetValue = (int)StrToInt(szValue); #ifdef DEBUG else OutputDebugString(TEXT("String type expected from Registry\n\r")); #endif } #ifdef DEBUG RegDetails(0, hKey, TEXT(""), lpszValueName, REG_INTEGER, NULL, iRetValue); #endif return(iRetValue); } //--------------------------------------------------------------------------- // GetIntFromReg() // Opens the given subkey and gets the int value. //--------------------------------------------------------------------------- int NEAR PASCAL GetIntFromReg(HKEY hKey, LPCTSTR lpszSubkey, LPCTSTR lpszNameValue, int iDefault) { HKEY hk; int iRetValue = iDefault; // See if the key is present. if(RegOpenKey(hKey, lpszSubkey, &hk) == ERROR_SUCCESS) { iRetValue = GetIntFromSubkey(hk, lpszNameValue, iDefault); RegCloseKey(hk); } return(iRetValue); } BOOL NEAR PASCAL GetStringFromReg(HKEY hKey, LPCTSTR lpszSubkey, LPCTSTR lpszValueName, LPCTSTR lpszDefault, LPTSTR lpszValue, DWORD cchSizeofValueBuff) { HKEY hk; DWORD dwType; BOOL fSuccess = FALSE; cchSizeofValueBuff *= sizeof(TCHAR); // See if the key is present. if(RegOpenKey(hKey, lpszSubkey, &hk) == ERROR_SUCCESS) { if((RegQueryValueEx(hk, lpszValueName, NULL, &dwType, (LPBYTE)lpszValue, &cchSizeofValueBuff) == ERROR_SUCCESS) && cchSizeofValueBuff) { // BOGUS: This handles only the string type entries now! #ifdef DEBUG if(dwType != REG_SZ) { OutputDebugString(TEXT("String type expected from Registry\n\r")); } else #endif fSuccess = TRUE; } RegCloseKey(hk); } // If failure, use the default string. if(!fSuccess && lpszDefault) lstrcpy(lpszValue, lpszDefault); #ifdef DEBUG RegDetails(0, hKey, lpszSubkey, lpszValueName, REG_SZ, lpszValue, 0); #endif return(fSuccess); } //--------------------------------------------------------------------------- // // UpdateRegistry: // This updates a given value of any data type at a given // location in the registry. // // The value name is passed in as an Id to a string in USER's String table. // //--------------------------------------------------------------------------- BOOL FAR PASCAL UpdateRegistry(HKEY hKey, LPCTSTR lpszSubkey, LPCTSTR lpszValueName, DWORD dwDataType, LPVOID lpvData, DWORD dwDataSize) { HKEY hk; if(RegCreateKey(hKey, lpszSubkey, &hk) == ERROR_SUCCESS) { RegSetValueEx(hk, lpszValueName, 0L, dwDataType, (const UCHAR *) lpvData, dwDataSize); #ifdef DEBUG RegDetails(1, hKey, lpszSubkey, lpszValueName, dwDataType, (LPTSTR)lpvData, (int)dwDataSize); #endif RegCloseKey(hk); return(TRUE); } return(FALSE); } /*------------------------------------------------------------- ** force the update of the preview. **-------------------------------------------------------------*/ void NEAR PASCAL UpdatePreview(HWND hDlg, WORD flags) { if (IsDlgButtonChecked(hDlg, IDC_TILE)) flags |= BP_TILE; SendDlgItemMessage(hDlg, IDC_BACKPREV, WM_SETBACKINFO, flags, 0L); if (!g_Back_bInit && !g_Back_bChanged) { SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L); g_Back_bChanged = TRUE; } } /*------------------------------------------------------------------ ** read in all of the entries (LHS only) in a section. ** ** return: handle to local (fixed) memory containing names **------------------------------------------------------------------*/ HANDLE PASCAL GetSection(LPTSTR lpIniFile, LPTSTR lpSection) { int nCount; int cchSize = 4096; int cbSize = (cchSize * sizeof(TCHAR)); HANDLE hLocal, hTemp; if (!(hLocal = LocalAlloc(LPTR, cbSize))) return(NULL); while (1) { nCount = GetPrivateProfileString(lpSection, NULL, g_szNULL, (LPTSTR)hLocal, cchSize, lpIniFile); if (nCount <= (cchSize-1)) break; // need to grow the buffer cchSize += 2048; cbSize = (cchSize * sizeof(TCHAR)); hTemp = hLocal; if (!(hLocal = LocalReAlloc(hTemp, cbSize, LMEM_MOVEABLE))) { LocalFree(hTemp); return(NULL); } } return(hLocal); } static void NukeExt(LPTSTR sz) { int len; len = lstrlen(sz); if (len > 4 && sz[len-4] == TEXT('.')) sz[len-4] = 0; } static void AddExt(LPTSTR sz, LPTSTR x) { int len; len = lstrlen(sz); if (len <= 4 || sz[len-4] != TEXT('.')) { lstrcat(sz, TEXT(".")); lstrcat(sz, x); } } static void NameOnly(LPTSTR sz) { LPTSTR p = sz; LPTSTR s = NULL; while( *p ) { if( ( *p == TEXT('\\') ) || ( *p == TEXT(':') ) ) s = p; #if defined(DBCS) || (defined(FE_SB) && !defined(UNICODE)) p = AnsiNext(p); #else p++; #endif } if( s ) { p = sz; while( *s++ ) { *p++ = *s; } } } static BOOL PathOnly(LPTSTR sz) { LPTSTR p = sz; LPTSTR s = NULL; while( *p ) { if( *p == TEXT('\\') ) { s = p; } else if( *p == TEXT(':') ) { s = p + 1; } #if defined(DBCS) || (defined(FE_SB) && !defined(UNICODE)) p = AnsiNext(p); #else p++; #endif } if( s ) { if( s == sz ) s++; *s = TEXT('\0'); return TRUE; } return FALSE; } static LPTSTR NEAR PASCAL NiceName(LPTSTR sz) { NukeExt(sz); if (IsCharUpper(sz[0]) && IsCharUpper(sz[1])) { CharLower(sz); CharUpperBuff(sz, 1); } return sz; } int NEAR PASCAL AddAFileToLB( HWND hwndList, LPCTSTR szDir, LPTSTR szFile ) { int index = LB_ERR; LPTSTR szPath = (LPTSTR)LocalAlloc( LPTR, (( szDir? lstrlen( szDir ) : 0 ) + lstrlen( szFile ) + 2) * sizeof(TCHAR) ); if( szPath ) { if( szDir ) { lstrcpy( (LPTSTR)szPath, (LPTSTR)szDir ); lstrcat( (LPTSTR)szPath, TEXT("\\") ); } else *szPath = TEXT('\0'); lstrcat( (LPTSTR)szPath, szFile ); NameOnly( szFile ); NiceName( szFile ); index = (int)SendMessage( hwndList, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szFile ); if( index >= 0 ) { SendMessage( hwndList, LB_SETITEMDATA, (WPARAM)index, (LPARAM)(LPTSTR)szPath ); } else LocalFree( (HANDLE)szPath ); } return index; } void NEAR PASCAL AddFilesToLB(HWND hwndList, LPTSTR pszDir, LPTSTR szSpec) { WIN32_FIND_DATA fd; HANDLE h; TCHAR szBuf[MAX_PATH]; lstrcpy(szBuf, pszDir); lstrcat(szBuf, szSpec); h = FindFirstFile(szBuf, &fd); if (h != INVALID_HANDLE_VALUE) { do { AddAFileToLB(hwndList, pszDir, fd.cFileName); } while (FindNextFile(h, &fd)); FindClose(h); } } /*------------------------------------------------------------- ** set a new wallpaper and notify the right places. ** ** the new name is in g_szCurWallpaper **-------------------------------------------------------------*/ void NEAR PASCAL SetNewWallpaper(HWND hDlg, LPTSTR szFile, BOOL bCanAdd) { HWND hwndList = GetDlgItem(hDlg, IDC_WALLLIST); if(!szFile || !lstrcmpi(szFile, g_szNone)) szFile = TEXT(""); if( #if defined(DBCS) || (defined(FE_SB) && !defined(UNICODE)) !IsDBCSLeadByte(szFile[0]) && #endif (szFile[1] == TEXT(':')) ) { TCHAR szDrive[3]; TCHAR szNet[MAX_PATH]; ULONG lenNet = ARRAYSIZE(szNet); lstrcpyn(szDrive, szFile, ARRAYSIZE(szDrive)); if ((NO_ERROR == WNetGetConnection(szDrive, szNet, &lenNet)) && (szNet[0] == TEXT('\\')) && (szNet[1] == TEXT('\\'))) { lstrcat(szNet, szFile+2); lstrcpy(szFile, szNet); } } lstrcpy(g_szCurWallpaper, szFile); UpdatePreview(hDlg, BP_NEWWALL); if(bCanAdd && *szFile && g_bValidBitmap) { TCHAR szName[MAX_PATH]; int sel; lstrcpy(szName, szFile); NameOnly(szName); NiceName(szName); if ((sel = (int)SendMessage(hwndList, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)(LPTSTR)szName)) == LB_ERR) { sel = AddAFileToLB(hwndList, NULL, szFile); } SendMessage(hwndList, LB_SETCURSEL, (WPARAM)sel, 0L); } { BOOL bEnable = (*szFile) ? TRUE : FALSE; EnableWindow( GetDlgItem(hDlg, IDC_TXT_DISPLAY), bEnable ); EnableWindow( GetDlgItem(hDlg, IDC_TILE), bEnable ); EnableWindow( GetDlgItem(hDlg, IDC_CENTER), bEnable ); } } void NEAR PASCAL InitBackgroundDialog(HWND hDlg) { HANDLE hSection; HWND hwndList; LPTSTR pszBuffer; TCHAR szBuf[MAX_PATH]; TCHAR szCurPatBits[MAX_PATH]; g_szCurPattern[0] = 0; g_szCurWallpaper[0] = 0; g_Back_bChanged = FALSE; /* ** initialize the pattern list */ // get the current pattern. // GetProfileString(szDesktop, g_szPattern, g_szNULL, szCurPatBits, ARRAYSIZE(szCurPatBits)); szCurPatBits[0] = 0; //Initialize GetStringFromReg(HKEY_CURRENT_USER, szRegStr_Desktop, g_szPattern, g_szNULL, szCurPatBits, ARRAYSIZE(szCurPatBits)); if (!(*szCurPatBits)) lstrcpy(g_szCurPattern, g_szNone); else *g_szCurPattern = 0; hwndList = GetDlgItem(hDlg, IDC_PATLIST); if (hSection = GetSection(g_szControlIni, g_szPatterns)) { BOOL bAddedNone = FALSE; /* Put the patterns into the combo box. */ for (pszBuffer = (LPTSTR) LocalLock(hSection); *pszBuffer; pszBuffer += (lstrlen(pszBuffer)+1)) { if (GetPrivateProfileString(g_szPatterns, pszBuffer, g_szNULL, szBuf, ARRAYSIZE(szBuf), g_szControlIni)) { BOOL bIsNone = !bAddedNone && !lstrcmpi( g_szNone, szBuf ); /* if there's a right-hand side, add it to the list box */ if( bIsNone || IsProbablyAValidPattern( szBuf ) ) { if( bIsNone ) bAddedNone = TRUE; SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)pszBuffer); // if haven't found current pattern name, maybe this is it. if (!(*g_szCurPattern) && (!lstrcmpi(szBuf, szCurPatBits))) { // same pattern bits. we have a name lstrcpy(g_szCurPattern, pszBuffer); } } } } LocalUnlock(hSection); LocalFree(hSection); } // if our patternTEXT('s bits weren')t in the list, use a fake name if (!(*g_szCurPattern)) LoadString(hInstance, IDS_UNLISTEDPAT, g_szCurPattern, ARRAYSIZE(g_szCurPattern)); SendMessage(hwndList, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)g_szCurPattern); UpdatePreview(hDlg, BP_NEWPAT); // exclude TEXT("none") pattern if( (int)SendDlgItemMessage(hDlg,IDC_PATLIST,LB_GETCURSEL,0,0l) <= 0 ) { HWND epat = GetDlgItem( hDlg, IDC_EDITPAT ); if( GetFocus() == epat ) { SendMessage( hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem( hDlg, IDC_PATLIST ), (LPARAM)TRUE ); } EnableWindow( epat, FALSE ); } /* ** initialize the tile/center buttons */ if(GetIntFromReg(HKEY_CURRENT_USER, szRegStr_Desktop, szTileWall, 1)) CheckRadioButton(hDlg, IDC_CENTER, IDC_TILE, IDC_TILE); else CheckRadioButton(hDlg, IDC_CENTER, IDC_TILE, IDC_CENTER); /* ** initialize the wallpaper list */ hwndList = GetDlgItem(hDlg, IDC_WALLLIST); if (!GetWindowsDirectory(szBuf, ARRAYSIZE(szBuf))) { szBuf[0] = 0; } // override with net home dir on shared copies of windows GetStringFromReg(HKEY_LOCAL_MACHINE, szRegStr_Setup, szSharedDir, (LPTSTR)NULL, szBuf, ARRAYSIZE(szBuf)); AddFilesToLB(hwndList, szBuf, szBMP); //GetProfileString(szDesktop, szWallpaper, g_szNone, szBuf, sizeof(szBuf)); GetStringFromReg(HKEY_CURRENT_USER, szRegStr_Desktop, szWallpaper, g_szNone, szBuf, ARRAYSIZE(szBuf)); SetNewWallpaper(hDlg, szBuf, TRUE); // will add and select if not in list // and don't forget the 'none' option if (SendMessage(hwndList, LB_INSERTSTRING, 0, (LPARAM)(LPTSTR)g_szNone) != LB_ERR) { int sel = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0L); if (sel == -1) sel = 0; SendMessage(hwndList, LB_SETCURSEL, (WPARAM)sel, 0L); if (!sel) { EnableWindow( GetDlgItem(hDlg, IDC_TILE), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_CENTER), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_TXT_DISPLAY), FALSE ); } } // allow people to drag wallpapers to this page DragAcceptFiles(hDlg, TRUE); } //the intl tools cannot handle embedded nulls in strings //hack: use the vertical bar and convert void NEAR PASCAL ConvertPipesToNull(LPTSTR szFilter) { #if defined(DBCS) || (defined(FE_SB) && !defined(UNICODE)) if (IsDBCSLeadByte('|')) return; #endif while (*szFilter) { LPTSTR p = CharNext(szFilter); if (*szFilter == TEXT('|')) *szFilter = TEXT('\0'); szFilter = p; } } void NEAR PASCAL BrowseForWallpaper(HWND hDlg) { TCHAR szPath[MAX_PATH]; static TCHAR szWorkDir[MAX_PATH] = TEXT(""); OPENFILENAME ofn; TCHAR szTitle[CCH_MAX_STRING]; TCHAR szFilter[CCH_MAX_STRING]; LoadString(hInstance, IDS_BROWSETITLE, szTitle, ARRAYSIZE(szTitle)); if (LoadString(hInstance, IDS_BROWSEFILTER, szFilter, ARRAYSIZE(szFilter))) ConvertPipesToNull(szFilter); if (!PathOnly(szWorkDir)) { if (!GetWindowsDirectory(szWorkDir, ARRAYSIZE(szWorkDir))) { szWorkDir[0] = 0; } } szPath[0] = TEXT('\0'); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = NULL; ofn.lpstrFilter = szFilter; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.nMaxCustFilter = 0; ofn.lpstrFile = szPath; ofn.nMaxFile = ARRAYSIZE(szPath); ofn.lpstrInitialDir = (szWorkDir[0] ? szWorkDir : NULL); ofn.lpstrTitle = szTitle; ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; ofn.lpfnHook = NULL; ofn.lpstrDefExt = szDefExt; ofn.lpstrFileTitle = NULL; if (GetOpenFileName(&ofn) && (lstrcmpi(g_szCurWallpaper, szPath) != 0)) { CharUpper(szPath); // will be nicenamed (best we can do...) SetNewWallpaper(hDlg, szPath, TRUE); } if (!GetCurrentDirectory(ARRAYSIZE(szWorkDir), szWorkDir)) { szWorkDir[0] = 0; } } void NEAR PASCAL HandleWallpaperDrop(HWND hDlg, HDROP hDrop) { TCHAR szPath[MAX_PATH]; if (DragQueryFile(hDrop, 1, szPath, ARRAYSIZE(szPath)) && (lstrcmpi(g_szCurWallpaper, szPath) != 0)) { int len = lstrlen(szPath); if (len > 4 && !lstrcmpi(szPath+len-4, szDotBMP)) SetNewWallpaper(hDlg, szPath, TRUE); } DragFinish(hDrop); } INT_PTR APIENTRY BackgroundDlgProc(HWND hDlg, UINT message , WPARAM wParam, LPARAM lParam) { NMHDR FAR *lpnm; TCHAR szTiled[] = TEXT("0"); TCHAR szBuf[MAX_PATH]; TCHAR szBuf2[50]; int iTemp; switch(message) { case WM_NOTIFY: lpnm = (NMHDR FAR *)lParam; switch(lpnm->code) { case PSN_APPLY: { DWORD dwRet = PSNRET_NOERROR; if (g_Back_bChanged) { HCURSOR old = SetCursor( LoadCursor( NULL, IDC_WAIT ) ); HWND cover; if (!g_bValidBitmap) { LoadString(hInstance, IDS_BADWALLPAPER, szBuf, ARRAYSIZE(szBuf)); GetWindowText(GetParent(hDlg), szBuf2, ARRAYSIZE(szBuf2)); MessageBox(hDlg, szBuf, szBuf2, MB_OK | MB_ICONEXCLAMATION); dwRet = PSNRET_INVALID_NOCHANGEPAGE; } // do this after whimpering cover = CreateCoverWindow( COVER_NOPAINT ); // need to write out tile first szTiled[0] += (TCHAR)IsDlgButtonChecked(hDlg, IDC_TILE); UpdateRegistry(HKEY_CURRENT_USER, szRegStr_Desktop, szTileWall, REG_SZ, szTiled, SIZEOF(TCHAR)*(lstrlen(szTiled)+1)); if (g_bValidBitmap) { SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, g_szCurWallpaper, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); } if (GetPrivateProfileString(g_szPatterns, g_szCurPattern, g_szNULL, szBuf, ARRAYSIZE(szBuf), g_szControlIni)) { SystemParametersInfo(SPI_SETDESKPATTERN, 0, szBuf, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); } // we're back to no changes g_Back_bChanged = FALSE; if( cover ) PostMessage( cover, WM_CLOSE, 0, 0L ); SetCursor( old ); } SetWindowLongPtr(hDlg, DWLP_MSGRESULT, dwRet ); return TRUE; } case PSN_RESET: break; } break; case WM_INITDIALOG: g_Back_bInit = TRUE; InitBackgroundDialog(hDlg); g_Back_bInit = FALSE; // no longer initializing break; case WM_SYSCOLORCHANGE: case WM_DISPLAYCHANGE: g_Back_bInit = TRUE; // fake init so we don't do PSM_CHANGED UpdatePreview(hDlg, BP_REINIT | BP_NEWPAT ); g_Back_bInit = FALSE; break; case WM_DESTROY: { int count = (int)SendDlgItemMessage(hDlg, IDC_WALLLIST, LB_GETCOUNT, 0, 0L); while (count--) { LPTSTR sz = (LPTSTR)SendDlgItemMessage(hDlg, IDC_WALLLIST, LB_GETITEMDATA, count, 0L); if (sz) LocalFree ((HANDLE)sz); } break; } case WM_HELP: WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, TEXT("display.hlp"), HELP_WM_HELP, (DWORD_PTR) (LPTSTR) aBckgrndHelpIds); return TRUE; case WM_CONTEXTMENU: // right mouse click WinHelp((HWND) wParam, TEXT("display.hlp"), HELP_CONTEXTMENU, (DWORD_PTR) (LPTSTR) aBckgrndHelpIds); return TRUE; case WM_DROPFILES: HandleWallpaperDrop(hDlg, (HDROP)wParam); return TRUE; case WM_QUERYNEWPALETTE: case WM_PALETTECHANGED: SendDlgItemMessage(hDlg, IDC_BACKPREV, message, wParam, lParam); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_PATLIST: if(HIWORD(wParam) == LBN_SELCHANGE) { iTemp = (int)SendDlgItemMessage(hDlg,IDC_PATLIST, LB_GETCURSEL,0,0l); if(iTemp >= 0) { SendDlgItemMessage(hDlg, IDC_PATLIST, LB_GETTEXT, iTemp, (LPARAM)(LPTSTR)szBuf); if (lstrcmpi(szBuf, g_szCurPattern) == 0) break; lstrcpy(g_szCurPattern, szBuf); UpdatePreview(hDlg, BP_NEWPAT); } EnableWindow( GetDlgItem( hDlg, IDC_EDITPAT ), ( iTemp > 0 ) ); // exclude "none" pattern } break; case IDC_WALLLIST: if(HIWORD(wParam) == LBN_SELCHANGE) { LPTSTR pBuf = NULL; iTemp = (int)SendDlgItemMessage(hDlg,IDC_WALLLIST, LB_GETCURSEL,0,0l); if(iTemp >= 0) { pBuf = (LPTSTR)SendDlgItemMessage(hDlg, IDC_WALLLIST, LB_GETITEMDATA, iTemp, 0L); } SetNewWallpaper(hDlg, pBuf, FALSE); } break; case IDC_CENTER: case IDC_TILE: if ((HIWORD(wParam) == BN_CLICKED) && (!IsDlgButtonChecked(hDlg, LOWORD(wParam)))) { CheckRadioButton(hDlg, IDC_CENTER, IDC_TILE, LOWORD(wParam)); UpdatePreview(hDlg, 0); } break; case IDC_BROWSEWALL: BrowseForWallpaper(hDlg); break; } break; } return FALSE; }