https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d7ece626cbda18c8d76b93a3d0f5dfa049646a35
commit d7ece626cbda18c8d76b93a3d0f5dfa049646a35 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Sat Nov 4 05:56:10 2023 +0900 Commit: GitHub <nore...@github.com> CommitDate: Sat Nov 4 05:56:10 2023 +0900 [MSPAINT] Fix Copy-To-File feature (#5877) The Copy-To-File feature had some bugs that the user couldn't save. - Modify SelectionModel::GetSelectionContents. - Delete SelectionModel::CopyBitmap, SelectionModel::LockBitmap, and SelectionModel::UnlockBitmap functions. CORE-19186 --- base/applications/mspaint/dialogs.cpp | 6 ++--- base/applications/mspaint/main.cpp | 15 ++++++----- base/applications/mspaint/precomp.h | 1 + base/applications/mspaint/registry.cpp | 6 ++--- base/applications/mspaint/selectionmodel.cpp | 35 +++++++----------------- base/applications/mspaint/selectionmodel.h | 5 +--- base/applications/mspaint/textedit.cpp | 2 +- base/applications/mspaint/winproc.cpp | 40 +++++++++++++++++----------- 8 files changed, 51 insertions(+), 59 deletions(-) diff --git a/base/applications/mspaint/dialogs.cpp b/base/applications/mspaint/dialogs.cpp index faaf5d3fbfa..c56eaaf5f49 100644 --- a/base/applications/mspaint/dialogs.cpp +++ b/base/applications/mspaint/dialogs.cpp @@ -361,10 +361,10 @@ void CFontsDialog::InitFontSizes() HWND hwndSizes = GetDlgItem(IDD_FONTSSIZES); ComboBox_ResetContent(hwndSizes); - TCHAR szText[16]; + WCHAR szText[16]; for (UINT i = 0; i < _countof(s_sizes); ++i) { - wsprintf(szText, TEXT("%d"), s_sizes[i]); + StringCchPrintfW(szText, _countof(szText), L"%d", s_sizes[i]); INT iItem = ComboBox_AddString(hwndSizes, szText); if (s_sizes[i] == (INT)registrySettings.PointSize) ComboBox_SetCurSel(hwndSizes, iItem); @@ -372,7 +372,7 @@ void CFontsDialog::InitFontSizes() if (ComboBox_GetCurSel(hwndSizes) == CB_ERR) { - wsprintf(szText, TEXT("%d"), (INT)registrySettings.PointSize); + StringCchPrintfW(szText, _countof(szText), L"%d", (INT)registrySettings.PointSize); ::SetWindowText(hwndSizes, szText); } } diff --git a/base/applications/mspaint/main.cpp b/base/applications/mspaint/main.cpp index 63db53f02de..0f133cbe485 100644 --- a/base/applications/mspaint/main.cpp +++ b/base/applications/mspaint/main.cpp @@ -7,6 +7,7 @@ #include "precomp.h" +#include <dlgs.h> #include <mapi.h> POINT g_ptStart, g_ptEnd; @@ -55,7 +56,7 @@ FileExtFromFilter(LPTSTR pExt, OPENFILENAME *pOFN) CharLower(pExt); return TRUE; } - pch += lstrlen(pch) + 1; + pch += wcslen(pch) + 1; } return FALSE; } @@ -66,6 +67,7 @@ OFNHookProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hParent; OFNOTIFY *pon; + WCHAR Path[MAX_PATH]; switch (uMsg) { case WM_NOTIFY: @@ -73,11 +75,10 @@ OFNHookProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (pon->hdr.code == CDN_TYPECHANGE) { hParent = GetParent(hwnd); - TCHAR Path[MAX_PATH]; - SendMessage(hParent, CDM_GETFILEPATH, _countof(Path), (LPARAM)Path); - FileExtFromFilter(PathFindExtension(Path), pon->lpOFN); - SendMessage(hParent, CDM_SETCONTROLTEXT, 0x047c, (LPARAM)PathFindFileName(Path)); - lstrcpyn(pon->lpOFN->lpstrFile, Path, pon->lpOFN->nMaxFile); + SendMessageW(hParent, CDM_GETFILEPATH, _countof(Path), (LPARAM)Path); + FileExtFromFilter(PathFindExtensionW(Path), pon->lpOFN); + SendMessageW(hParent, CDM_SETCONTROLTEXT, cmb13, (LPARAM)PathFindFileNameW(Path)); + StringCchCopyW(pon->lpOFN->lpstrFile, pon->lpOFN->nMaxFile, Path); } break; } @@ -251,7 +252,7 @@ BOOL CMainWindow::GetSaveFileName(IN OUT LPTSTR pszFile, INT cchMaxFile) if (*pchDotExt == UNICODE_NULL) { // Choose PNG - wcscat(pszFile, L".png"); + StringCchCatW(pszFile, cchMaxFile, L".png"); for (INT i = 0; i < aguidFileTypesE.GetSize(); ++i) { if (aguidFileTypesE[i] == Gdiplus::ImageFormatPNG) diff --git a/base/applications/mspaint/precomp.h b/base/applications/mspaint/precomp.h index a24f1a3b654..6f22eb69e8d 100644 --- a/base/applications/mspaint/precomp.h +++ b/base/applications/mspaint/precomp.h @@ -25,6 +25,7 @@ #include <math.h> #include <shellapi.h> #include <htmlhelp.h> +#include <strsafe.h> #include "atlimagedx.h" #include <debug.h> diff --git a/base/applications/mspaint/registry.cpp b/base/applications/mspaint/registry.cpp index bdaf7a7cd17..07778117ae8 100644 --- a/base/applications/mspaint/registry.cpp +++ b/base/applications/mspaint/registry.cpp @@ -123,7 +123,7 @@ void RegistrySettings::Load(INT nCmdShow) TCHAR szName[64]; for (INT i = 0; i < MAX_RECENT_FILES; ++i) { - wsprintf(szName, _T("File%u"), i + 1); + StringCchPrintfW(szName, _countof(szName), L"File%u", i + 1); ReadString(files, szName, strFiles[i]); } } @@ -204,10 +204,10 @@ void RegistrySettings::Store() CRegKey files; if (files.Create(paint, _T("Recent File List")) == ERROR_SUCCESS) { - TCHAR szName[64]; + WCHAR szName[64]; for (INT iFile = 0; iFile < MAX_RECENT_FILES; ++iFile) { - wsprintf(szName, _T("File%u"), iFile + 1); + StringCchPrintfW(szName, _countof(szName), L"File%u", iFile + 1); files.SetStringValue(szName, strFiles[iFile]); } } diff --git a/base/applications/mspaint/selectionmodel.cpp b/base/applications/mspaint/selectionmodel.cpp index e7263fa4e1f..c66361da6e4 100644 --- a/base/applications/mspaint/selectionmodel.cpp +++ b/base/applications/mspaint/selectionmodel.cpp @@ -152,16 +152,19 @@ void SelectionModel::DrawSelection(HDC hDCImage, COLORREF crBg, BOOL bBgTranspar DeleteDC(hMemDC); } -void SelectionModel::GetSelectionContents(HDC hDCImage) +HBITMAP SelectionModel::GetSelectionContents() { - ClearColorImage(); + if (m_hbmColor) + return CopyDIBImage(m_hbmColor, m_rc.Width(), m_rc.Height()); HDC hMemDC = ::CreateCompatibleDC(NULL); - m_hbmColor = CreateColorDIB(m_rc.Width(), m_rc.Height(), RGB(255, 255, 255)); - HGDIOBJ hbmOld = ::SelectObject(hMemDC, m_hbmColor); - ::BitBlt(hMemDC, 0, 0, m_rc.Width(), m_rc.Height(), hDCImage, m_rc.left, m_rc.top, SRCCOPY); + HBITMAP hBitmap = CreateColorDIB(m_rc.Width(), m_rc.Height(), RGB(255, 255, 255)); + HGDIOBJ hbmOld = ::SelectObject(hMemDC, hBitmap); + ::BitBlt(hMemDC, 0, 0, m_rc.Width(), m_rc.Height(), imageModel.GetDC(), m_rc.left, m_rc.top, SRCCOPY); ::SelectObject(hMemDC, hbmOld); ::DeleteDC(hMemDC); + + return hBitmap; } BOOL SelectionModel::IsLanded() const @@ -178,7 +181,8 @@ BOOL SelectionModel::TakeOff() m_rgbBack = paletteModel.GetBgColor(); // Get the contents of the selection area - GetSelectionContents(imageModel.GetDC()); + ClearColorImage(); + m_hbmColor = GetSelectionContents(); // RectSel doesn't need the mask image if (toolsModel.GetActiveTool() == TOOL_RECTSEL) @@ -406,13 +410,6 @@ void SelectionModel::StretchSkew(int nStretchPercentX, int nStretchPercentY, int NotifyContentChanged(); } -HBITMAP SelectionModel::CopyBitmap() -{ - if (m_hbmColor == NULL) - GetSelectionContents(imageModel.GetDC()); - return CopyDIBImage(m_hbmColor); -} - int SelectionModel::PtStackSize() const { return m_iPtSP; @@ -545,18 +542,6 @@ void SelectionModel::SwapWidthAndHeight() m_rc.bottom = m_rc.top + cx; } -HBITMAP SelectionModel::LockBitmap() -{ - HBITMAP hbm = m_hbmColor; - m_hbmColor = NULL; - return hbm; -} - -void SelectionModel::UnlockBitmap(HBITMAP hbmLocked) -{ - m_hbmColor = hbmLocked; -} - void SelectionModel::StretchSelection(BOOL bShrink) { if (!m_bShow) diff --git a/base/applications/mspaint/selectionmodel.h b/base/applications/mspaint/selectionmodel.h index 308952a6e67..e66b2bff0cc 100644 --- a/base/applications/mspaint/selectionmodel.h +++ b/base/applications/mspaint/selectionmodel.h @@ -40,10 +40,7 @@ public: void HideSelection(); void DeleteSelection(); - HBITMAP CopyBitmap(); - HBITMAP LockBitmap(); - void UnlockBitmap(HBITMAP hbmLocked); - void GetSelectionContents(HDC hDCImage); + HBITMAP GetSelectionContents(); void DrawFramePoly(HDC hDCImage); void DrawBackground(HDC hDCImage); void DrawBackgroundPoly(HDC hDCImage, COLORREF crBg); diff --git a/base/applications/mspaint/textedit.cpp b/base/applications/mspaint/textedit.cpp index 5261da63a0e..c20ca6bf005 100644 --- a/base/applications/mspaint/textedit.cpp +++ b/base/applications/mspaint/textedit.cpp @@ -342,7 +342,7 @@ void CTextEditWindow::UpdateFont() lf.lfWeight = (registrySettings.Bold ? FW_BOLD : FW_NORMAL); lf.lfItalic = (BYTE)registrySettings.Italic; lf.lfUnderline = (BYTE)registrySettings.Underline; - lstrcpyn(lf.lfFaceName, registrySettings.strFontName, _countof(lf.lfFaceName)); + StringCchCopyW(lf.lfFaceName, _countof(lf.lfFaceName), registrySettings.strFontName); HDC hdc = GetDC(); if (hdc) diff --git a/base/applications/mspaint/winproc.cpp b/base/applications/mspaint/winproc.cpp index c1cbff31b8c..3beb34c290d 100644 --- a/base/applications/mspaint/winproc.cpp +++ b/base/applications/mspaint/winproc.cpp @@ -29,7 +29,7 @@ static HWND DoHtmlHelpW(HWND hwndCaller, LPCWSTR pszFile, UINT uCommand, DWORD_P { // The function loads the system library, not local GetSystemDirectoryW(szPath, _countof(szPath)); - wcscat(szPath, L"\\hhctrl.ocx"); + StringCchCatW(szPath, _countof(szPath), L"\\hhctrl.ocx"); s_hHHCTRL_OCX = LoadLibraryW(szPath); if (s_hHHCTRL_OCX) s_pHtmlHelpW = (FN_HtmlHelpW)GetProcAddress(s_hHHCTRL_OCX, "HtmlHelpW"); @@ -382,8 +382,8 @@ void CMainWindow::ProcessFileMenu(HMENU hPopupMenu) assert(_tcslen((LPCTSTR)pathFile) <= MAX_RECENT_PATHNAME_DISPLAY); // Add an accelerator (by '&') to the item number for quick access - TCHAR szText[4 + MAX_RECENT_PATHNAME_DISPLAY + 1]; - wsprintf(szText, _T("&%u %s"), iItem + 1, (LPCTSTR)pathFile); + WCHAR szText[4 + MAX_RECENT_PATHNAME_DISPLAY + 1]; + StringCchPrintfW(szText, _countof(szText), L"&%u %s", iItem + 1, (LPCWSTR)pathFile); INT iMenuItem = (cMenuItems - 2) + iItem; InsertMenu(hPopupMenu, iMenuItem, MF_BYPOSITION | MF_STRING, IDM_FILE1 + iItem, szText); @@ -720,14 +720,13 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH selectionModel.TakeOff(); { - HBITMAP hbmLocked = selectionModel.LockBitmap(); - if (hbmLocked) - { - HGLOBAL hGlobal = BitmapToClipboardDIB(hbmLocked); - if (hGlobal) - ::SetClipboardData(CF_DIB, hGlobal); - selectionModel.UnlockBitmap(hbmLocked); - } + HBITMAP hbmCopy = selectionModel.GetSelectionContents(); + HGLOBAL hGlobal = BitmapToClipboardDIB(hbmCopy); + if (hGlobal) + ::SetClipboardData(CF_DIB, hGlobal); + else + ShowOutOfMemory(); + ::DeleteObject(hbmCopy); } CloseClipboard(); @@ -841,12 +840,18 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH } case IDM_EDITCOPYTO: { - WCHAR szFileName[MAX_LONG_PATH] = L"*.png"; + WCHAR szFileName[MAX_LONG_PATH]; + LoadStringW(g_hinstExe, IDS_DEFAULTFILENAME, szFileName, _countof(szFileName)); if (GetSaveFileName(szFileName, _countof(szFileName))) { - HBITMAP hbmLocked = selectionModel.LockBitmap(); - SaveDIBToFile(hbmLocked, szFileName, FALSE); - selectionModel.UnlockBitmap(hbmLocked); + HBITMAP hbmSelection = selectionModel.GetSelectionContents(); + if (!hbmSelection) + { + ShowOutOfMemory(); + break; + } + SaveDIBToFile(hbmSelection, szFileName, FALSE); + DeleteObject(hbmSelection); } break; } @@ -982,9 +987,12 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH toolsModel.SetBackgroundTransparent(!toolsModel.IsBackgroundTransparent()); break; case IDM_IMAGECROP: - imageModel.PushImageForUndo(selectionModel.CopyBitmap()); + { + HBITMAP hbmCopy = selectionModel.GetSelectionContents(); + imageModel.PushImageForUndo(hbmCopy); selectionModel.HideSelection(); break; + } case IDM_VIEWTOOLBOX: registrySettings.ShowToolBox = !toolBoxContainer.IsWindowVisible(); toolBoxContainer.ShowWindow(registrySettings.ShowToolBox ? SW_SHOWNOACTIVATE : SW_HIDE);