3 * PROJECT: ReactOS Picture and Fax Viewer
4 * FILE: dll/win32/shimgvw/shimgvw.c
6 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
12 #define WIN32_NO_STATUS
14 #define COM_NO_WINDOWS_H
38 SHIMGVW_SETTINGS shiSettings
;
39 SHIMGVW_FILENODE
*currentFile
;
41 WNDPROC PrevProc
= NULL
;
43 HWND hDispWnd
, hToolBar
;
46 static const TBBUTTON Buttons
[] =
47 { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
48 {TBICON_PREV
, IDC_PREV
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
49 {TBICON_NEXT
, IDC_NEXT
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
50 {15, 0, TBSTATE_ENABLED
, BTNS_SEP
, {0}, 0, 0},
51 {TBICON_ZOOMP
, IDC_ZOOMP
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
52 {TBICON_ZOOMM
, IDC_ZOOMM
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
53 {15, 0, TBSTATE_ENABLED
, BTNS_SEP
, {0}, 0, 0},
54 {TBICON_ROT1
, IDC_ROT1
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
55 {TBICON_ROT2
, IDC_ROT2
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
56 {15, 0, TBSTATE_ENABLED
, BTNS_SEP
, {0}, 0, 0},
57 {TBICON_SAVE
, IDC_SAVE
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
58 {TBICON_PRINT
, IDC_PRINT
, TBSTATE_ENABLED
, BTNS_BUTTON
, {0}, 0, 0},
61 static void pLoadImage(LPWSTR szOpenFileName
)
63 if (GetFileAttributesW(szOpenFileName
) == 0xFFFFFFFF)
65 DPRINT1("File %s not found!\n", szOpenFileName
);
69 GdipLoadImageFromFile(szOpenFileName
, &image
);
72 DPRINT1("GdipLoadImageFromFile() failed\n");
76 static void pSaveImageAs(HWND hwnd
)
79 ImageCodecInfo
*codecInfo
;
80 WCHAR szSaveFileName
[MAX_PATH
];
89 GdipGetImageEncodersSize(&num
, &size
);
90 codecInfo
= malloc(size
);
93 DPRINT1("malloc() failed in pSaveImageAs()\n");
97 GdipGetImageEncoders(num
, size
, codecInfo
);
98 GdipGetImageRawFormat(image
, &rawFormat
);
102 for (j
= 0; j
< num
; ++j
)
104 // Every pair needs space for the Description, twice the Extensions, 1 char for the space, 2 for the braces and 2 for the NULL terminators.
105 sizeRemain
= sizeRemain
+ (((wcslen(codecInfo
[j
].FormatDescription
) + (wcslen(codecInfo
[j
].FilenameExtension
) * 2) + 5) * sizeof(WCHAR
)));
108 /* Add two more chars for the last terminator */
109 sizeRemain
= sizeRemain
+ (sizeof(WCHAR
) * 2);
111 szFilterMask
= malloc(sizeRemain
);
114 DPRINT1("cannot allocate memory for filter mask in pSaveImageAs()");
119 ZeroMemory(szSaveFileName
, sizeof(szSaveFileName
));
120 ZeroMemory(szFilterMask
, sizeRemain
);
121 ZeroMemory(&sfn
, sizeof(sfn
));
122 sfn
.lStructSize
= sizeof(sfn
);
123 sfn
.hwndOwner
= hwnd
;
124 sfn
.hInstance
= hInstance
;
125 sfn
.lpstrFile
= szSaveFileName
;
126 sfn
.lpstrFilter
= szFilterMask
;
127 sfn
.nMaxFile
= MAX_PATH
;
128 sfn
.Flags
= OFN_OVERWRITEPROMPT
| OFN_HIDEREADONLY
;
132 for (j
= 0; j
< num
; ++j
)
134 StringCbPrintfExW(c
, sizeRemain
, &c
, &sizeRemain
, 0, L
"%ls (%ls)", codecInfo
[j
].FormatDescription
, codecInfo
[j
].FilenameExtension
);
136 /* Skip the NULL character */
138 sizeRemain
-= sizeof(*c
);
140 StringCbPrintfExW(c
, sizeRemain
, &c
, &sizeRemain
, 0, L
"%ls", codecInfo
[j
].FilenameExtension
);
142 /* Skip the NULL character */
144 sizeRemain
-= sizeof(*c
);
146 if (IsEqualGUID(&rawFormat
, &codecInfo
[j
].FormatID
) == TRUE
)
148 sfn
.nFilterIndex
= j
+ 1;
152 if (GetSaveFileNameW(&sfn
))
154 if (GdipSaveImageToFile(image
, szSaveFileName
, &codecInfo
[sfn
.nFilterIndex
- 1].Clsid
, NULL
) != Ok
)
156 DPRINT1("GdipSaveImageToFile() failed\n");
165 pLoadImageFromNode(SHIMGVW_FILENODE
*node
, HWND hwnd
)
167 WCHAR szTitleBuf
[800];
173 c
= wcsrchr(node
->FileName
, '\\');
179 LoadStringW(hInstance
, IDS_APPTITLE
, szResStr
, 512);
180 StringCbPrintfExW(szTitleBuf
, 800, NULL
, NULL
, 0, L
"%ls%ls%ls", szResStr
, L
" - ", c
);
181 SetWindowTextW(hwnd
, szTitleBuf
);
185 GdipDisposeImage(image
);
188 pLoadImage(node
->FileName
);
189 InvalidateRect(hDispWnd
, NULL
, TRUE
);
190 UpdateWindow(hDispWnd
);
194 static SHIMGVW_FILENODE
*
195 pBuildFileList(LPWSTR szFirstFile
)
199 WCHAR szSearchPath
[MAX_PATH
];
200 WCHAR szSearchMask
[MAX_PATH
];
201 WCHAR szFileTypes
[MAX_PATH
];
202 WIN32_FIND_DATAW findData
;
203 SHIMGVW_FILENODE
*currentNode
;
204 SHIMGVW_FILENODE
*root
;
205 SHIMGVW_FILENODE
*conductor
;
206 ImageCodecInfo
*codecInfo
;
212 wcscpy(szSearchPath
, szFirstFile
);
213 PathRemoveFileSpecW(szSearchPath
);
215 GdipGetImageDecodersSize(&num
, &size
);
216 codecInfo
= malloc(size
);
219 DPRINT1("malloc() failed in pLoadFileList()\n");
223 GdipGetImageDecoders(num
, size
, codecInfo
);
225 root
= malloc(sizeof(SHIMGVW_FILENODE
));
228 DPRINT1("malloc() failed in pLoadFileList()\n");
235 for (j
= 0; j
< num
; ++j
)
237 StringCbPrintfExW(szFileTypes
, MAX_PATH
, NULL
, NULL
, 0, L
"%ls", codecInfo
[j
].FilenameExtension
);
239 extension
= wcstok(szFileTypes
, L
";");
240 while (extension
!= NULL
)
242 StringCbPrintfExW(szSearchMask
, MAX_PATH
, NULL
, NULL
, 0, L
"%ls%ls%ls", szSearchPath
, L
"\\", extension
);
244 hFindHandle
= FindFirstFileW(szSearchMask
, &findData
);
245 if (hFindHandle
!= INVALID_HANDLE_VALUE
)
249 StringCbPrintfExW(conductor
->FileName
, MAX_PATH
, NULL
, NULL
, 0, L
"%ls%ls%ls", szSearchPath
, L
"\\", findData
.cFileName
);
251 // compare the name of the requested file with the one currently found.
252 // if the name matches, the current node is returned by the function.
253 if (wcscmp(szFirstFile
, conductor
->FileName
) == 0)
255 currentNode
= conductor
;
258 conductor
->Next
= malloc(sizeof(SHIMGVW_FILENODE
));
260 // if malloc fails, make circular what we have and return it
261 if (!conductor
->Next
)
263 DPRINT1("malloc() failed in pLoadFileList()\n");
265 conductor
->Next
= root
;
266 root
->Prev
= conductor
;
268 FindClose(hFindHandle
);
273 conductor
->Next
->Prev
= conductor
;
274 conductor
= conductor
->Next
;
276 while (FindNextFileW(hFindHandle
, &findData
) != 0);
278 FindClose(hFindHandle
);
281 extension
= wcstok(NULL
, L
";");
285 // we now have a node too much in the list. In case the requested file was not found,
286 // we use this node to store the name of it, otherwise we free it.
287 if (currentNode
== NULL
)
289 StringCbPrintfExW(conductor
->FileName
, MAX_PATH
, NULL
, NULL
, 0, L
"%ls", szFirstFile
);
290 currentNode
= conductor
;
294 conductor
= conductor
->Prev
;
295 free(conductor
->Next
);
298 // link the last node with the first one to make the list circular
299 conductor
->Next
= root
;
300 root
->Prev
= conductor
;
301 conductor
= currentNode
;
309 pFreeFileList(SHIMGVW_FILENODE
*root
)
311 SHIMGVW_FILENODE
*conductor
;
313 root
->Prev
->Next
= NULL
;
319 root
= conductor
->Next
;
325 ImageView_UpdateWindow(HWND hwnd
)
327 InvalidateRect(hwnd
, NULL
, FALSE
);
332 ImageView_DrawImage(HWND hwnd
)
334 GpGraphics
*graphics
;
335 UINT uImgWidth
, uImgHeight
;
336 UINT height
= 0, width
= 0, x
= 0, y
= 0;
341 hdc
= BeginPaint(hwnd
, &ps
);
344 DPRINT1("BeginPaint() failed\n");
348 GdipCreateFromHDC(hdc
, &graphics
);
351 DPRINT1("GdipCreateFromHDC() failed\n");
355 GdipGetImageWidth(image
, &uImgWidth
);
356 GdipGetImageHeight(image
, &uImgHeight
);
358 if (GetClientRect(hwnd
, &rect
))
360 FillRect(hdc
, &rect
, (HBRUSH
)GetStockObject(WHITE_BRUSH
));
362 if ((rect
.right
>= uImgWidth
)&&(rect
.bottom
>= uImgHeight
))
369 height
= uImgHeight
* (UINT
)rect
.right
/ uImgWidth
;
370 if (height
<= rect
.bottom
)
376 width
= uImgWidth
* (UINT
)rect
.bottom
/ uImgHeight
;
377 height
= rect
.bottom
;
381 y
= (rect
.bottom
/ 2) - (height
/ 2);
382 x
= (rect
.right
/ 2) - (width
/ 2);
384 DPRINT("x = %d\ny = %d\nWidth = %d\nHeight = %d\n\nrect.right = %d\nrect.bottom = %d\n\nuImgWidth = %d\nuImgHeight = %d\n", x
, y
, width
, height
, rect
.right
, rect
.bottom
, uImgWidth
, uImgHeight
);
385 Rectangle(hdc
, x
- 1, y
- 1, x
+ width
+ 1, y
+ height
+ 1);
386 GdipDrawImageRect(graphics
, image
, x
, y
, width
, height
);
388 GdipDeleteGraphics(graphics
);
393 ImageView_LoadSettings()
398 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Software\\ReactOS\\shimgvw"), 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
400 dwSize
= sizeof(SHIMGVW_SETTINGS
);
401 if (RegQueryValueEx(hKey
, _T("Settings"), NULL
, NULL
, (LPBYTE
)&shiSettings
, &dwSize
) == ERROR_SUCCESS
)
414 ImageView_SaveSettings(HWND hwnd
)
419 ShowWindow(hwnd
, SW_HIDE
);
420 wp
.length
= sizeof(WINDOWPLACEMENT
);
421 GetWindowPlacement(hwnd
, &wp
);
423 shiSettings
.Left
= wp
.rcNormalPosition
.left
;
424 shiSettings
.Top
= wp
.rcNormalPosition
.top
;
425 shiSettings
.Right
= wp
.rcNormalPosition
.right
;
426 shiSettings
.Bottom
= wp
.rcNormalPosition
.bottom
;
427 shiSettings
.Maximized
= (IsZoomed(hwnd
) || (wp
.flags
& WPF_RESTORETOMAXIMIZED
));
429 if (RegCreateKeyEx(HKEY_CURRENT_USER
, _T("Software\\ReactOS\\shimgvw"), 0, NULL
,
430 REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
)
432 RegSetValueEx(hKey
, _T("Settings"), 0, REG_BINARY
, (LPBYTE
)&shiSettings
, sizeof(SHIMGVW_SETTINGS
));
438 ImageView_CreateToolBar(HWND hwnd
)
440 INT numButtons
= sizeof(Buttons
) / sizeof(Buttons
[0]);
442 hToolBar
= CreateWindowEx(0, TOOLBARCLASSNAME
, NULL
,
443 WS_CHILD
| WS_VISIBLE
| TBSTYLE_FLAT
| CCS_BOTTOM
| TBSTYLE_TOOLTIPS
,
448 HIMAGELIST hImageList
;
450 SendMessage(hToolBar
, TB_SETEXTENDEDSTYLE
,
451 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS
);
453 SendMessage(hToolBar
, TB_BUTTONSTRUCTSIZE
,
454 sizeof(Buttons
[0]), 0);
456 hImageList
= ImageList_Create(TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, ILC_MASK
| ILC_COLOR24
, 1, 1);
458 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_PREVICON
), IMAGE_BITMAP
,
459 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
461 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_NEXTICON
), IMAGE_BITMAP
,
462 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
464 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_ZOOMPICON
), IMAGE_BITMAP
,
465 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
467 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_ZOOMMICON
), IMAGE_BITMAP
,
468 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
470 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_SAVEICON
), IMAGE_BITMAP
,
471 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
473 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_PRINTICON
), IMAGE_BITMAP
,
474 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
476 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_ROT1ICON
), IMAGE_BITMAP
,
477 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
479 ImageList_AddMasked(hImageList
, LoadImage(hInstance
, MAKEINTRESOURCE(IDB_ROT2ICON
), IMAGE_BITMAP
,
480 TB_IMAGE_WIDTH
, TB_IMAGE_HEIGHT
, LR_DEFAULTCOLOR
), RGB(255, 255, 255));
482 if (hImageList
== NULL
) return FALSE
;
484 ImageList_Destroy((HIMAGELIST
)SendMessage(hToolBar
, TB_SETIMAGELIST
,
485 0, (LPARAM
)hImageList
));
487 SendMessage(hToolBar
, TB_ADDBUTTONS
,
488 numButtons
, (LPARAM
)Buttons
);
497 ImageView_DispWndProc(HWND hwnd
, UINT Message
, WPARAM wParam
, LPARAM lParam
)
503 ImageView_DrawImage(hwnd
);
507 return CallWindowProc(PrevProc
, hwnd
, Message
, wParam
, lParam
);
511 ImageView_InitControls(HWND hwnd
)
513 MoveWindow(hwnd
, shiSettings
.Left
, shiSettings
.Top
,
514 shiSettings
.Right
- shiSettings
.Left
,
515 shiSettings
.Bottom
- shiSettings
.Top
, TRUE
);
517 if (shiSettings
.Maximized
) ShowWindow(hwnd
, SW_MAXIMIZE
);
519 hDispWnd
= CreateWindowEx(0, _T("STATIC"), _T(""),
520 WS_CHILD
| WS_VISIBLE
,
521 0, 0, 0, 0, hwnd
, NULL
, hInstance
, NULL
);
523 SetClassLongPtr(hDispWnd
, GCL_STYLE
, CS_HREDRAW
| CS_VREDRAW
);
524 PrevProc
= (WNDPROC
) SetWindowLongPtr(hDispWnd
, GWL_WNDPROC
, (LPARAM
) ImageView_DispWndProc
);
526 ImageView_CreateToolBar(hwnd
);
530 ImageView_WndProc(HWND hwnd
, UINT Message
, WPARAM wParam
, LPARAM lParam
)
536 ImageView_InitControls(hwnd
);
545 currentFile
= currentFile
->Prev
;
546 pLoadImageFromNode(currentFile
, hwnd
);
552 currentFile
= currentFile
->Next
;
553 pLoadImageFromNode(currentFile
, hwnd
);
572 GdipImageRotateFlip(image
, Rotate270FlipNone
);
573 ImageView_UpdateWindow(hwnd
);
579 GdipImageRotateFlip(image
, Rotate90FlipNone
);
580 ImageView_UpdateWindow(hwnd
);
590 LPNMHDR pnmhdr
= (LPNMHDR
)lParam
;
592 switch (pnmhdr
->code
)
594 case TTN_GETDISPINFO
:
599 lpttt
= (LPTOOLTIPTEXT
)lParam
;
600 idButton
= (UINT
)lpttt
->hdr
.idFrom
;
601 lpttt
->hinst
= hInstance
;
606 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_PREV_PIC
);
609 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_NEXT_PIC
);
612 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_ZOOM_IN
);
615 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_ZOOM_OUT
);
618 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_SAVEAS
);
621 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_PRINT
);
624 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_ROT_COUNCW
);
627 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_ROT_CLOCKW
);
637 LPRECT pRect
= (LPRECT
)lParam
;
638 if (pRect
->right
-pRect
->left
< 350)
639 pRect
->right
= pRect
->left
+ 350;
641 if (pRect
->bottom
-pRect
->top
< 290)
642 pRect
->bottom
= pRect
->top
+ 290;
648 SendMessage(hToolBar
, TB_AUTOSIZE
, 0, 0);
649 GetWindowRect(hToolBar
, &rc
);
650 MoveWindow(hDispWnd
, 1, 1, LOWORD(lParam
) - 1, HIWORD(lParam
) - (rc
.bottom
- rc
.top
) - 1, TRUE
);
655 ImageView_SaveSettings(hwnd
);
656 SetWindowLongPtr(hDispWnd
, GWL_WNDPROC
, (LPARAM
) PrevProc
);
662 return DefWindowProc(hwnd
, Message
, wParam
, lParam
);
666 ImageView_CreateWindow(HWND hwnd
, LPWSTR szFileName
)
668 struct GdiplusStartupInput gdiplusStartupInput
;
669 ULONG_PTR gdiplusToken
;
670 WNDCLASS WndClass
= {0};
672 WCHAR szInitialFile
[MAX_PATH
];
676 if (!ImageView_LoadSettings())
678 shiSettings
.Maximized
= FALSE
;
679 shiSettings
.Left
= 0;
681 shiSettings
.Right
= 520;
682 shiSettings
.Bottom
= 400;
686 gdiplusStartupInput
.GdiplusVersion
= 1;
687 gdiplusStartupInput
.DebugEventCallback
= NULL
;
688 gdiplusStartupInput
.SuppressBackgroundThread
= FALSE
;
689 gdiplusStartupInput
.SuppressExternalCodecs
= FALSE
;
691 GdiplusStartup(&gdiplusToken
, &gdiplusStartupInput
, NULL
);
692 pLoadImage(szFileName
);
695 WndClass
.lpszClassName
= _T("shimgvw_window");
696 WndClass
.lpfnWndProc
= ImageView_WndProc
;
697 WndClass
.hInstance
= hInstance
;
698 WndClass
.style
= CS_HREDRAW
| CS_VREDRAW
;
699 WndClass
.hIcon
= LoadIcon(hInstance
, MAKEINTRESOURCE(IDI_APPICON
));
700 WndClass
.hCursor
= LoadCursor(hInstance
, IDC_ARROW
);
701 WndClass
.hbrBackground
= (HBRUSH
)COLOR_WINDOW
;
703 if (!RegisterClass(&WndClass
)) return -1;
705 LoadString(hInstance
, IDS_APPTITLE
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
706 hMainWnd
= CreateWindow(_T("shimgvw_window"), szBuf
,
707 WS_OVERLAPPEDWINDOW
| WS_VISIBLE
| WS_CAPTION
,
708 CW_USEDEFAULT
, CW_USEDEFAULT
,
709 0, 0, NULL
, NULL
, hInstance
, NULL
);
711 // make sure the path has no quotes on it
712 wcscpy(szInitialFile
, szFileName
);
713 PathUnquoteSpacesW(szInitialFile
);
715 currentFile
= pBuildFileList(szInitialFile
);
718 pLoadImageFromNode(currentFile
, hMainWnd
);
722 ShowWindow(hMainWnd
, SW_SHOW
);
723 UpdateWindow(hMainWnd
);
726 while(GetMessage(&msg
,NULL
,0,0))
728 TranslateMessage(&msg
);
729 DispatchMessageW(&msg
);
732 pFreeFileList(currentFile
);
735 GdipDisposeImage(image
);
736 GdiplusShutdown(gdiplusToken
);
741 ImageView_FullscreenW(HWND hwnd
, HINSTANCE hInst
, LPCWSTR path
, int nShow
)
743 ImageView_CreateWindow(hwnd
, (LPWSTR
)path
);
747 ImageView_Fullscreen(HWND hwnd
, HINSTANCE hInst
, LPCWSTR path
, int nShow
)
749 ImageView_CreateWindow(hwnd
, (LPWSTR
)path
);
753 ImageView_FullscreenA(HWND hwnd
, HINSTANCE hInst
, LPCSTR path
, int nShow
)
755 WCHAR szFile
[MAX_PATH
];
757 if (MultiByteToWideChar(CP_ACP
, 0, (char*)path
, strlen((char*)path
)+1, szFile
, MAX_PATH
))
759 ImageView_CreateWindow(hwnd
, (LPWSTR
)szFile
);
764 ImageView_PrintTo(HWND hwnd
, HINSTANCE hInst
, LPCWSTR path
, int nShow
)
766 DPRINT("ImageView_PrintTo() not implemented\n");
770 ImageView_PrintToA(HWND hwnd
, HINSTANCE hInst
, LPCSTR path
, int nShow
)
772 DPRINT("ImageView_PrintToA() not implemented\n");
776 ImageView_PrintToW(HWND hwnd
, HINSTANCE hInst
, LPCWSTR path
, int nShow
)
778 DPRINT("ImageView_PrintToW() not implemented\n");
782 DllMain(IN HINSTANCE hinstDLL
,
784 IN LPVOID lpvReserved
)
788 case DLL_PROCESS_ATTACH
:
789 case DLL_THREAD_ATTACH
:
790 hInstance
= hinstDLL
;