📄 basic.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: basic.cpp// Purpose: Basic OGL classes// Author: Julian Smart// Modified by:// Created: 12/07/98// RCS-ID: $Id: basic.cpp,v 1.29 2006/04/18 22:26:26 PC Exp $// Copyright: (c) Julian Smart// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__#pragma hdrstop#endif#ifndef WX_PRECOMP#include "wx/wx.h"#endif#if wxUSE_PROLOGIO#include "wx/deprecated/wxexpr.h"#endif#ifdef new#undef new#endif#include <stdio.h>#include <ctype.h>#include "wx/ogl/ogl.h"// Control point types// Rectangle and most other shapes#define CONTROL_POINT_VERTICAL 1#define CONTROL_POINT_HORIZONTAL 2#define CONTROL_POINT_DIAGONAL 3// Line#define CONTROL_POINT_ENDPOINT_TO 4#define CONTROL_POINT_ENDPOINT_FROM 5#define CONTROL_POINT_LINE 6IMPLEMENT_DYNAMIC_CLASS(wxShapeTextLine, wxObject)IMPLEMENT_DYNAMIC_CLASS(wxAttachmentPoint, wxObject)wxShapeTextLine::wxShapeTextLine(double the_x, double the_y, const wxString& the_line){ m_x = the_x; m_y = the_y; m_line = the_line;}wxShapeTextLine::~wxShapeTextLine(){}IMPLEMENT_ABSTRACT_CLASS(wxShapeEvtHandler, wxObject)wxShapeEvtHandler::wxShapeEvtHandler(wxShapeEvtHandler *prev, wxShape *shape){ m_previousHandler = prev; m_handlerShape = shape;}wxShapeEvtHandler::~wxShapeEvtHandler(){}// Creates a copy of this event handler.wxShapeEvtHandler* wxShapeEvtHandler::CreateNewCopy(){ wxShapeEvtHandler* newObject = (wxShapeEvtHandler*) GetClassInfo()->CreateObject(); wxASSERT( (newObject != NULL) ); wxASSERT( (newObject->IsKindOf(CLASSINFO(wxShapeEvtHandler))) ); newObject->m_previousHandler = newObject; CopyData(*newObject); return newObject;}void wxShapeEvtHandler::OnDelete(){ if (this != GetShape()) delete this;}void wxShapeEvtHandler::OnDraw(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnDraw(dc);}void wxShapeEvtHandler::OnMoveLinks(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnMoveLinks(dc);}void wxShapeEvtHandler::OnMoveLink(wxDC& dc, bool moveControlPoints){ if (m_previousHandler) m_previousHandler->OnMoveLink(dc, moveControlPoints);}void wxShapeEvtHandler::OnDrawContents(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnDrawContents(dc);}void wxShapeEvtHandler::OnDrawBranches(wxDC& dc, bool erase){ if (m_previousHandler) m_previousHandler->OnDrawBranches(dc, erase);}void wxShapeEvtHandler::OnSize(double x, double y){ if (m_previousHandler) m_previousHandler->OnSize(x, y);}bool wxShapeEvtHandler::OnMovePre(wxDC& dc, double x, double y, double old_x, double old_y, bool display){ if (m_previousHandler) return m_previousHandler->OnMovePre(dc, x, y, old_x, old_y, display); else return true;}void wxShapeEvtHandler::OnMovePost(wxDC& dc, double x, double y, double old_x, double old_y, bool display){ if (m_previousHandler) m_previousHandler->OnMovePost(dc, x, y, old_x, old_y, display);}void wxShapeEvtHandler::OnErase(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnErase(dc);}void wxShapeEvtHandler::OnEraseContents(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnEraseContents(dc);}void wxShapeEvtHandler::OnHighlight(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnHighlight(dc);}void wxShapeEvtHandler::OnLeftClick(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnLeftClick(x, y, keys, attachment);}void wxShapeEvtHandler::OnLeftDoubleClick(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnLeftDoubleClick(x, y, keys, attachment);}void wxShapeEvtHandler::OnRightClick(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnRightClick(x, y, keys, attachment);}void wxShapeEvtHandler::OnDragLeft(bool draw, double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnDragLeft(draw, x, y, keys, attachment);}void wxShapeEvtHandler::OnBeginDragLeft(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnBeginDragLeft(x, y, keys, attachment);}void wxShapeEvtHandler::OnEndDragLeft(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnEndDragLeft(x, y, keys, attachment);}void wxShapeEvtHandler::OnDragRight(bool draw, double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnDragRight(draw, x, y, keys, attachment);}void wxShapeEvtHandler::OnBeginDragRight(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnBeginDragRight(x, y, keys, attachment);}void wxShapeEvtHandler::OnEndDragRight(double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnEndDragRight(x, y, keys, attachment);}// Control points ('handles') redirect control to the actual shape, to make it easier// to override sizing behaviour.void wxShapeEvtHandler::OnSizingDragLeft(wxControlPoint* pt, bool draw, double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnSizingDragLeft(pt, draw, x, y, keys, attachment);}void wxShapeEvtHandler::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnSizingBeginDragLeft(pt, x, y, keys, attachment);}void wxShapeEvtHandler::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int keys, int attachment){ if (m_previousHandler) m_previousHandler->OnSizingEndDragLeft(pt, x, y, keys, attachment);}void wxShapeEvtHandler::OnDrawOutline(wxDC& dc, double x, double y, double w, double h){ if (m_previousHandler) m_previousHandler->OnDrawOutline(dc, x, y, w, h);}void wxShapeEvtHandler::OnDrawControlPoints(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnDrawControlPoints(dc);}void wxShapeEvtHandler::OnEraseControlPoints(wxDC& dc){ if (m_previousHandler) m_previousHandler->OnEraseControlPoints(dc);}// Can override this to prevent or intercept line reordering.void wxShapeEvtHandler::OnChangeAttachment(int attachment, wxLineShape* line, wxList& ordering){ if (m_previousHandler) m_previousHandler->OnChangeAttachment(attachment, line, ordering);}IMPLEMENT_ABSTRACT_CLASS(wxShape, wxShapeEvtHandler)wxShape::wxShape(wxShapeCanvas *can){ m_eventHandler = this; SetShape(this); m_id = 0; m_formatted = false; m_canvas = can; m_xpos = 0.0; m_ypos = 0.0; m_pen = g_oglBlackPen; m_brush = wxWHITE_BRUSH; m_font = g_oglNormalFont; m_textColour = wxT("BLACK"); m_textColourName = wxT("BLACK"); m_visible = false; m_selected = false; m_attachmentMode = ATTACHMENT_MODE_NONE; m_spaceAttachments = true; m_disableLabel = false; m_fixedWidth = false; m_fixedHeight = false; m_drawHandles = true; m_sensitivity = OP_ALL; m_draggable = true; m_parent = NULL; m_formatMode = FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT; m_shadowMode = SHADOW_NONE; m_shadowOffsetX = 6; m_shadowOffsetY = 6; m_shadowBrush = wxBLACK_BRUSH; m_textMarginX = 5; m_textMarginY = 5; m_regionName = wxT("0"); m_centreResize = true; m_maintainAspectRatio = false; m_highlighted = false; m_rotation = 0.0; m_branchNeckLength = 10; m_branchStemLength = 10; m_branchSpacing = 10; m_branchStyle = BRANCHING_ATTACHMENT_NORMAL; // Set up a default region. Much of the above will be put into // the region eventually (the duplication is for compatibility) wxShapeRegion *region = new wxShapeRegion; m_regions.Append(region); region->SetName(wxT("0")); region->SetFont(g_oglNormalFont); region->SetFormatMode(FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT); region->SetColour(wxT("BLACK"));}wxShape::~wxShape(){ if (m_parent) m_parent->GetChildren().DeleteObject(this); ClearText(); ClearRegions(); ClearAttachments(); if (m_canvas) m_canvas->RemoveShape(this); GetEventHandler()->OnDelete();}void wxShape::SetHighlight(bool hi, bool recurse){ m_highlighted = hi; if (recurse) { wxNode *node = m_children.GetFirst(); while (node) { wxShape *child = (wxShape *)node->GetData(); child->SetHighlight(hi, recurse); node = node->GetNext(); } }}void wxShape::SetSensitivityFilter(int sens, bool recursive){ if (sens & OP_DRAG_LEFT) m_draggable = true; else m_draggable = false; m_sensitivity = sens; if (recursive) { wxNode *node = m_children.GetFirst(); while (node) { wxShape *obj = (wxShape *)node->GetData(); obj->SetSensitivityFilter(sens, true); node = node->GetNext(); } }}void wxShape::SetDraggable(bool drag, bool recursive){ m_draggable = drag; if (m_draggable) m_sensitivity |= OP_DRAG_LEFT; else if (m_sensitivity & OP_DRAG_LEFT) m_sensitivity = m_sensitivity - OP_DRAG_LEFT; if (recursive) { wxNode *node = m_children.GetFirst(); while (node) { wxShape *obj = (wxShape *)node->GetData(); obj->SetDraggable(drag, true); node = node->GetNext(); } }}void wxShape::SetDrawHandles(bool drawH){ m_drawHandles = drawH; wxNode *node = m_children.GetFirst(); while (node) { wxShape *obj = (wxShape *)node->GetData(); obj->SetDrawHandles(drawH); node = node->GetNext(); }}void wxShape::SetShadowMode(int mode, bool redraw){ if (redraw && GetCanvas()) { wxClientDC dc(GetCanvas()); GetCanvas()->PrepareDC(dc); Erase(dc); m_shadowMode = mode; Draw(dc); } else { m_shadowMode = mode; }}void wxShape::SetCanvas(wxShapeCanvas *theCanvas){ m_canvas = theCanvas; wxNode *node = m_children.GetFirst(); while (node) { wxShape *child = (wxShape *)node->GetData(); child->SetCanvas(theCanvas); node = node->GetNext(); }}void wxShape::AddToCanvas(wxShapeCanvas *theCanvas, wxShape *addAfter){ theCanvas->AddShape(this, addAfter); wxNode *node = m_children.GetFirst(); wxShape *lastImage = this; while (node) { wxShape *object = (wxShape *)node->GetData(); object->AddToCanvas(theCanvas, lastImage); lastImage = object; node = node->GetNext(); }}// Insert at front of canvasvoid wxShape::InsertInCanvas(wxShapeCanvas *theCanvas){ theCanvas->InsertShape(this); wxNode *node = m_children.GetFirst(); wxShape *lastImage = this; while (node) { wxShape *object = (wxShape *)node->GetData(); object->AddToCanvas(theCanvas, lastImage); lastImage = object; node = node->GetNext(); }}void wxShape::RemoveFromCanvas(wxShapeCanvas *theCanvas){ if (Selected()) Select(false); theCanvas->RemoveShape(this); wxNode *node = m_children.GetFirst(); while (node) { wxShape *object = (wxShape *)node->GetData(); object->RemoveFromCanvas(theCanvas); node = node->GetNext(); }}void wxShape::ClearAttachments(){ wxNode *node = m_attachmentPoints.GetFirst(); while (node) { wxAttachmentPoint *point = (wxAttachmentPoint *)node->GetData(); delete point; node = node->GetNext(); } m_attachmentPoints.Clear();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -