#ifndef __IMGTOOLS_H__ #define __IMGTOOLS_H__ extern BOOL g_bBrushVisible; extern BOOL g_bPickingColor; extern UINT g_nStrokeWidth; typedef enum { eFREEHAND, eEAST_WEST, //HORIZONTAL eNORTH_SOUTH, //VERTICAL eNORTH_WEST, // 45 degree up to left eSOUTH_EAST, // 45 degree down to right eNORTH_EAST, // 45 degree up to right eSOUTH_WEST // 45 degree down to left } eDRAWCONSTRAINTDIRECTION; class CImgTool : public CObject { DECLARE_DYNAMIC( CImgTool ) protected: eDRAWCONSTRAINTDIRECTION DetermineDrawDirection(MTI *pmti); virtual void AdjustPointsForConstraint(MTI *pmti); virtual void PreProcessPoints(MTI *pmti); eDRAWCONSTRAINTDIRECTION m_eDrawDirection; public: CImgTool(); virtual void OnEnter ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnLeave ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnStartDrag ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnEndDrag ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnDrag ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnMove ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnTimer ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnCancel ( CImgWnd* pImgWnd); virtual void OnActivate ( BOOL bActivate ); virtual void OnShowDragger ( CImgWnd* pImgWnd, BOOL bShow ); virtual void OnPaintOptions ( CDC* pDC, const CRect& paintRect, const CRect& optionsRect ); virtual void OnClickOptions ( CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint ); virtual void OnUpdateColors (CImgWnd* pImgWnd); virtual BOOL CanEndMultiptOperation(MTI* pmti ); virtual void EndMultiptOperation(BOOL bAbort = FALSE); virtual BOOL IsToolModal(void); virtual BOOL SetupPenBrush(HDC hDC, BOOL bLeftButton, BOOL bSetup, BOOL bCtrlDown); void PaintStdBrushes( CDC* pDC, const CRect& paintRect, const CRect& optionsRect ); void PaintStdPattern( CDC* pDC, const CRect& paintRect, const CRect& optionsRect ); void ClickStdBrushes(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); void ClickStdPattern(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); static void HideDragger(CImgWnd* pImgWnd); static void ShowDragger(CImgWnd* pImgWnd); inline BOOL UsesBrush()const { return m_bUsesBrush; } inline BOOL IsToggle() const { return m_bToggleWithPrev; } inline BOOL IsFilled() const { return m_bFilled; } inline BOOL HasBorder()const { return m_bBorder; } inline UINT GetCmdID() const { return m_nCmdID; } inline BOOL IsMultPtOpInProgress() const { return m_bMultPtOpInProgress; } virtual BOOL IsUndoable(); virtual UINT GetCursorID(); void SetStrokeWidth(UINT nNewStrokeWidth); inline UINT GetStrokeWidth() const { return m_nStrokeWidth; } inline UINT GetStrokeShape() const { return m_nStrokeShape; } void SetStrokeShape(UINT nNewStrokeShape); static inline CImgTool* GetCurrent() { return c_pCurrentImgTool; } static inline UINT GetCurrentID() { return c_pCurrentImgTool->m_nCmdID; } static inline BOOL IsDragging() { return c_bDragging; } void Select(); static void Select(UINT nCmdID); static inline void SelectPrevious() { ASSERT(c_pPreviousImgTool != NULL); c_pPreviousImgTool->Select(); } static CImgTool* FromID(UINT nCmdID); protected: BOOL m_bUsesBrush; BOOL m_bIsUndoable; BOOL m_bCanBePrevTool; BOOL m_bToggleWithPrev; BOOL m_bFilled; BOOL m_bBorder; BOOL m_bMultPtOpInProgress; UINT m_nStrokeWidth; UINT m_nStrokeShape; UINT m_nCursorID; UINT m_nCmdID; CImgTool* m_pNextImgTool; static CImgTool* c_pHeadImgTool; static CImgTool* c_pCurrentImgTool; static CImgTool* c_pPreviousImgTool; static BOOL c_bDragging; static int c_nHideCount; }; class CRubberTool : public CImgTool { DECLARE_DYNAMIC(CRubberTool) protected: virtual void AdjustPointsForConstraint(MTI *pmti); // virtual BOOL SetupMaskPenBrush(HDC hDC, BOOL bLeftButton, BOOL bSetup); public: CRubberTool(); virtual void OnPaintOptions( CDC* pDC, const CRect& paintRect, const CRect& optionsRect ); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void Render(CDC* pDC, CRect& rect, BOOL bDraw, BOOL bCommit, BOOL bCtrlDown); virtual void OnActivate ( BOOL bActivate ); static CRect rcPrev; }; class CClosedFormTool : public CRubberTool { DECLARE_DYNAMIC(CClosedFormTool) public: virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); }; class CRectTool : public CClosedFormTool { DECLARE_DYNAMIC(CRectTool) public: CRectTool(); }; class CRoundRectTool : public CClosedFormTool { DECLARE_DYNAMIC(CRoundRectTool) public: CRoundRectTool(); }; class CEllipseTool : public CClosedFormTool { DECLARE_DYNAMIC(CEllipseTool) public: CEllipseTool(); }; class CLineTool : public CRubberTool { DECLARE_DYNAMIC(CLineTool) protected: virtual void AdjustPointsForConstraint(MTI *pmti); friend class CPolygonTool; // need to call AdjustPointsForContstraint from cPolygonTool friend class CCurveTool; // need to call AdjustPointsForContstraint from cPolygonTool public: CLineTool(); virtual void Render(CDC* pDC, CRect& rect, BOOL bDraw, BOOL bCommit, BOOL bCtrlDown); }; class CSelectTool : public CImgTool { DECLARE_DYNAMIC(CSelectTool) protected: friend class CFreehandSelectTool; // need to call OnClickOptions and OnPaintOptions public: CSelectTool(); virtual void OnActivate(BOOL bActivate); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnCancel(CImgWnd* pImgWnd); virtual void OnShowDragger(CImgWnd* pImgWnd, BOOL bShow); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); virtual BOOL IsToolModal(void); void InvertSelectRect(CImgWnd* pImgWnd); UINT GetCursorID(); static CRect c_selectRect; static CImageWell c_imageWell; }; class CFreehandTool : public CImgTool { DECLARE_DYNAMIC(CFreehandTool) public: CFreehandTool(); void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); static CRect c_undoRect; }; class CSketchTool : public CFreehandTool { DECLARE_DYNAMIC(CSketchTool) public: CSketchTool(); virtual void OnDrag ( CImgWnd* pImgWnd, MTI* pmti ); virtual void OnCancel( CImgWnd* pImgWnd ); }; class CBrushTool : public CFreehandTool { DECLARE_DYNAMIC(CBrushTool) public: CBrushTool(); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnMove(CImgWnd* pImgWnd, MTI* pmti); }; class CPencilTool : public CFreehandTool { DECLARE_DYNAMIC(CPencilTool) protected: virtual void AdjustPointsForConstraint(MTI *pmti); public: CPencilTool(); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); }; class CEraserTool : public CFreehandTool { DECLARE_DYNAMIC(CEraserTool) public: CEraserTool(); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnMove(CImgWnd* pImgWnd, MTI* pmti); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); virtual void OnShowDragger(CImgWnd* pImgWnd, BOOL bShow); virtual UINT GetCursorID(); }; class CAirBrushTool : public CFreehandTool { DECLARE_DYNAMIC(CAirBrushTool) public: CAirBrushTool(); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnTimer(CImgWnd* pImgWnd, MTI* pmti); virtual void OnCancel(CImgWnd* pImgWnd); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); static CImageWell c_imageWell; private: BOOL m_bCtrlDown; }; class CFloodTool : public CImgTool { DECLARE_DYNAMIC(CFloodTool) public: CFloodTool(); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); }; class CPickColorTool : public CImgTool { DECLARE_DYNAMIC(CPickColorTool) public: COLORREF m_Color; CPickColorTool(); virtual void OnActivate(BOOL bActivate); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnCancel(CImgWnd* pImgWnd); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); }; class CZoomTool : public CImgTool { DECLARE_DYNAMIC(CZoomTool) protected: void InvertZoomRect(); static CRect c_zoomRect; static CImgWnd* c_pImgWnd; static CImageWell c_imageWell; public: CZoomTool(); virtual void OnLeave(CImgWnd* pImgWnd, MTI* pmti); virtual void OnMove(CImgWnd* pImgWnd, MTI* pmti); virtual void OnStartDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnEndDrag(CImgWnd* pImgWnd, MTI* pmti); virtual void OnCancel(CImgWnd* pImgWnd); virtual void OnShowDragger(CImgWnd* pImgWnd, BOOL bShow); virtual void OnPaintOptions(CDC* pDC, const CRect& paintRect, const CRect& optionsRect); virtual void OnClickOptions(CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint); }; #endif // __IMGTOOLS_H__