|
|
//
// DRAW.HPP
// Drawing Code
//
// Copyright Microsoft 1998-
//
#ifndef __DRAW_HPP_
#define __DRAW_HPP_
#include <oblist.h>
#define HIT_WINDOW 1
#define MAKE_HIT_RECT(r, p ) \
::SetRect(&r, p.x-HIT_WINDOW, p.y-HIT_WINDOW, p.x+HIT_WINDOW, p.y+HIT_WINDOW);
//
// Timer for periodic update of some graphic objects
//
#define TIMER_GRAPHIC_UPDATE 8
#define TIMER_REMOTE_POINTER_UPDATE 9
#define EqualPoint(pt1, pt2) (((pt1).x == (pt2).x) && ((pt1).y == (pt2).y))
#define DRAW_WIDTH 1280
#define DRAW_HEIGHT 1024
#define DRAW_LINEVSCROLL 8
#define DRAW_LINEHSCROLL 8
#define DRAW_HANDLESIZE 6
#define DRAW_ZOOMFACTOR 2
#define DRAW_REMOTEPOINTERDELAY 250
#define DRAW_GRAPHICUPDATEDELAY 1000
extern WorkspaceObj* g_pCurrentWorkspace;
//
//
// Class: WbDrawingArea
//
// Purpose: drawing window
//
//
class WbDrawingArea {
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 SetLock(BOOL bLock){ m_bLocked = bLock; } void Unlock (void); void Lock (void);
BOOL IsSynced (void) { return m_bSync; } void SetSync(BOOL bSync) { m_bSync = bSync; }
//
// 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);
//
// Query functions
//
// Ask whether an object is currently selected
BOOL GraphicSelected(void);
// Return the currently selected graphic
T126Obj* GetSelection(void);
// Clear current (multi object) selection
void ClearSelection( void );
T126Obj *GetHitObject( POINT surfacePos ) {return( PG_SelectLast(g_pCurrentWorkspace, 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); }
//
// Complete a text object
//
void EndTextEntry(BOOL bAccept);
// Ask whether the text editor is active
BOOL TextEditActive(void) { return m_bTextEditorActive; }
// text editor clipboard
void TextEditCopy( void ) {m_pTextEditor->Copy();}
void TextEditCut( void ) {m_pTextEditor->Cut();}
void TextEditPaste( void ) {m_pTextEditor->Paste();}
// Resets text editor for window resizing
void TextEditParentResize( void ) {m_pTextEditor->ParentResize();}
// Redraws editbox
void RedrawTextEditbox(void) {m_pTextEditor->RedrawEditbox();}
// Gets editbox bounding rect
void GetTextEditBoundsRect(LPRECT lprc) { m_pTextEditor->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);
// Select objects inside rectSelect or ALL if rect is NULL
void SelectMarkerFromRect(LPCRECT lprcSelect); DrawObj *GetMarker( void ) {return( m_pMarker );}
T126Obj* SelectPreviousGraphicAt(T126Obj* pGraphic, POINT point);
void SetLClickIgnore( BOOL bIgnore ) {m_bIgnoreNextLClick = bIgnore;}
//
// Action members
//
void Attach(WorkspaceObj * pNewWorkspace); // Attach a new page to the window
void Detach(void) { Attach(NULL); } // Attach the empty page
void DeleteSelection(void); // Delete selected graphic
LRESULT BringToTopSelection(BOOL editedLocally, T126Obj * pT126Obj = NULL); // Bring selected graphic to top
LRESULT SendToBackSelection(BOOL editedLocally, T126Obj * pT126Obj = NULL); // 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(T126Obj* pGraphic, BOOL bEnableForceAdd=FALSE, //CHANGED BY RAND
BOOL bForceAdd=FALSE ); //CHANGED BY RAND
BOOL MoveSelectedGraphicBy(LONG x, LONG y); void EraseInitialDrawFinal(LONG x, LONG y, BOOL editedLocally, T126Obj* pObj = NULL); void EraseSelectedDrawings();
//
//
// 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); T126Obj* GetSelectedGraphic (void){ return m_pSelectedGraphic;}
//
// Invalidate the client area rectangle corresponding to the surface
// rectangle specified.
//
void InvalidateSurfaceRect(LPCRECT lprc, BOOL bErase);
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 (void);
//
// Cancel a drawing operation.
//
void CancelDrawingMode(void);
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: //
// Set the cursor to be used in the drawing area for the current state
//
BOOL SetCursorForState(void);
//
// Setup functions for the various drawing operations
//
BOOL RemotePointerSelect (POINT mousePos); void BeginSelectMode (POINT mousePos, BOOL bDontDrag ); void BeginDeleteMode (POINT mousePos); void BeginTextMode (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);
//
// Completion functions for the various mode drawing operations.
//
void CompleteSelectMode(); void CompleteDeleteMode(); void CompleteMarkAreaMode(); void CompleteTextMode();
void BeginDrawingMode(POINT surfacePos); void TrackDrawingMode(POINT surfacePos); void CompleteDrawingMode();
//
// 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
//
//
// 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);
//
// 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
BOOL m_bSync;
//
// 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;
HBRUSH m_hMarkerBrush; RECT m_selectorRect; WbTextEditor* m_pTextEditor; void DeactivateTextEditor(void);
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;
//
// Graphics object pointer used for tracking object
//
DrawObj* 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
//
DrawObj* m_pMarker; T126Obj* m_pSelectedGraphic; BOOL m_bMarkerPresent; BOOL m_bNewMarkedGraphic;
BOOL m_bTrackingSelectRect;
//
// Text editor control
//
BOOL m_bTextEditorActive; // TextObj* m_pActiveText;
void ActivateTextEditor( BOOL bPutUpCusor );
//
// 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;
};
#endif // __DRAW_HPP_
|