From 3926e9b3c884e00328ca38285d5047be5dc4b343 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 20 Apr 2020 21:05:14 +0900 Subject: [PATCH] [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 --- dll/win32/shimgvw/lang/bg-BG.rc | 1 + dll/win32/shimgvw/lang/cs-CZ.rc | 1 + dll/win32/shimgvw/lang/de-DE.rc | 1 + dll/win32/shimgvw/lang/en-US.rc | 1 + dll/win32/shimgvw/lang/es-ES.rc | 1 + dll/win32/shimgvw/lang/fr-FR.rc | 1 + dll/win32/shimgvw/lang/he-IL.rc | 1 + dll/win32/shimgvw/lang/it-IT.rc | 1 + dll/win32/shimgvw/lang/ja-JP.rc | 1 + dll/win32/shimgvw/lang/lt-LT.rc | 1 + dll/win32/shimgvw/lang/no-NO.rc | 1 + dll/win32/shimgvw/lang/pl-PL.rc | 1 + dll/win32/shimgvw/lang/pt-PT.rc | 1 + dll/win32/shimgvw/lang/ro-RO.rc | 1 + dll/win32/shimgvw/lang/ru-RU.rc | 1 + dll/win32/shimgvw/lang/sk-SK.rc | 1 + dll/win32/shimgvw/lang/sq-AL.rc | 1 + dll/win32/shimgvw/lang/tr-TR.rc | 1 + dll/win32/shimgvw/lang/uk-UA.rc | 1 + dll/win32/shimgvw/lang/zh-CN.rc | 1 + dll/win32/shimgvw/lang/zh-TW.rc | 1 + dll/win32/shimgvw/resource.h | 1 + dll/win32/shimgvw/shimgvw.c | 136 ++++++++++++++++++++++---------- 23 files changed, 118 insertions(+), 40 deletions(-) diff --git a/dll/win32/shimgvw/lang/bg-BG.rc b/dll/win32/shimgvw/lang/bg-BG.rc index f0e819325bb..91e1f3c8c84 100644 --- a/dll/win32/shimgvw/lang/bg-BG.rc +++ b/dll/win32/shimgvw/lang/bg-BG.rc @@ -4,6 +4,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "Прегледът за снимки и факсове на РеактОС" IDS_SETASDESKBG "Слагане като подкраска" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "Преглед" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Следващо изображение" diff --git a/dll/win32/shimgvw/lang/cs-CZ.rc b/dll/win32/shimgvw/lang/cs-CZ.rc index 4163698a7b6..f9355e39ba9 100644 --- a/dll/win32/shimgvw/lang/cs-CZ.rc +++ b/dll/win32/shimgvw/lang/cs-CZ.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/de-DE.rc b/dll/win32/shimgvw/lang/de-DE.rc index e199106ac47..ed9b19c6701 100644 --- a/dll/win32/shimgvw/lang/de-DE.rc +++ b/dll/win32/shimgvw/lang/de-DE.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/en-US.rc b/dll/win32/shimgvw/lang/en-US.rc index 6b7342bad1f..c212b2e7d00 100644 --- a/dll/win32/shimgvw/lang/en-US.rc +++ b/dll/win32/shimgvw/lang/en-US.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/es-ES.rc b/dll/win32/shimgvw/lang/es-ES.rc index 54cc7ed890d..4fd16a4a595 100644 --- a/dll/win32/shimgvw/lang/es-ES.rc +++ b/dll/win32/shimgvw/lang/es-ES.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/fr-FR.rc b/dll/win32/shimgvw/lang/fr-FR.rc index e020c1ea319..6c7862600b1 100644 --- a/dll/win32/shimgvw/lang/fr-FR.rc +++ b/dll/win32/shimgvw/lang/fr-FR.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/he-IL.rc b/dll/win32/shimgvw/lang/he-IL.rc index dbec4c39c2a..c90d0e79dd1 100644 --- a/dll/win32/shimgvw/lang/he-IL.rc +++ b/dll/win32/shimgvw/lang/he-IL.rc @@ -4,6 +4,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "מציג התמונות והפקסים של ReactOS" IDS_SETASDESKBG "קבע כרקע שולחן עבודה" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "תצוגה מקדימה" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "התמונה הבאה" diff --git a/dll/win32/shimgvw/lang/it-IT.rc b/dll/win32/shimgvw/lang/it-IT.rc index 82655f83807..f629ad69acc 100644 --- a/dll/win32/shimgvw/lang/it-IT.rc +++ b/dll/win32/shimgvw/lang/it-IT.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/ja-JP.rc b/dll/win32/shimgvw/lang/ja-JP.rc index 28a75e0f099..2a7e13fe837 100644 --- a/dll/win32/shimgvw/lang/ja-JP.rc +++ b/dll/win32/shimgvw/lang/ja-JP.rc @@ -4,6 +4,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "ReactOS画像とFAXビュアー" IDS_SETASDESKBG "デスクトップの背景に設定する" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "プレビュー" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "次の画像" diff --git a/dll/win32/shimgvw/lang/lt-LT.rc b/dll/win32/shimgvw/lang/lt-LT.rc index 1ed29815677..631f493ae39 100644 --- a/dll/win32/shimgvw/lang/lt-LT.rc +++ b/dll/win32/shimgvw/lang/lt-LT.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/no-NO.rc b/dll/win32/shimgvw/lang/no-NO.rc index 4012786682c..f25300df06a 100644 --- a/dll/win32/shimgvw/lang/no-NO.rc +++ b/dll/win32/shimgvw/lang/no-NO.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/pl-PL.rc b/dll/win32/shimgvw/lang/pl-PL.rc index 8fdfaea4581..2bb921f4fae 100644 --- a/dll/win32/shimgvw/lang/pl-PL.rc +++ b/dll/win32/shimgvw/lang/pl-PL.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/pt-PT.rc b/dll/win32/shimgvw/lang/pt-PT.rc index c6fa85a3ff6..ba02254631f 100644 --- a/dll/win32/shimgvw/lang/pt-PT.rc +++ b/dll/win32/shimgvw/lang/pt-PT.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/ro-RO.rc b/dll/win32/shimgvw/lang/ro-RO.rc index 81ff1466829..1dee13cca8c 100644 --- a/dll/win32/shimgvw/lang/ro-RO.rc +++ b/dll/win32/shimgvw/lang/ro-RO.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/ru-RU.rc b/dll/win32/shimgvw/lang/ru-RU.rc index beab59399f8..2ae247055f5 100644 --- a/dll/win32/shimgvw/lang/ru-RU.rc +++ b/dll/win32/shimgvw/lang/ru-RU.rc @@ -4,6 +4,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "Программа просмотра изображений и факсов" IDS_SETASDESKBG "Установить как фон рабочего стола" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "Предпросмотр" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Следующее изображение" diff --git a/dll/win32/shimgvw/lang/sk-SK.rc b/dll/win32/shimgvw/lang/sk-SK.rc index d5ae689c2b7..3216f9142ca 100644 --- a/dll/win32/shimgvw/lang/sk-SK.rc +++ b/dll/win32/shimgvw/lang/sk-SK.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/sq-AL.rc b/dll/win32/shimgvw/lang/sq-AL.rc index 6df55634315..79854867665 100644 --- a/dll/win32/shimgvw/lang/sq-AL.rc +++ b/dll/win32/shimgvw/lang/sq-AL.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/tr-TR.rc b/dll/win32/shimgvw/lang/tr-TR.rc index 40dbcb53fc0..13f5db98659 100644 --- a/dll/win32/shimgvw/lang/tr-TR.rc +++ b/dll/win32/shimgvw/lang/tr-TR.rc @@ -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" diff --git a/dll/win32/shimgvw/lang/uk-UA.rc b/dll/win32/shimgvw/lang/uk-UA.rc index ee64a5fddfe..9202a26843f 100644 --- a/dll/win32/shimgvw/lang/uk-UA.rc +++ b/dll/win32/shimgvw/lang/uk-UA.rc @@ -12,6 +12,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "Програма перегляду зображень і факсів ReactOS" IDS_SETASDESKBG "Встановити як фон робочого столу" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "Перегляд" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Наступне зображення" diff --git a/dll/win32/shimgvw/lang/zh-CN.rc b/dll/win32/shimgvw/lang/zh-CN.rc index 0ba55768aa5..40cc06efc68 100644 --- a/dll/win32/shimgvw/lang/zh-CN.rc +++ b/dll/win32/shimgvw/lang/zh-CN.rc @@ -7,6 +7,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "ReactOS 图片和传真查看器" IDS_SETASDESKBG "设置为桌面背景" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "预览" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "下一张图片" diff --git a/dll/win32/shimgvw/lang/zh-TW.rc b/dll/win32/shimgvw/lang/zh-TW.rc index 44345ea6fce..1aee3fdc2fb 100644 --- a/dll/win32/shimgvw/lang/zh-TW.rc +++ b/dll/win32/shimgvw/lang/zh-TW.rc @@ -6,6 +6,7 @@ STRINGTABLE BEGIN IDS_APPTITLE "ReactOS 圖片和傳真檢視器" IDS_SETASDESKBG "設定為桌面背景" + IDS_NOPREVIEW "No preview available." IDS_PREVIEW "預覽" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "下一張圖片" diff --git a/dll/win32/shimgvw/resource.h b/dll/win32/shimgvw/resource.h index 8026b10e203..b54f96e98f8 100644 --- a/dll/win32/shimgvw/resource.h +++ b/dll/win32/shimgvw/resource.h @@ -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 */ diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c index de8dc0e0238..9215eae87bb 100644 --- a/dll/win32/shimgvw/shimgvw.c +++ b/dll/win32/shimgvw/shimgvw.c @@ -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; + LPWSTR pchFileTitle; - if (node) + if (image) { - 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); - - if (image) - { - GdipDisposeImage(image); - } - - pLoadImage(node->FileName); + 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; } - GdipGetImageWidth(image, &ImageWidth); - GdipGetImageHeight(image, &ImageHeight); + GetClientRect(hwnd, &rect); + white = GetStockObject(WHITE_BRUSH); - if (GetClientRect(hwnd, &rect)) + 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); + 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,46 +952,50 @@ 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; + break; + case IDC_ZOOMM: - { ZoomInOrOut(FALSE); - } - break; + break; + case IDC_SAVE: pSaveImageAs(hwnd); + break; - break; case IDC_PRINT: + pPrintImage(hwnd); + break; - break; case IDC_ROT1: { - GdipImageRotateFlip(image, Rotate270FlipNone); - ImageView_UpdateWindow(hwnd); + if (image) + { + GdipImageRotateFlip(image, Rotate270FlipNone); + ImageView_UpdateWindow(hwnd); + } + break; } - break; case IDC_ROT2: { - GdipImageRotateFlip(image, Rotate90FlipNone); - ImageView_UpdateWindow(hwnd); + if (image) + { + GdipImageRotateFlip(image, Rotate90FlipNone); + ImageView_UpdateWindow(hwnd); + } + break; } - - break; } } break; @@ -1106,7 +1159,10 @@ ImageView_CreateWindow(HWND hwnd, LPWSTR szFileName) pFreeFileList(currentFile); if (image) + { GdipDisposeImage(image); + image = NULL; + } Anime_FreeInfo();