[MSPAINT] Don't show error message twice (#5715)

- Reduce display of error message on IDM_EDITCOPYTO and IDM_EDITPASTEFROM.
- Introduce LockBitmap/UnlockBitmap mechanism for ImageModel and SelectionModel.
CORE-19181, CORE-19182
This commit is contained in:
Katayama Hirofumi MZ 2023-09-22 10:48:13 +09:00 committed by GitHub
parent 98050f9139
commit bbb33a6ed5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 24 deletions

View file

@ -261,27 +261,41 @@ void ImageModel::Clamp(POINT& pt) const
HBITMAP ImageModel::CopyBitmap() HBITMAP ImageModel::CopyBitmap()
{ {
// NOTE: An app cannot select a bitmap into more than one device context at a time. HBITMAP hBitmap = LockBitmap();
::SelectObject(m_hDrawingDC, m_hbmOld); // De-select HBITMAP ret = CopyDIBImage(hBitmap);
HBITMAP ret = CopyDIBImage(m_hBms[m_currInd]); UnlockBitmap(hBitmap);
m_hbmOld = ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]); // Re-select
return ret; return ret;
} }
BOOL ImageModel::IsBlackAndWhite() BOOL ImageModel::IsBlackAndWhite()
{ {
::SelectObject(m_hDrawingDC, m_hbmOld); // De-select HBITMAP hBitmap = LockBitmap();
BOOL bBlackAndWhite = IsBitmapBlackAndWhite(m_hBms[m_currInd]); BOOL bBlackAndWhite = IsBitmapBlackAndWhite(hBitmap);
m_hbmOld = ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]); // Re-select UnlockBitmap(hBitmap);
return bBlackAndWhite; return bBlackAndWhite;
} }
void ImageModel::PushBlackAndWhite() void ImageModel::PushBlackAndWhite()
{ {
::SelectObject(m_hDrawingDC, m_hbmOld); // De-select HBITMAP hBitmap = LockBitmap();
HBITMAP hNewBitmap = ConvertToBlackAndWhite(m_hBms[m_currInd]); HBITMAP hNewBitmap = ConvertToBlackAndWhite(hBitmap);
m_hbmOld = ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]); // Re-select UnlockBitmap(hBitmap);
if (hNewBitmap) if (hNewBitmap)
PushImageForUndo(hNewBitmap); PushImageForUndo(hNewBitmap);
} }
HBITMAP ImageModel::LockBitmap()
{
// NOTE: An app cannot select a bitmap into more than one device context at a time.
::SelectObject(m_hDrawingDC, m_hbmOld); // De-select
HBITMAP hbmLocked = m_hBms[m_currInd];
m_hBms[m_currInd] = NULL;
return hbmLocked;
}
void ImageModel::UnlockBitmap(HBITMAP hbmLocked)
{
m_hBms[m_currInd] = hbmLocked;
m_hbmOld = ::SelectObject(m_hDrawingDC, hbmLocked); // Re-select
}

View file

@ -31,6 +31,8 @@ public:
int GetWidth() const; int GetWidth() const;
int GetHeight() const; int GetHeight() const;
HBITMAP CopyBitmap(); HBITMAP CopyBitmap();
HBITMAP LockBitmap();
void UnlockBitmap(HBITMAP hbmLocked);
void InvertColors(); void InvertColors();
void FlipHorizontally(); void FlipHorizontally();
void FlipVertically(); void FlipVertically();

View file

@ -117,9 +117,9 @@ BOOL OpenMailer(HWND hWnd, LPCWSTR pszPathName)
strFileTitle += L".png"; strFileTitle += L".png";
// Save it to the temporary file // Save it to the temporary file
HBITMAP hbm = imageModel.CopyBitmap(); HBITMAP hbmLocked = imageModel.LockBitmap();
BOOL ret = SaveDIBToFile(hbm, g_szMailTempFile, FALSE, Gdiplus::ImageFormatPNG); BOOL ret = SaveDIBToFile(hbmLocked, g_szMailTempFile, FALSE, Gdiplus::ImageFormatPNG);
::DeleteObject(hbm); imageModel.UnlockBitmap(hbmLocked);
if (!ret) if (!ret)
{ {
g_szMailTempFile[0] = UNICODE_NULL; g_szMailTempFile[0] = UNICODE_NULL;

View file

@ -528,3 +528,15 @@ void SelectionModel::SwapWidthAndHeight()
m_rc.right = m_rc.left + cy; m_rc.right = m_rc.left + cy;
m_rc.bottom = m_rc.top + cx; 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;
}

View file

@ -40,6 +40,8 @@ public:
void DeleteSelection(); void DeleteSelection();
HBITMAP CopyBitmap(); HBITMAP CopyBitmap();
HBITMAP LockBitmap();
void UnlockBitmap(HBITMAP hbmLocked);
void GetSelectionContents(HDC hDCImage); void GetSelectionContents(HDC hDCImage);
void DrawFramePoly(HDC hDCImage); void DrawFramePoly(HDC hDCImage);
void DrawBackground(HDC hDCImage); void DrawBackground(HDC hDCImage);

View file

@ -741,13 +741,13 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
selectionModel.TakeOff(); selectionModel.TakeOff();
{ {
HBITMAP hbm = selectionModel.CopyBitmap(); HBITMAP hbmLocked = selectionModel.LockBitmap();
if (hbm) if (hbmLocked)
{ {
HGLOBAL hGlobal = BitmapToClipboardDIB(hbm); HGLOBAL hGlobal = BitmapToClipboardDIB(hbmLocked);
if (hGlobal) if (hGlobal)
::SetClipboardData(CF_DIB, hGlobal); ::SetClipboardData(CF_DIB, hGlobal);
::DeleteObject(hbm); selectionModel.UnlockBitmap(hbmLocked);
} }
} }
@ -865,10 +865,9 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
WCHAR szFileName[MAX_LONG_PATH] = L"*.png"; WCHAR szFileName[MAX_LONG_PATH] = L"*.png";
if (GetSaveFileName(szFileName, _countof(szFileName))) if (GetSaveFileName(szFileName, _countof(szFileName)))
{ {
HBITMAP hbm = selectionModel.CopyBitmap(); HBITMAP hbmLocked = selectionModel.LockBitmap();
if (!SaveDIBToFile(hbm, szFileName, FALSE)) SaveDIBToFile(hbmLocked, szFileName, FALSE);
ShowError(IDS_SAVEERROR, szFileName); selectionModel.UnlockBitmap(hbmLocked);
::DeleteObject(hbm);
} }
break; break;
} }
@ -880,8 +879,6 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
HBITMAP hbmNew = DoLoadImageFile(m_hWnd, szFileName, FALSE); HBITMAP hbmNew = DoLoadImageFile(m_hWnd, szFileName, FALSE);
if (hbmNew) if (hbmNew)
InsertSelectionFromHBITMAP(hbmNew, m_hWnd); InsertSelectionFromHBITMAP(hbmNew, m_hWnd);
else
ShowError(IDS_LOADERRORTEXT, szFileName);
} }
break; break;
} }
@ -1008,7 +1005,6 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
imageModel.PushImageForUndo(selectionModel.CopyBitmap()); imageModel.PushImageForUndo(selectionModel.CopyBitmap());
selectionModel.HideSelection(); selectionModel.HideSelection();
break; break;
case IDM_VIEWTOOLBOX: case IDM_VIEWTOOLBOX:
registrySettings.ShowToolBox = !toolBoxContainer.IsWindowVisible(); registrySettings.ShowToolBox = !toolBoxContainer.IsWindowVisible();
toolBoxContainer.ShowWindow(registrySettings.ShowToolBox ? SW_SHOWNOACTIVATE : SW_HIDE); toolBoxContainer.ShowWindow(registrySettings.ShowToolBox ? SW_SHOWNOACTIVATE : SW_HIDE);