// // DRAW.HPP // Drawing Code // // Copyright Microsoft 1998- // #ifndef __DRAW_HPP_ #define __DRAW_HPP_ // // Timer for periodic update of some graphic objects // #define TIMER_GRAPHIC_UPDATE 2 #define EqualPoint(pt1, pt2) (((pt1).x == (pt2).x) && ((pt1).y == (pt2).y)) #define DRAW_WIDTH 1024 #define DRAW_HEIGHT 768 #define DRAW_LINEVSCROLL 8 #define DRAW_LINEHSCROLL 8 #define DRAW_HANDLESIZE 6 #define DRAW_ZOOMFACTOR 2 #define DRAW_REMOTEPOINTERDELAY 250 #define DRAW_GRAPHICUPDATEDELAY 1000 // // // Class: WbDrawingArea // // Purpose: drawing window // // class WbDrawingArea { friend class DCWbGraphic; friend class DCWbGraphicLine; friend class DCWbGraphicFreehand; friend class DCWbGraphicRectangle; friend class DCWbGraphicFilledRectangle; friend class DCWbGraphicEllipse; friend class DCWbGraphicFilledEllipse; friend class DCWbGraphicSelectTrackingRectangle; friend class DCWbGraphicMarker; friend class DCWbGraphicText; friend class DCWbGraphicDIB; friend class WbTextBox; public: // // Constructor // WbDrawingArea(void); ~WbDrawingArea(void); void ShutDownDC(void); // // Create the drawing area // BOOL Create(HWND hwndParent, LPCRECT lprect); // // Return TRUE if the drawing area is busy and may be actively using // graphic objects in the current page. // BOOL IsBusy(void) { return m_bBusy; } // // Lock and unlock the drawing area // BOOL IsLocked (void) { return m_bLocked; } void Unlock (void); void Lock (void); // // Realize the drawing area's palette // void RealizePalette( BOOL bBackground );//CHANGED BY RAND // // Selection functions // void SelectTool(WbTool* pToolNew); // Select drawing tool // // Update the selected object // void SetSelectionColor (COLORREF clr); // Change color void SetSelectionWidth (UINT uiNewWidth); // Select pen width void SetSelectionFont (HFONT hFont); // Select font // // External update functions // void PageCleared(void); void GraphicAdded (DCWbGraphic* pAddedGraphic); void GraphicDeleted (DCWbGraphic* pDeletedGraphic); //CHANGED BY RAND void GraphicUpdated (DCWbGraphic* pUpdatedGraphic, BOOL bUpdateMarker, BOOL bErase=TRUE ); void PointerUpdated (DCWbGraphicPointer* pPointer, BOOL bForcedRemove = FALSE); void PointerRemoved (DCWbGraphicPointer* pPointer) { PointerUpdated(pPointer, TRUE); } void RemoveGraphicPointer(DCWbGraphicPointer *p) { POSITION pos = m_allPointers.Lookup(p); if (pos != NULL) { m_allPointers.RemoveAt(pos); } } // // Query functions // // Ask whether an object is currently selected BOOL GraphicSelected(void); // Return the currently selected graphic DCWbGraphic* GetSelection(void); // Clear current (multi object) selection void ClearSelection( void ); // is pGraphic selected? BOOL IsSelected( DCWbGraphic *pGraphic ) {return(m_pMarker->HasAMarker( pGraphic ) != NULL );} DCWbGraphic *GetHitObject( POINT surfacePos ) {return( PG_SelectLast(m_hPage, surfacePos) );} // Ask whether the drawing area is zoomed BOOL Zoomed(void) { return (m_iZoomFactor != 1); } // Ask whether the drawing area is zoomed int ZoomOption(void) { return (m_iZoomOption); } int ZoomFactor(void) { return (m_iZoomFactor); } // Ask whether the text editor is active BOOL TextEditActive(void) { return m_bTextEditorActive; } // text editor clipboard void TextEditCopy( void ) {m_textEditor.Copy();} void TextEditCut( void ) {m_textEditor.Cut();} void TextEditPaste( void ) {m_textEditor.Paste();} // Resets text editor for window resizing void TextEditParentResize( void ) {m_textEditor.ParentResize();} // Redraws editbox void RedrawTextEditbox(void) {m_textEditor.RedrawEditbox();} // Gets editbox bounding rect void GetTextEditBoundsRect(LPRECT lprc) { m_textEditor.GetBoundsRect(lprc); } // Return the rectangle currently being viewed i.e. that portion of // the page surface that is within the window client area. void GetVisibleRect(LPRECT lprc); // Ask for the current page WB_PAGE_HANDLE Page(void) { return(m_hPage);} // Select objects inside rectSelect or ALL if rect is NULL void SelectMarkerFromRect(LPCRECT lprcSelect); DCWbGraphicMarker *GetMarker( void ) {return( m_pMarker );} DCWbGraphic* SelectPreviousGraphicAt(DCWbGraphic* pGraphic, POINT point); void SetLClickIgnore( BOOL bIgnore ) {m_bIgnoreNextLClick = bIgnore;} // // Delete a graphic // void DeleteGraphic(DCWbGraphic* pGraphic); // // Action members // void Attach(WB_PAGE_HANDLE hPage); // Attach a new page to the window void Detach(void) { Attach(NULL); } // Attach the empty page void DeleteSelection(void); // Delete selected graphic void BringToTopSelection(void); // Bring selected graphic to top void SendToBackSelection(void); // Send selected graphic to back void Clear(void); // Clear the workspace void Zoom(void); // Zoom the drawing area void GotoPosition(int x, int y); // Set scroll position // select an object void SelectGraphic(DCWbGraphic* pGraphic, BOOL bEnableForceAdd=FALSE, //CHANGED BY RAND BOOL bForceAdd=FALSE ); //CHANGED BY RAND // // A freehand graphic has been updated - redraw it // void GraphicFreehandUpdated(DCWbGraphic* pGraphic); // // Convert between surface and client co-ordinates // void SurfaceToClient(LPPOINT lppt); void ClientToSurface(LPPOINT lppt); void SurfaceToClient(LPRECT lprc); void ClientToSurface(LPRECT lprc); void MoveOntoSurface(LPPOINT lppt); void GetOrigin(LPPOINT lppt); HDC GetCachedDC (void) const {return(m_hDCCached); } void PrimeFont (HDC hDC, HFONT hFont, TEXTMETRIC* pTextMetrics); void UnPrimeFont (HDC hDC); void DrawMarker (HDC hDC); void PutMarker (HDC hDC, BOOL bDraw = TRUE ); void RemoveMarker (HDC hDC); // // Cancel a drawing operation. // void CancelDrawingMode(void); void SetStartPaintGraphic( WB_GRAPHIC_HANDLE hStartPaintGraphic ) {m_hStartPaintGraphic = PG_ZGreaterGraphic(m_hPage, m_hStartPaintGraphic, hStartPaintGraphic );} friend LRESULT CALLBACK DrawWndProc(HWND, UINT, WPARAM, LPARAM); // // Windows message handling // void OnPaint(void); void OnMouseMove(UINT flags, int x, int y); void OnLButtonDown(UINT flags, int x, int y); void OnLButtonUp(UINT flags, int x, int y); void OnRButtonDown(UINT flags, int x, int y); void OnSize(UINT flags, int cx, int cy); void OnHScroll(UINT code, UINT pos); void OnVScroll(UINT code, UINT pos); LRESULT OnEditColor(HDC hdc); void OnSetFocus(void); void OnActivate(UINT flags); LRESULT OnCursor(HWND hwnd, UINT hitTest, UINT msg); void OnTimer(UINT idTimer); void OnCancelMode(void); void OnContextMenu(int xScreen, int yScreen); protected: // // Update the window after an object has changed // void UpdateRectangles(LPCRECT lprc1, LPCRECT lprc2, BOOL bRepaint); // // Set the cursor to be used in the drawing area for the current state // BOOL SetCursorForState(void); // // Add an object to the end of the recorded list and display it in the // window. // void AddObjectLast(DCWbGraphic* pObject); // // Invalidate the client area rectangle corresponding to the surface // rectangle specified. // void InvalidateSurfaceRect(LPCRECT lprc, BOOL bErase = TRUE); // // Setup functions for the various drawing operations // BOOL RemotePointerSelect (POINT mousePos); void BeginSelectMode (POINT mousePos, BOOL bDontDrag=FALSE ); void BeginDeleteMode (POINT mousePos); void BeginTextMode (POINT mousePos); void BeginFreehandMode (POINT mousePos); void BeginHighlightMode (POINT mousePos); void BeginLineMode (POINT mousePos); void BeginRectangleMode (POINT mousePos); void BeginEllipseMode (POINT mousePos); // // Mouse tracking functions. These are called for each mouse move event // (depending on the current drawing mode). // void TrackSelectMode (POINT mousePos); void TrackDeleteMode (POINT mousePos); void TrackFreehandMode (POINT mousePos); void TrackHighlightMode (POINT mousePos); void TrackLineMode (POINT mousePos); void TrackRectangleMode (POINT mousePos); void TrackEllipseMode (POINT mousePos); // // Completion functions for the various mode drawing operations. // void CompleteSelectMode(); void CompleteDeleteMode(); void CompleteMarkAreaMode(); void CompleteTextMode(); void CompleteFreehandMode(); void CompleteLineMode(); void CompleteRectangleMode(); void CompleteFilledRectangleMode(); void CompleteEllipseMode(); void CompleteFilledEllipseMode(); // // Complete a text object // void EndTextEntry(BOOL bAccept); // // Scroll the workspace to scrollPosition // void ScrollWorkspace (void); void DoScrollWorkspace (void); BOOL AutoScroll(int xPos, int yPos, BOOL bMoveCursor, int xCaret, int yCaret); // // Graphic object selection and marker manipulation // void DeselectGraphic(void); // // Remote pointer manipulation // void RemovePointers(HDC hDC, DCWbGraphicPointer* pPointerStart = NULL); void RemovePointers(HDC hDC, LPCRECT prcUpdate); void RemovePointers(HDC hDC, DCWbGraphicPointer* pPointerStart, LPCRECT prcUpdate); // // Redraw the pointers in the list specified. The pointers are drawn // from the start of the list to the end. If a NULL pointer is // specified, the undrawnPointers list is used. // void PutPointers(HDC hDC, COBLIST* pDrawList = NULL); void PrimeDC (HDC hDC); void UnPrimeDC (HDC hDC); // // List of pointers on the page // List of pointers that have been (temporarily undrawn). This list is // built by RemovePointers for use by PutPointers. // COBLIST m_allPointers; COBLIST m_undrawnPointers; // // Flag indicating that the drawing area is busy or locked // BOOL m_bBusy; BOOL m_bLocked; BOOL m_HourGlass; // we're busy doing something local // // Saved drawing attributes // HPEN m_hOldPen; HBRUSH m_hOldBrush; HPALETTE m_hOldPalette; HFONT m_hOldFont; HFONT m_hCurFont; // // Current offset of the client region of the window onto the picture // RECT m_rcSurface; public: SIZE m_originOffset; HWND m_hwnd; // // Saved drawing attributes // HDC m_hDCCached; HDC m_hDCWindow; protected: // // Scrolling control // void SetScrollRange(int cx, int cy); void ValidateScrollPos(void); POINT m_posScroll; POINT m_posZoomScroll; BOOL m_zoomRestoreScroll; // // Start and end points of most recent drawing operation // POINT m_ptStart; POINT m_ptEnd; // // Current drawing tool // WbTool * m_pToolCur; // // Mouse button down flag // BOOL m_bLButtonDown; // // Current page being used // WB_PAGE_HANDLE m_hPage; // // Graphics object pointer used for tracking object // DCWbGraphic* m_pGraphicTracker; // // Tick count used to determine when it is time to update the external // copy of a graphic. // DWORD m_dwTickCount; // // Marker for selection mode // DCWbGraphicMarker *m_pMarker; DCWbGraphic* m_pSelectedGraphic; BOOL m_bMarkerPresent; BOOL m_bNewMarkedGraphic; BOOL m_bTrackingSelectRect; // // Text editor control // WbTextEditor m_textEditor; BOOL m_bTextEditorActive; DCWbGraphicText* m_pActiveText; void ActivateTextEditor( BOOL bPutUpCusor ); void DeactivateTextEditor(void); // // Text cursor control // BOOL m_bGotCaret; // // Currently marked area // RECT m_rcMarkedArea; // // Zoom variables // int m_iZoomFactor; // Current zoom factor int m_iZoomOption; // Zoom factor to be used HCURSOR m_hCursor; // handle of last cursor we displayed // (or null if normal arrow cursor) BOOL m_bIgnoreNextLClick; WB_GRAPHIC_HANDLE m_hStartPaintGraphic; }; #endif // __DRAW_HPP_