Author: tfaber Date: Thu Dec 19 20:29:17 2013 New Revision: 61301
URL: http://svn.reactos.org/svn/reactos?rev=61301&view=rev Log: [SHIMGVW] - Add Save button functionality. Patch by Ricardo Hanke. CORE-7702
Modified: trunk/reactos/dll/win32/shimgvw/CMakeLists.txt trunk/reactos/dll/win32/shimgvw/shimgvw.c
Modified: trunk/reactos/dll/win32/shimgvw/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shimgvw/CMakeList... ============================================================================== --- trunk/reactos/dll/win32/shimgvw/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shimgvw/CMakeLists.txt [iso-8859-1] Thu Dec 19 20:29:17 2013 @@ -17,6 +17,7 @@ user32 gdi32 gdiplus + comdlg32 msvcrt kernel32 ntdll)
Modified: trunk/reactos/dll/win32/shimgvw/shimgvw.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shimgvw/shimgvw.c... ============================================================================== --- trunk/reactos/dll/win32/shimgvw/shimgvw.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shimgvw/shimgvw.c [iso-8859-1] Thu Dec 19 20:29:17 2013 @@ -22,8 +22,10 @@ #include <wingdi.h> #include <objbase.h> #include <commctrl.h> +#include <commdlg.h> #include <gdiplus.h> #include <tchar.h> +#include <strsafe.h>
#define NDEBUG #include <debug.h> @@ -69,6 +71,75 @@ } }
+static void pSaveImageAs(HWND hwnd) +{ + OPENFILENAMEW sfn; + ImageCodecInfo *codecInfo; + WCHAR szSaveFileName[MAX_PATH]; + WCHAR szFilterMask[2048]; + GUID rawFormat; + UINT num; + UINT size; + UINT sizeRemain; + UINT j; + WCHAR *c; + + ZeroMemory(szSaveFileName, sizeof(szSaveFileName)); + ZeroMemory(szFilterMask, sizeof(szFilterMask)); + ZeroMemory(&sfn, sizeof(sfn)); + sfn.lStructSize = sizeof(sfn); + sfn.hwndOwner = hwnd; + sfn.hInstance = hInstance; + sfn.lpstrFile = szSaveFileName; + sfn.lpstrFilter = szFilterMask; + sfn.nMaxFile = MAX_PATH; + sfn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; + + GdipGetImageEncodersSize(&num, &size); + codecInfo = malloc(size); + if (!codecInfo) + { + DPRINT1("malloc() failed in pSaveImageAs()\n"); + return; + } + + GdipGetImageEncoders(num, size, codecInfo); + GdipGetImageRawFormat(image, &rawFormat); + + sizeRemain = sizeof(szFilterMask); + c = szFilterMask; + + for (j = 0; j < num; ++j) + { + StringCbPrintfExW(c, sizeRemain, &c, &sizeRemain, 0, L"%ls (%ls)", codecInfo[j].FormatDescription, codecInfo[j].FilenameExtension); + + /* Skip the NULL character */ + c++; + sizeRemain -= sizeof(*c); + + StringCbPrintfExW(c, sizeRemain, &c, &sizeRemain, 0, L"%ls", codecInfo[j].FilenameExtension); + + /* Skip the NULL character */ + c++; + sizeRemain -= sizeof(*c); + + if (IsEqualGUID(&rawFormat, &codecInfo[j].FormatID) == TRUE) + { + sfn.nFilterIndex = j + 1; + } + } + + if (GetSaveFileNameW(&sfn)) + { + if (GdipSaveImageToFile(image, szSaveFileName, &codecInfo[sfn.nFilterIndex - 1].Clsid, NULL) != Ok) + { + DPRINT1("GdipSaveImageToFile() failed\n"); + } + } + + free(codecInfo); +} + static VOID ImageView_DrawImage(HWND hwnd) { @@ -92,7 +163,7 @@ DPRINT1("GdipCreateFromHDC() failed\n"); return; } - + GdipGetImageWidth(image, &uImgWidth); GdipGetImageHeight(image, &uImgHeight);
@@ -332,6 +403,7 @@
break; case IDC_SAVE: + pSaveImageAs(hwnd);
break; case IDC_PRINT: @@ -453,7 +525,7 @@
// Create the window WndClass.lpszClassName = _T("shimgvw_window"); - WndClass.lpfnWndProc = (WNDPROC)ImageView_WndProc; + WndClass.lpfnWndProc = ImageView_WndProc; WndClass.hInstance = hInstance; WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPICON)); @@ -466,7 +538,7 @@ hMainWnd = CreateWindow(_T("shimgvw_window"), szBuf, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, - 0, 0, NULL, NULL, hInstance, NULL); + 0, 0, NULL, NULL, hInstance, NULL);
// Show it ShowWindow(hMainWnd, SW_SHOW);