ReactOS 0.4.17-dev-357-ga8f14ff
CCanvasWindow Class Reference

#include <canvas.h>

Inheritance diagram for CCanvasWindow:
Collaboration diagram for CCanvasWindow:

Public Member Functions

 DECLARE_WND_CLASS_EX (L"ReactOSPaintCanvas", CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW, COLOR_APPWORKSPACE) CCanvasWindow()
 
virtual ~CCanvasWindow ()
 
VOID OnEndDraw (BOOL bCancel)
 
VOID updateScrollRange ()
 
VOID updateScrollPos (INT x=0, INT y=0)
 
VOID ImageToCanvas (POINT &pt)
 
VOID ImageToCanvas (RECT &rc)
 
VOID CanvasToImage (POINT &pt)
 
VOID CanvasToImage (RECT &rc)
 
VOID GetImageRect (RECT &rc)
 
VOID getNewZoomRect (CRect &rcView, INT newZoom, CPoint ptTarget)
 
VOID zoomTo (INT newZoom, LONG left=0, LONG top=0)
 

Public Attributes

BOOL m_drawing
 

Protected Member Functions

HITTEST CanvasHitTest (POINT pt)
 
RECT GetBaseRect ()
 
BOOL DoDraw (HDC hDC, RECT &rcClient, RECT &rcPaint)
 
VOID OnHVScroll (WPARAM wParam, INT fnBar)
 
LRESULT OnSize (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnHScroll (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnVScroll (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnEraseBkgnd (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnPaint (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnMouseMove (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnKeyDown (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnSetCursor (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnMouseWheel (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnCancelMode (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnCaptureChanged (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnCtlColorEdit (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnPaletteModelColorChanged (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnButtonDown (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnButtonDblClk (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnButtonUp (UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 

Protected Attributes

HITTEST m_hitCanvasSizeBox
 
CStyledCursor m_hBrushCursor
 
CStyledCursor m_hRubberCursor
 
POINT m_ptOrig
 
CRect m_rcResizing
 
UINT m_nMouseDownMsg = 0
 

Detailed Description

Definition at line 43 of file canvas.h.

Constructor & Destructor Documentation

◆ ~CCanvasWindow()

CCanvasWindow::~CCanvasWindow ( )
virtual

Definition at line 173 of file canvas.cpp.

174{
175}

Member Function Documentation

◆ CanvasHitTest()

HITTEST CCanvasWindow::CanvasHitTest ( POINT  pt)
protected

Definition at line 217 of file canvas.cpp.

218{
220 return HIT_INNER;
221 RECT rcBase = GetBaseRect();
222 return getSizeBoxHitTest(pt, &rcBase);
223}
SelectionModel selectionModel
@ HIT_INNER
Definition: precomp.h:68
CTextEditWindow textEditWindow
Definition: textedit.cpp:12
RECT GetBaseRect()
Definition: canvas.cpp:177
#define pt(x, y)
Definition: drawing.c:79
HITTEST getSizeBoxHitTest(POINT pt, LPCRECT prcBase)
Definition: sizebox.cpp:80
BOOL WINAPI IsWindowVisible(_In_ HWND)

Referenced by OnButtonDown(), and OnSetCursor().

◆ CanvasToImage() [1/2]

VOID CCanvasWindow::CanvasToImage ( POINT pt)

Definition at line 199 of file canvas.cpp.

200{
203 UnZoomed(pt);
204}
#define GRIP_SIZE
Definition: precomp.h:43
static int UnZoomed(int xy)
Definition: toolsmodel.h:156
#define SB_VERT
Definition: winuser.h:553
int WINAPI GetScrollPos(_In_ HWND, _In_ int)
#define SB_HORZ
Definition: winuser.h:552

Referenced by DoDraw(), CTextEditWindow::InvalidateEditRect(), OnButtonDblClk(), OnButtonDown(), OnButtonUp(), OnMouseMove(), and zoomTo().

◆ CanvasToImage() [2/2]

VOID CCanvasWindow::CanvasToImage ( RECT rc)

Definition at line 206 of file canvas.cpp.

207{
209 UnZoomed(rc);
210}
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)

◆ DECLARE_WND_CLASS_EX()

CCanvasWindow::DECLARE_WND_CLASS_EX ( L"ReactOSPaintCanvas"  ,
CS_DBLCLKS|CS_HREDRAW CS_VREDRAW,
COLOR_APPWORKSPACE   
)

◆ DoDraw()

BOOL CCanvasWindow::DoDraw ( HDC  hDC,
RECT rcClient,
RECT rcPaint 
)
protected

Definition at line 268 of file canvas.cpp.

269{
270 // This is the target area we have to draw on
271 CRect rcCanvasDraw;
272 rcCanvasDraw.IntersectRect(&rcClient, &rcPaint);
273
274 // Calculate image size
275 CRect rcImage;
276 GetImageRect(rcImage);
277 SIZE sizeImage = { imageModel.GetWidth(), imageModel.GetHeight() };
278
279 // We use a memory bitmap to reduce flickering
280 HBITMAP hbmCache1 = CreateDIBWithProperties(rcClient.right, rcClient.bottom);
281 if (!hbmCache1)
282 return FALSE; // Out of memory
283 HBITMAP hbmCache2 = CreateDIBWithProperties(sizeImage.cx, sizeImage.cy);
284 if (!hbmCache2)
285 {
286 ::DeleteObject(hbmCache1);
287 return FALSE; // Out of memory
288 }
289
290 HDC hdcMem0 = ::CreateCompatibleDC(hDC);
291 HGDIOBJ hbm0Old = ::SelectObject(hdcMem0, hbmCache1);
292
293 // Fill the background on hdcMem0
294 ::FillRect(hdcMem0, &rcCanvasDraw, (HBRUSH)(COLOR_APPWORKSPACE + 1));
295
296 // Draw the sizeboxes if necessary
297 RECT rcBase = GetBaseRect();
299 drawSizeBoxes(hdcMem0, &rcBase, FALSE, &rcCanvasDraw);
300
301 // Calculate the target area on the image
302 CRect rcImageDraw = rcCanvasDraw;
303 CanvasToImage(rcImageDraw);
304 rcImageDraw.IntersectRect(&rcImageDraw, &rcImage);
305
306 // Consider rounding down by zooming
307 rcImageDraw.right += 1;
308 rcImageDraw.bottom += 1;
309
310 // hdcMem1 <-- imageModel
311 HDC hdcMem1 = ::CreateCompatibleDC(hDC);
312 HGDIOBJ hbm1Old = ::SelectObject(hdcMem1, hbmCache2);
313 ::BitBlt(hdcMem1, rcImageDraw.left, rcImageDraw.top, rcImageDraw.Width(), rcImageDraw.Height(),
314 imageModel.GetDC(), rcImageDraw.left, rcImageDraw.top, SRCCOPY);
315
316 // Draw overlay #1 on hdcMem1
318
319 // Transfer the bits with stretch (hdcMem0 <-- hdcMem1)
320 ImageToCanvas(rcImage);
321 ::StretchBlt(hdcMem0, rcImage.left, rcImage.top, rcImage.Width(), rcImage.Height(),
322 hdcMem1, 0, 0, sizeImage.cx, sizeImage.cy, SRCCOPY);
323
324 // Clean up hdcMem1
325 ::SelectObject(hdcMem1, hbm1Old);
326 ::DeleteDC(hdcMem1);
327
328 // Draw the grid on hdcMem0
329 if (g_showGrid && toolsModel.GetZoom() >= 4000)
330 {
331 HPEN oldPen = (HPEN) ::SelectObject(hdcMem0, ::CreatePen(PS_SOLID, 1, RGB(160, 160, 160)));
332 for (INT counter = 0; counter < sizeImage.cy; counter++)
333 {
334 POINT pt0 = { 0, counter }, pt1 = { sizeImage.cx, counter };
335 ImageToCanvas(pt0);
336 ImageToCanvas(pt1);
337 ::MoveToEx(hdcMem0, pt0.x, pt0.y, NULL);
338 ::LineTo(hdcMem0, pt1.x, pt1.y);
339 }
340 for (INT counter = 0; counter < sizeImage.cx; counter++)
341 {
342 POINT pt0 = { counter, 0 }, pt1 = { counter, sizeImage.cy };
343 ImageToCanvas(pt0);
344 ImageToCanvas(pt1);
345 ::MoveToEx(hdcMem0, pt0.x, pt0.y, NULL);
346 ::LineTo(hdcMem0, pt1.x, pt1.y);
347 }
348 ::DeleteObject(::SelectObject(hdcMem0, oldPen));
349 }
350
351 // Draw overlay #2 on hdcMem0
353
354 // Draw new frame on hdcMem0 if any
356 DrawXorRect(hdcMem0, &m_rcResizing);
357
358 // Transfer the bits (hDC <-- hdcMem0)
359 ::BitBlt(hDC, rcCanvasDraw.left, rcCanvasDraw.top, rcCanvasDraw.Width(), rcCanvasDraw.Height(),
360 hdcMem0, rcCanvasDraw.left, rcCanvasDraw.top, SRCCOPY);
361
362 // Clean up hdcMem0
363 ::SelectObject(hdcMem0, hbm0Old);
364 ::DeleteDC(hdcMem0);
365 ::DeleteObject(hbmCache2);
366 ::DeleteObject(hbmCache1);
367
368 return TRUE;
369}
static HDC hDC
Definition: 3dtext.c:33
BOOL g_showGrid
Definition: main.cpp:22
ToolsModel toolsModel
Definition: toolsmodel.cpp:10
@ HIT_NONE
Definition: precomp.h:58
HITTEST m_hitCanvasSizeBox
Definition: canvas.h:91
VOID ImageToCanvas(POINT &pt)
Definition: canvas.cpp:186
VOID CanvasToImage(POINT &pt)
Definition: canvas.cpp:199
CRect m_rcResizing
Definition: canvas.h:95
VOID GetImageRect(RECT &rc)
Definition: canvas.cpp:212
BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2) noexcept
Definition: atltypes.h:346
int Width() const noexcept
Definition: atltypes.h:461
int Height() const noexcept
Definition: atltypes.h:318
BOOL IsRectEmpty() const noexcept
Definition: atltypes.h:351
int GetWidth() const
Definition: history.cpp:254
int GetHeight() const
Definition: history.cpp:259
HDC GetDC()
Definition: history.cpp:272
void OnDrawOverlayOnCanvas(HDC hdc)
Definition: mouse.cpp:1195
void OnDrawOverlayOnImage(HDC hdc)
Definition: mouse.cpp:1190
int GetZoom() const
Definition: toolsmodel.cpp:270
HBITMAP CreateDIBWithProperties(int width, int height)
Definition: dib.cpp:32
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
void DrawXorRect(HDC hdc, const RECT *prc)
Definition: drawing.cpp:362
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Height *Stride) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Stride)
Definition: common.c:42
#define RGB(r, g, b)
Definition: precomp.h:67
pKey DeleteObject()
ImageModel imageModel
Definition: history.cpp:11
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
VOID drawSizeBoxes(HDC hdc, LPCRECT prcBase, BOOL bDrawFrame, LPCRECT prcPaint)
Definition: sizebox.cpp:103
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
int32_t INT
Definition: typedefs.h:58
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
#define SRCCOPY
Definition: wingdi.h:333
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL WINAPI DeleteDC(_In_ HDC)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define PS_SOLID
Definition: wingdi.h:586
#define COLOR_APPWORKSPACE
Definition: winuser.h:936

Referenced by OnPaint().

◆ GetBaseRect()

RECT CCanvasWindow::GetBaseRect ( )
protected

Definition at line 177 of file canvas.cpp.

178{
179 CRect rcBase;
180 GetImageRect(rcBase);
181 ImageToCanvas(rcBase);
183 return rcBase;
184}
void InflateRect(int x, int y) noexcept
Definition: atltypes.h:323

Referenced by CanvasHitTest(), and DoDraw().

◆ GetImageRect()

VOID CCanvasWindow::GetImageRect ( RECT rc)

◆ getNewZoomRect()

VOID CCanvasWindow::getNewZoomRect ( CRect rcView,
INT  newZoom,
CPoint  ptTarget 
)

Definition at line 225 of file canvas.cpp.

226{
227 CRect rcImage;
228 GetImageRect(rcImage);
229 ImageToCanvas(rcImage);
230
231 // Calculate the zoom rectangle
232 INT oldZoom = toolsModel.GetZoom();
233 GetClientRect(rcView);
234 LONG cxView = rcView.right * oldZoom / newZoom, cyView = rcView.bottom * oldZoom / newZoom;
235 rcView.SetRect(ptTarget.x - cxView / 2, ptTarget.y - cyView / 2,
236 ptTarget.x + cxView / 2, ptTarget.y + cyView / 2);
237
238 // Shift the rectangle if necessary
239 INT dx = 0, dy = 0;
240 if (rcView.left < rcImage.left)
241 dx = rcImage.left - rcView.left;
242 else if (rcImage.right < rcView.right)
243 dx = rcImage.right - rcView.right;
244 if (rcView.top < rcImage.top)
245 dy = rcImage.top - rcView.top;
246 else if (rcImage.bottom < rcView.bottom)
247 dy = rcImage.bottom - rcView.bottom;
248 rcView.OffsetRect(dx, dy);
249
250 rcView.IntersectRect(&rcView, &rcImage);
251}
void OffsetRect(int x, int y) noexcept
Definition: atltypes.h:403
void SetRect(int x1, int y1, int x2, int y2) noexcept
Definition: atltypes.h:423
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
long LONG
Definition: pedump.c:60
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)

Referenced by ZoomTool::getNewZoomRect().

◆ ImageToCanvas() [1/2]

◆ ImageToCanvas() [2/2]

VOID CCanvasWindow::ImageToCanvas ( RECT rc)

Definition at line 193 of file canvas.cpp.

◆ OnButtonDblClk()

LRESULT CCanvasWindow::OnButtonDblClk ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 531 of file canvas.cpp.

532{
535
538 m_nMouseDownMsg = 0;
539
542 Invalidate();
543 return 0;
544}
BOOL m_drawing
Definition: canvas.h:76
UINT m_nMouseDownMsg
Definition: canvas.h:116
void resetTool()
Definition: toolsmodel.cpp:312
void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick)
Definition: mouse.cpp:1156
LPARAM lParam
Definition: combotst.c:139
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1806

◆ OnButtonDown()

LRESULT CCanvasWindow::OnButtonDown ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 459 of file canvas.cpp.

460{
462
463 m_nMouseDownMsg = nMsg;
464 BOOL bLeftButton = (nMsg == WM_LBUTTONDOWN);
465
466 if (nMsg == WM_MBUTTONDOWN)
467 {
468 m_ptOrig = pt;
469 SetCapture();
471 return 0;
472 }
473
474 HITTEST hitSelection = selectionModel.hitTest(pt);
475 if (hitSelection != HIT_NONE)
476 {
477 m_drawing = TRUE;
479 SetCapture();
480 toolsModel.OnButtonDown(bLeftButton, pt.x, pt.y, FALSE);
481 Invalidate();
482 return 0;
483 }
484
485 HITTEST hit = CanvasHitTest(pt);
486 if (hit == HIT_NONE || hit == HIT_BORDER)
487 {
488 switch (toolsModel.GetActiveTool())
489 {
490 case TOOL_BEZIER:
491 case TOOL_SHAPE:
493 Invalidate();
494 break;
495
496 case TOOL_FREESEL:
497 case TOOL_RECTSEL:
499 Invalidate();
500 break;
501
502 default:
503 break;
504 }
505
506 toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions
507 return 0;
508 }
509
511
512 if (hit == HIT_INNER)
513 {
514 m_drawing = TRUE;
515 SetCapture();
516 toolsModel.OnButtonDown(bLeftButton, pt.x, pt.y, FALSE);
517 Invalidate();
518 return 0;
519 }
520
521 if (bLeftButton)
522 {
523 m_hitCanvasSizeBox = hit;
524 m_ptOrig = pt;
525 SetCapture();
526 }
527
528 return 0;
529}
HINSTANCE g_hinstExe
Definition: main.cpp:17
HITTEST
Definition: precomp.h:57
@ HIT_BORDER
Definition: precomp.h:67
#define IDC_HANDDRAG
Definition: resource.h:25
HITTEST CanvasHitTest(POINT pt)
Definition: canvas.cpp:217
POINT m_ptOrig
Definition: canvas.h:94
HITTEST hitTest(POINT ptCanvas)
void OnEndDraw(BOOL bCancel)
Definition: mouse.cpp:1182
TOOLTYPE GetActiveTool() const
Definition: toolsmodel.cpp:142
unsigned int BOOL
Definition: ntddk_ex.h:94
@ TOOL_SHAPE
Definition: toolsmodel.h:25
@ TOOL_BEZIER
Definition: toolsmodel.h:23
@ TOOL_FREESEL
Definition: toolsmodel.h:12
@ TOOL_RECTSEL
Definition: toolsmodel.h:13
HWND WINAPI SetCapture(_In_ HWND hWnd)
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
#define WM_LBUTTONDOWN
Definition: winuser.h:1804
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2474
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define WM_MBUTTONDOWN
Definition: winuser.h:1810

◆ OnButtonUp()

LRESULT CCanvasWindow::OnButtonUp ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 672 of file canvas.cpp.

673{
676
678
679 BOOL bLeftButton = (m_nMouseDownMsg == WM_LBUTTONDOWN);
680 m_nMouseDownMsg = 0;
681
682 if (m_drawing)
683 {
685 toolsModel.OnButtonUp(bLeftButton, pt.x, pt.y);
686 Invalidate(FALSE);
688 return 0;
689 }
690
691 if (m_hitCanvasSizeBox == HIT_NONE || !bLeftButton)
692 return 0;
693
694 // Resize the image
695 INT cxImage = imageModel.GetWidth(), cyImage = imageModel.GetHeight();
696 INT cxDelta = pt.x - m_ptOrig.x;
697 INT cyDelta = pt.y - m_ptOrig.y;
698 switch (m_hitCanvasSizeBox)
699 {
700 case HIT_UPPER_LEFT:
701 imageModel.Crop(cxImage - cxDelta, cyImage - cyDelta, cxDelta, cyDelta);
702 break;
703 case HIT_UPPER_CENTER:
704 imageModel.Crop(cxImage, cyImage - cyDelta, 0, cyDelta);
705 break;
706 case HIT_UPPER_RIGHT:
707 imageModel.Crop(cxImage + cxDelta, cyImage - cyDelta, 0, cyDelta);
708 break;
709 case HIT_MIDDLE_LEFT:
710 imageModel.Crop(cxImage - cxDelta, cyImage, cxDelta, 0);
711 break;
712 case HIT_MIDDLE_RIGHT:
713 imageModel.Crop(cxImage + cxDelta, cyImage, 0, 0);
714 break;
715 case HIT_LOWER_LEFT:
716 imageModel.Crop(cxImage - cxDelta, cyImage + cyDelta, cxDelta, 0);
717 break;
718 case HIT_LOWER_CENTER:
719 imageModel.Crop(cxImage, cyImage + cyDelta, 0, 0);
720 break;
721 case HIT_LOWER_RIGHT:
722 imageModel.Crop(cxImage + cxDelta, cyImage + cyDelta, 0, 0);
723 break;
724 default:
725 break;
726 }
728
730
732 toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions
734 Invalidate(TRUE);
735 return 0;
736}
HWND g_hStatusBar
Definition: main.cpp:23
BOOL g_imageSaved
Definition: main.cpp:21
@ HIT_LOWER_RIGHT
Definition: precomp.h:66
@ HIT_LOWER_CENTER
Definition: precomp.h:65
@ HIT_UPPER_LEFT
Definition: precomp.h:59
@ HIT_LOWER_LEFT
Definition: precomp.h:64
@ HIT_UPPER_CENTER
Definition: precomp.h:60
@ HIT_UPPER_RIGHT
Definition: precomp.h:61
@ HIT_MIDDLE_RIGHT
Definition: precomp.h:63
@ HIT_MIDDLE_LEFT
Definition: precomp.h:62
VOID updateScrollRange()
Definition: canvas.cpp:371
void SetRectEmpty() noexcept
Definition: atltypes.h:431
void Crop(int nWidth, int nHeight, int nOffsetX=0, int nOffsetY=0)
Definition: history.cpp:191
void OnButtonUp(BOOL bLeftButton, LONG x, LONG y)
Definition: mouse.cpp:1173
#define L(x)
Definition: resources.c:13
LONG_PTR LPARAM
Definition: minwindef.h:175
#define SB_SETTEXT
Definition: commctrl.h:1954
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

◆ OnCancelMode()

LRESULT CCanvasWindow::OnCancelMode ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 841 of file canvas.cpp.

842{
843 // Cancel dragging
846 Invalidate(TRUE);
847 return 0;
848}

◆ OnCaptureChanged()

LRESULT CCanvasWindow::OnCaptureChanged ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 855 of file canvas.cpp.

856{
858 return 0;
859}

◆ OnCtlColorEdit()

LRESULT CCanvasWindow::OnCtlColorEdit ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 898 of file canvas.cpp.

899{
903}
COLORREF GetFgColor() const
WPARAM wParam
Definition: combotst.c:138
LONG_PTR LRESULT
Definition: minwindef.h:176
PaletteModel paletteModel
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define TRANSPARENT
Definition: wingdi.h:950
#define NULL_BRUSH
Definition: wingdi.h:901
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:917

◆ OnEndDraw()

VOID CCanvasWindow::OnEndDraw ( BOOL  bCancel)

Definition at line 891 of file canvas.cpp.

892{
894 toolsModel.OnEndDraw(bCancel);
895 Invalidate(FALSE);
896}

Referenced by CMainWindow::ConfirmSave(), CMainWindow::OnCommand(), OnKeyDown(), and CMainWindow::saveImage().

◆ OnEraseBkgnd()

LRESULT CCanvasWindow::OnEraseBkgnd ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 861 of file canvas.cpp.

862{
863 return TRUE; // do nothing => transparent background
864}

◆ OnHScroll()

LRESULT CCanvasWindow::OnHScroll ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 447 of file canvas.cpp.

448{
450 return 0;
451}
VOID OnHVScroll(WPARAM wParam, INT fnBar)
Definition: canvas.cpp:416

◆ OnHVScroll()

VOID CCanvasWindow::OnHVScroll ( WPARAM  wParam,
INT  fnBar 
)
protected

Definition at line 416 of file canvas.cpp.

417{
419 si.cbSize = sizeof(si);
420 si.fMask = SIF_ALL;
421 GetScrollInfo(fnBar, &si);
422
423 switch (LOWORD(wParam))
424 {
425 case SB_THUMBTRACK:
426 case SB_THUMBPOSITION:
427 si.nPos = (SHORT)HIWORD(wParam);
428 break;
429 case SB_LINELEFT: // SB_LINEUP
430 si.nPos -= 15;
431 break;
432 case SB_LINERIGHT: // SB_LINEDOWN
433 si.nPos += 15;
434 break;
435 case SB_PAGELEFT: // SB_PAGEUP
436 si.nPos -= si.nPage;
437 break;
438 case SB_PAGERIGHT: // SB_PAGEDOWN
439 si.nPos += si.nPage;
440 break;
441 }
442 si.nPos = max(min(si.nPos, si.nMax), si.nMin);
443 SetScrollInfo(fnBar, &si);
444 Invalidate();
445}
static SYSTEM_INFO si
Definition: virtual.c:39
#define min(a, b)
Definition: monoChain.cc:55
#define LOWORD(l)
Definition: pedump.c:82
short SHORT
Definition: pedump.c:59
#define max(a, b)
Definition: svc.c:63
#define HIWORD(l)
Definition: typedefs.h:247
#define SB_THUMBTRACK
Definition: winuser.h:573
#define SB_PAGERIGHT
Definition: winuser.h:571
#define SB_LINERIGHT
Definition: winuser.h:567
#define SB_LINELEFT
Definition: winuser.h:566
#define SIF_ALL
Definition: winuser.h:1243
int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL)
BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO)
#define SB_PAGELEFT
Definition: winuser.h:570
#define SB_THUMBPOSITION
Definition: winuser.h:572

Referenced by OnHScroll(), and OnVScroll().

◆ OnKeyDown()

LRESULT CCanvasWindow::OnKeyDown ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 826 of file canvas.cpp.

827{
828 if (wParam == VK_ESCAPE)
829 {
832 m_nMouseDownMsg = 0;
835 Invalidate(TRUE);
836 }
837
838 return 0;
839}
VOID OnEndDraw(BOOL bCancel)
Definition: canvas.cpp:891
#define VK_ESCAPE
Definition: winuser.h:2250

◆ OnMouseMove()

LRESULT CCanvasWindow::OnMouseMove ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 546 of file canvas.cpp.

547{
549
551 {
552 INT x = GetScrollPos(SB_HORZ) - (pt.x - m_ptOrig.x);
553 INT y = GetScrollPos(SB_VERT) - (pt.y - m_ptOrig.y);
556 m_ptOrig = pt;
557 return 0;
558 }
559
561
563 Invalidate();
564
566 {
567 TRACKMOUSEEVENT tme = { sizeof(tme) };
568 tme.dwFlags = TME_LEAVE;
569 tme.hwndTrack = m_hWnd;
570 tme.dwHoverTime = 0;
571 ::TrackMouseEvent(&tme);
572
573 if (!m_drawing)
574 {
575 CRect rcImage;
576 GetImageRect(rcImage);
577
578 CStringW strCoord;
579 if (rcImage.PtInRect(pt))
580 strCoord.Format(L"%ld, %ld", pt.x, pt.y);
582 }
583 }
584
586 {
588 return 0;
589 }
590
591 if (m_hitCanvasSizeBox == HIT_NONE || ::GetCapture() != m_hWnd)
592 return 0;
593
594 // Dragging now... Calculate the new size
595 INT cxImage = imageModel.GetWidth(), cyImage = imageModel.GetHeight();
596 INT cxDelta = pt.x - m_ptOrig.x;
597 INT cyDelta = pt.y - m_ptOrig.y;
598 switch (m_hitCanvasSizeBox)
599 {
600 case HIT_UPPER_LEFT:
601 cxImage -= cxDelta;
602 cyImage -= cyDelta;
603 break;
604 case HIT_UPPER_CENTER:
605 cyImage -= cyDelta;
606 break;
607 case HIT_UPPER_RIGHT:
608 cxImage += cxDelta;
609 cyImage -= cyDelta;
610 break;
611 case HIT_MIDDLE_LEFT:
612 cxImage -= cxDelta;
613 break;
614 case HIT_MIDDLE_RIGHT:
615 cxImage += cxDelta;
616 break;
617 case HIT_LOWER_LEFT:
618 cxImage -= cxDelta;
619 cyImage += cyDelta;
620 break;
621 case HIT_LOWER_CENTER:
622 cyImage += cyDelta;
623 break;
624 case HIT_LOWER_RIGHT:
625 cxImage += cxDelta;
626 cyImage += cyDelta;
627 break;
628 default:
629 return 0;
630 }
631
632 // Limit bitmap size
633 cxImage = max(1, cxImage);
634 cyImage = max(1, cyImage);
635 cxImage = min(MAXWORD, cxImage);
636 cyImage = min(MAXWORD, cyImage);
637
638 // Display new size
639 CStringW strSize;
640 strSize.Format(L"%d x %d", cxImage, cyImage);
642
643 // Dragging now... Fix the position...
644 CRect rcResizing = { 0, 0, cxImage, cyImage };
645 switch (m_hitCanvasSizeBox)
646 {
647 case HIT_UPPER_LEFT:
648 rcResizing.OffsetRect(cxDelta, cyDelta);
649 break;
650 case HIT_UPPER_CENTER:
651 rcResizing.OffsetRect(0, cyDelta);
652 break;
653 case HIT_UPPER_RIGHT:
654 rcResizing.OffsetRect(0, cyDelta);
655 break;
656 case HIT_MIDDLE_LEFT:
657 rcResizing.OffsetRect(cxDelta, 0);
658 break;
659 case HIT_LOWER_LEFT:
660 rcResizing.OffsetRect(cxDelta, 0);
661 break;
662 default:
663 break;
664 }
665 ImageToCanvas(rcResizing);
666 m_rcResizing = rcResizing;
667 Invalidate(TRUE);
668
669 return 0;
670}
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
BOOL PtInRect(POINT point) const noexcept
Definition: atltypes.h:418
BOOL IsSelection() const
Definition: toolsmodel.cpp:41
void DrawWithMouseTool(POINT pt, WPARAM wParam)
Definition: mouse.cpp:1205
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define MAXWORD
#define TME_LEAVE
Definition: commctrl.h:4998
@ TOOL_AIRBRUSH
Definition: toolsmodel.h:20
@ TOOL_ZOOM
Definition: toolsmodel.h:17
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define MAKEWPARAM(l, h)
Definition: winuser.h:4117
#define WM_HSCROLL
Definition: winuser.h:1771
#define WM_VSCROLL
Definition: winuser.h:1772
HWND WINAPI GetCapture(void)
Definition: message.c:2881
BOOL WINAPI TrackMouseEvent(_Inout_ LPTRACKMOUSEEVENT)
#define SendMessage
Definition: winuser.h:6009

◆ OnMouseWheel()

LRESULT CCanvasWindow::OnMouseWheel ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 850 of file canvas.cpp.

851{
852 return ::SendMessageW(GetParent(), nMsg, wParam, lParam);
853}
HWND WINAPI GetParent(_In_ HWND)

◆ OnPaint()

LRESULT CCanvasWindow::OnPaint ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 866 of file canvas.cpp.

867{
868 RECT rcClient;
869 GetClientRect(&rcClient);
870
871 static BOOL s_bShowedOutOfMemory = FALSE; // Don't show "Out Of Memory" message multiple time
872
873 PAINTSTRUCT ps;
874 HDC hDC = BeginPaint(&ps);
875
876 if (DoDraw(hDC, rcClient, ps.rcPaint))
877 {
878 s_bShowedOutOfMemory = FALSE;
879 }
880 else if (!s_bShowedOutOfMemory)
881 {
883 s_bShowedOutOfMemory = TRUE;
884 imageModel.ClearHistory(); // Reduce memory usage
885 }
886
887 EndPaint(&ps);
888 return 0;
889}
void ShowOutOfMemory(void)
Definition: main.cpp:34
BOOL DoDraw(HDC hDC, RECT &rcClient, RECT &rcPaint)
Definition: canvas.cpp:268
void ClearHistory(void)
Definition: history.cpp:114
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)

◆ OnPaletteModelColorChanged()

LRESULT CCanvasWindow::OnPaletteModelColorChanged ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 905 of file canvas.cpp.

906{
908 return 0;
909}
void NotifyImageChanged()
Definition: history.cpp:23

◆ OnSetCursor()

LRESULT CCanvasWindow::OnSetCursor ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 738 of file canvas.cpp.

739{
741 {
742 bHandled = FALSE;
743 return 0;
744 }
745
747 {
749 return 0;
750 }
751
752 POINT pt;
755
756 CRect rcClient;
757 GetClientRect(&rcClient);
758
759 if (!rcClient.PtInRect(pt))
760 {
761 bHandled = FALSE;
762 return 0;
763 }
764
765 HITTEST hitSelection = selectionModel.hitTest(pt);
766 if (hitSelection != HIT_NONE)
767 {
768 if (!setCursorOnSizeBox(hitSelection))
770 return 0;
771 }
772
773 CRect rcImage;
774 GetImageRect(rcImage);
775 ImageToCanvas(rcImage);
776
777 if (rcImage.PtInRect(pt))
778 {
779 switch (toolsModel.GetActiveTool())
780 {
781 case TOOL_FILL:
783 break;
784 case TOOL_COLOR:
786 break;
787 case TOOL_ZOOM:
789 break;
790 case TOOL_PEN:
792 break;
793 case TOOL_AIRBRUSH:
795 break;
796 case TOOL_RUBBER:
797 {
803 break;
804 }
805 case TOOL_BRUSH:
806 {
812 break;
813 }
814 default:
816 }
817 return 0;
818 }
819
821 bHandled = FALSE;
822
823 return 0;
824}
#define IDC_ZOOM
Definition: resource.h:16
#define IDC_FILL
Definition: resource.h:20
#define IDC_PEN
Definition: resource.h:23
#define IDC_COLOR
Definition: resource.h:21
#define IDC_AIRBRUSH
Definition: resource.h:24
CStyledCursor m_hRubberCursor
Definition: canvas.h:93
CStyledCursor m_hBrushCursor
Definition: canvas.h:92
void SetCursor()
Definition: canvas.h:24
void SetStyle(BrushStyle style, INT zoom, INT radius, COLORREF color, BOOL is_rubber)
Definition: canvas.cpp:142
static BOOL IsWaiting()
Definition: CWaitCursor.h:40
COLORREF GetBgColor() const
BrushStyle GetBrushStyle() const
Definition: toolsmodel.cpp:130
int GetRubberRadius() const
Definition: toolsmodel.cpp:202
INT GetBrushWidth() const
Definition: toolsmodel.cpp:70
BOOL setCursorOnSizeBox(HITTEST hit)
Definition: sizebox.cpp:20
@ TOOL_COLOR
Definition: toolsmodel.h:16
@ TOOL_RUBBER
Definition: toolsmodel.h:14
@ TOOL_BRUSH
Definition: toolsmodel.h:19
@ TOOL_FILL
Definition: toolsmodel.h:15
@ TOOL_PEN
Definition: toolsmodel.h:18
@ BrushStyleSquare
Definition: toolsmodel.h:34
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3064
#define IDC_SIZEALL
Definition: winuser.h:704
#define IDC_CROSS
Definition: winuser.h:698
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

◆ OnSize()

LRESULT CCanvasWindow::OnSize ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 408 of file canvas.cpp.

409{
410 if (m_hWnd)
412
413 return 0;
414}

◆ OnVScroll()

LRESULT CCanvasWindow::OnVScroll ( UINT  nMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
protected

Definition at line 453 of file canvas.cpp.

454{
456 return 0;
457}

◆ updateScrollPos()

VOID CCanvasWindow::updateScrollPos ( INT  x = 0,
INT  y = 0 
)

Definition at line 402 of file canvas.cpp.

403{
406}
int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL)

Referenced by CMainWindow::OnCommand(), SetBitmapAndInfo(), and zoomTo().

◆ updateScrollRange()

VOID CCanvasWindow::updateScrollRange ( )

Definition at line 371 of file canvas.cpp.

372{
373 CRect rcClient;
374 GetClientRect(&rcClient);
375
376 CSize sizePage(rcClient.right, rcClient.bottom);
377 CSize sizeZoomed = { Zoomed(imageModel.GetWidth()), Zoomed(imageModel.GetHeight()) };
378 CSize sizeWhole = { sizeZoomed.cx + (GRIP_SIZE * 2), sizeZoomed.cy + (GRIP_SIZE * 2) };
379
380 // show/hide the scrollbars
381 ShowScrollBar(SB_HORZ, sizePage.cx < sizeWhole.cx);
382 ShowScrollBar(SB_VERT, sizePage.cy < sizeWhole.cy);
383
384 if (sizePage.cx < sizeWhole.cx || sizePage.cy < sizeWhole.cy)
385 {
386 GetClientRect(&rcClient); // Scrollbars might change, get client rectangle again
387 sizePage = CSize(rcClient.right, rcClient.bottom);
388 }
389
390 SCROLLINFO si = { sizeof(si), SIF_PAGE | SIF_RANGE };
391 si.nMin = 0;
392
393 si.nMax = sizeWhole.cx;
394 si.nPage = sizePage.cx;
396
397 si.nMax = sizeWhole.cy;
398 si.nPage = sizePage.cy;
400}
LONG cx
Definition: windef.h:134
LONG cy
Definition: windef.h:135
#define SIF_RANGE
Definition: winuser.h:1246
#define SIF_PAGE
Definition: winuser.h:1244
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)

Referenced by ImageModel::NotifyImageChanged(), OnButtonUp(), OnSize(), and zoomTo().

◆ zoomTo()

VOID CCanvasWindow::zoomTo ( INT  newZoom,
LONG  left = 0,
LONG  top = 0 
)

Definition at line 253 of file canvas.cpp.

254{
255 POINT pt = { left, top };
257
258 toolsModel.SetZoom(newZoom);
260 pt.x += GetScrollPos(SB_HORZ);
261 pt.y += GetScrollPos(SB_VERT);
262
264 updateScrollPos(pt.x, pt.y);
265 Invalidate(TRUE);
266}
VOID updateScrollPos(INT x=0, INT y=0)
Definition: canvas.cpp:402
void SetZoom(int nZoom)
Definition: toolsmodel.cpp:275
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLint left
Definition: glext.h:7726

Referenced by ZoomTool::OnButtonDown(), CMainWindow::OnCommand(), CMainWindow::OnMouseWheel(), and CToolSettingsWindow::OnVScroll().

Member Data Documentation

◆ m_drawing

◆ m_hBrushCursor

CStyledCursor CCanvasWindow::m_hBrushCursor
protected

Definition at line 92 of file canvas.h.

Referenced by OnSetCursor().

◆ m_hitCanvasSizeBox

HITTEST CCanvasWindow::m_hitCanvasSizeBox
protected

Definition at line 91 of file canvas.h.

Referenced by DoDraw(), OnButtonDown(), OnButtonUp(), OnCancelMode(), OnKeyDown(), and OnMouseMove().

◆ m_hRubberCursor

CStyledCursor CCanvasWindow::m_hRubberCursor
protected

Definition at line 93 of file canvas.h.

Referenced by OnSetCursor().

◆ m_nMouseDownMsg

UINT CCanvasWindow::m_nMouseDownMsg = 0
protected

Definition at line 116 of file canvas.h.

Referenced by OnButtonDblClk(), OnButtonDown(), OnButtonUp(), OnKeyDown(), OnMouseMove(), and OnSetCursor().

◆ m_ptOrig

POINT CCanvasWindow::m_ptOrig
protected

Definition at line 94 of file canvas.h.

Referenced by OnButtonDown(), OnButtonUp(), and OnMouseMove().

◆ m_rcResizing

CRect CCanvasWindow::m_rcResizing
protected

Definition at line 95 of file canvas.h.

Referenced by DoDraw(), OnButtonUp(), OnCancelMode(), OnKeyDown(), and OnMouseMove().


The documentation for this class was generated from the following files: