mirror of
https://github.com/reactos/reactos.git
synced 2024-07-03 03:04:22 +00:00
[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:
parent
98050f9139
commit
bbb33a6ed5
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue