diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c index 800f60d20d5..613cb250023 100644 --- a/dll/win32/shimgvw/shimgvw.c +++ b/dll/win32/shimgvw/shimgvw.c @@ -989,8 +989,35 @@ ImageView_OnSize(HWND hwnd, UINT state, INT cx, INT cy) static LRESULT ImageView_Delete(HWND hwnd) { - DPRINT1("ImageView_Delete: unimplemented.\n"); - return 0; + WCHAR szCurFile[MAX_PATH + 1], szNextFile[MAX_PATH]; + SHFILEOPSTRUCT FileOp = { hwnd, FO_DELETE }; + + if (image) + { + GdipDisposeImage(image); + image = NULL; + } + + /* FileOp.pFrom must be double-null-terminated */ + GetFullPathNameW(currentFile->FileName, _countof(szCurFile) - 1, szCurFile, NULL); + szCurFile[_countof(szCurFile) - 2] = UNICODE_NULL; /* Avoid buffer overrun */ + szCurFile[lstrlenW(szCurFile) + 1] = UNICODE_NULL; + + GetFullPathNameW(currentFile->Next->FileName, _countof(szNextFile), szNextFile, NULL); + szNextFile[_countof(szNextFile) - 1] = UNICODE_NULL; /* Avoid buffer overrun */ + + FileOp.pFrom = szCurFile; + FileOp.fFlags = FOF_ALLOWUNDO; + if (SHFileOperation(&FileOp) != 0) + return 0; + + pFreeFileList(currentFile); + currentFile = NULL; + + currentFile = pBuildFileList(szNextFile); + pLoadImageFromNode(currentFile, hwnd); + + return 1; } static LRESULT