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/CMakeLis…
==============================================================================
--- 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.…
==============================================================================
--- 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);