[SHIMGVW] Consider failure case of loading file (#2606)

If loading an image file failed, then properly handle it. The command line is rundll32 shimgvw.dll,ImageView_Fullscreen .
CORE-16911
This commit is contained in:
Katayama Hirofumi MZ 2020-04-20 21:05:14 +09:00 committed by GitHub
parent d8e47d61d4
commit 3926e9b3c8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 118 additions and 40 deletions

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Прегледът за снимки и факсове на РеактОС"
IDS_SETASDESKBG "Слагане като подкраска"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Преглед"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Следващо изображение"

View file

@ -9,6 +9,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS prohlížeč obrázků a faxů"
IDS_SETASDESKBG "Nastavit jako pozadí plochy"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Náhled"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Další obrázek"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS-Bild- und Faxansicht"
IDS_SETASDESKBG "Als Desktophintergrund setzen"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Vorschau"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Nächstes Bild"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS Picture and Fax Viewer"
IDS_SETASDESKBG "Set as Desktop Background"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Preview"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Next Picture"

View file

@ -6,6 +6,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Visor de imágenes y fax de ReactOS"
IDS_SETASDESKBG "Establecer como fondo de escritorio"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Vista previa"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Siguiente imagen"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Visionneuse d'Images et Fax de ReactOS"
IDS_SETASDESKBG "Définir comme Arrière-plan du Bureau"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Aperçu"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Image Suivante"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "מציג התמונות והפקסים של ReactOS"
IDS_SETASDESKBG "קבע כרקע שולחן עבודה"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "תצוגה מקדימה"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "התמונה הבאה"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Visualizzatore immagini e fax di ReactOS"
IDS_SETASDESKBG "Imposta come sfondo del desktop"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Anteprima"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Immagine successiva"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS画像とFAXビュアー"
IDS_SETASDESKBG "デスクトップの背景に設定する"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "プレビュー"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "次の画像"

View file

@ -6,6 +6,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS paveikslėlių ir faksogramų peržiūros programa"
IDS_SETASDESKBG "Nustatyti kaip darbalaukio foną"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Preview"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Tolesnis paveikslėlis"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS bilde og Faks Viser"
IDS_SETASDESKBG "Sett som skrivebord bakgrunn"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Skriv ut"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Neste bilde"

View file

@ -9,6 +9,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Przeglądarka obrazów i faksów ReactOS"
IDS_SETASDESKBG "Ustaw jako tło pulpitu"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Podgląd"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Następny obraz"

View file

@ -9,6 +9,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Visualizador de imagens e faxes do ReactOS"
IDS_SETASDESKBG "Definir como plano de fundo da área de trabalho"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Pre-visualizar"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Próxima imagem"

View file

@ -11,6 +11,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Vizualizare fax și imagini"
IDS_SETASDESKBG "Plasează ca decor de fundal"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Previzionare"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Imaginea următare"

View file

@ -4,6 +4,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Программа просмотра изображений и факсов"
IDS_SETASDESKBG "Установить как фон рабочего стола"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Предпросмотр"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Следующее изображение"

View file

@ -8,6 +8,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Zobrazovač obrázkov a faxov systému ReactOS"
IDS_SETASDESKBG "Nastaviť ako pozadie pracovnej plochy"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Preview" // Náhľad, Ukážka, Prezrieť ???
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Nasledujúci obrázok"

View file

@ -8,6 +8,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS Vëzhguesi i Fotove dhe Faxit"
IDS_SETASDESKBG "Vendos si Sfond Desktopi"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Shikim Paraprak"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Fotoja Tjetër"

View file

@ -6,6 +6,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS Resim ve Belgegeçer Görüntüleyicisi"
IDS_SETASDESKBG "Masaüstü Arka Planı Olarak Ayarla"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Ön İzleme"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Sonraki Resim"

View file

@ -12,6 +12,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "Програма перегляду зображень і факсів ReactOS"
IDS_SETASDESKBG "Встановити як фон робочого столу"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "Перегляд"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "Наступне зображення"

View file

@ -7,6 +7,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS 图片和传真查看器"
IDS_SETASDESKBG "设置为桌面背景"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "预览"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "下一张图片"

View file

@ -6,6 +6,7 @@ STRINGTABLE
BEGIN
IDS_APPTITLE "ReactOS 圖片和傳真檢視器"
IDS_SETASDESKBG "設定為桌面背景"
IDS_NOPREVIEW "No preview available."
IDS_PREVIEW "預覽"
/* Tooltips */
IDS_TOOLTIP_NEXT_PIC "下一張圖片"

View file

@ -38,6 +38,7 @@
/* Strings */
#define IDS_APPTITLE 100
#define IDS_SETASDESKBG 101
#define IDS_NOPREVIEW 102
#define IDS_PREVIEW 550
/* Friendly File Type Names */

View file

@ -37,7 +37,7 @@
HINSTANCE hInstance;
SHIMGVW_SETTINGS shiSettings;
SHIMGVW_FILENODE *currentFile;
GpImage *image;
GpImage *image = NULL;
WNDPROC PrevProc = NULL;
HWND hDispWnd, hToolBar;
@ -186,6 +186,9 @@ static void ZoomInOrOut(BOOL bZoomIn)
{
INT i;
if (image == NULL)
return;
if (bZoomIn) /* zoom in */
{
/* find next step */
@ -237,6 +240,9 @@ static void ResetZoom(void)
RECT Rect;
UINT ImageWidth, ImageHeight;
if (image == NULL)
return;
/* get disp window size and image size */
GetClientRect(hDispWnd, &Rect);
GdipGetImageWidth(image, &ImageWidth);
@ -329,6 +335,9 @@ static void pSaveImageAs(HWND hwnd)
UINT j;
WCHAR *c;
if (image == NULL)
return;
GdipGetImageEncodersSize(&num, &size);
codecInfo = malloc(size);
if (!codecInfo)
@ -421,32 +430,54 @@ static void pSaveImageAs(HWND hwnd)
free(codecInfo);
}
static VOID
pPrintImage(HWND hwnd)
{
/* FIXME */
}
static VOID
EnableToolBarButtons(BOOL bEnable)
{
SendMessage(hToolBar, TB_ENABLEBUTTON, IDC_SAVE, bEnable);
SendMessage(hToolBar, TB_ENABLEBUTTON, IDC_PRINT, bEnable);
}
static VOID
pLoadImageFromNode(SHIMGVW_FILENODE *node, HWND hwnd)
{
WCHAR szTitleBuf[800];
WCHAR szResStr[512];
WCHAR *c;
if (node)
{
c = wcsrchr(node->FileName, '\\');
if (c)
{
c++;
}
LoadStringW(hInstance, IDS_APPTITLE, szResStr, ARRAYSIZE(szResStr));
StringCbPrintfW(szTitleBuf, sizeof(szTitleBuf), L"%ls%ls%ls", szResStr, L" - ", c);
SetWindowTextW(hwnd, szTitleBuf);
LPWSTR pchFileTitle;
if (image)
{
GdipDisposeImage(image);
image = NULL;
}
if (node == NULL)
{
EnableToolBarButtons(FALSE);
return;
}
pLoadImage(node->FileName);
LoadStringW(hInstance, IDS_APPTITLE, szResStr, ARRAYSIZE(szResStr));
if (image != NULL)
{
pchFileTitle = PathFindFileNameW(node->FileName);
StringCbPrintfW(szTitleBuf, sizeof(szTitleBuf),
L"%ls%ls%ls", szResStr, L" - ", pchFileTitle);
SetWindowTextW(hwnd, szTitleBuf);
}
else
{
SetWindowTextW(hwnd, szResStr);
}
EnableToolBarButtons(image != NULL);
}
static SHIMGVW_FILENODE*
@ -617,6 +648,8 @@ ImageView_DrawImage(HWND hwnd)
HBRUSH white;
HGDIOBJ hbrOld;
UINT uFlags;
WCHAR szText[128];
HGDIOBJ hFontOld;
hdc = BeginPaint(hwnd, &ps);
if (!hdc)
@ -632,18 +665,34 @@ ImageView_DrawImage(HWND hwnd)
return;
}
GetClientRect(hwnd, &rect);
white = GetStockObject(WHITE_BRUSH);
if (image == NULL)
{
FillRect(hdc, &rect, white);
LoadStringW(hInstance, IDS_NOPREVIEW, szText, ARRAYSIZE(szText));
SetTextColor(hdc, RGB(0, 0, 0));
SetBkMode(hdc, TRANSPARENT);
hFontOld = SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
DrawTextW(hdc, szText, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER |
DT_NOPREFIX);
SelectObject(hdc, hFontOld);
}
else
{
GdipGetImageWidth(image, &ImageWidth);
GdipGetImageHeight(image, &ImageHeight);
if (GetClientRect(hwnd, &rect))
{
ZoomedWidth = (ImageWidth * ZoomPercents) / 100;
ZoomedHeight = (ImageHeight * ZoomPercents) / 100;
x = (rect.right - ZoomedWidth) / 2;
y = (rect.bottom - ZoomedHeight) / 2;
white = GetStockObject(WHITE_BRUSH);
// Fill top part
margin = rect;
margin.bottom = y - 1;
@ -903,48 +952,52 @@ ImageView_WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
currentFile = currentFile->Prev;
pLoadImageFromNode(currentFile, hwnd);
}
break;
case IDC_NEXT:
{
currentFile = currentFile->Next;
pLoadImageFromNode(currentFile, hwnd);
}
break;
break;
case IDC_ZOOMP:
{
ZoomInOrOut(TRUE);
}
break;
case IDC_ZOOMM:
{
ZoomInOrOut(FALSE);
}
break;
case IDC_SAVE:
pSaveImageAs(hwnd);
break;
case IDC_PRINT:
pPrintImage(hwnd);
break;
case IDC_ROT1:
{
if (image)
{
GdipImageRotateFlip(image, Rotate270FlipNone);
ImageView_UpdateWindow(hwnd);
}
break;
}
case IDC_ROT2:
{
if (image)
{
GdipImageRotateFlip(image, Rotate90FlipNone);
ImageView_UpdateWindow(hwnd);
}
break;
}
}
}
break;
case WM_MOUSEWHEEL:
@ -1106,7 +1159,10 @@ ImageView_CreateWindow(HWND hwnd, LPWSTR szFileName)
pFreeFileList(currentFile);
if (image)
{
GdipDisposeImage(image);
image = NULL;
}
Anime_FreeInfo();