⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 divided.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        divided.cpp// Purpose:     wxDividedShape class// Author:      Julian Smart// Modified by:// Created:     12/07/98// RCS-ID:      $Id: divided.cpp,v 1.19 2005/10/06 18:17:21 ABX 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#include "wx/ogl/ogl.h"class wxDividedShapeControlPoint: public wxControlPoint{ DECLARE_DYNAMIC_CLASS(wxDividedShapeControlPoint) private:  int regionId; public:  wxDividedShapeControlPoint() { regionId = 0; }  wxDividedShapeControlPoint(wxShapeCanvas *the_canvas, wxShape *object, int region,                            double size, double the_xoffset, double the_yoffset, int the_type);  ~wxDividedShapeControlPoint();  void OnDragLeft(bool draw, double x, double y, int keys=0, int attachment = 0);  void OnBeginDragLeft(double x, double y, int keys=0, int attachment = 0);  void OnEndDragLeft(double x, double y, int keys=0, int attachment = 0);};IMPLEMENT_DYNAMIC_CLASS(wxDividedShapeControlPoint, wxControlPoint)/* * Divided object * */IMPLEMENT_DYNAMIC_CLASS(wxDividedShape, wxRectangleShape)wxDividedShape::wxDividedShape(double w, double h): wxRectangleShape(w, h){  ClearRegions();}wxDividedShape::~wxDividedShape(){}void wxDividedShape::OnDraw(wxDC& dc){  wxRectangleShape::OnDraw(dc);}void wxDividedShape::OnDrawContents(wxDC& dc){  double defaultProportion = (double)(GetRegions().GetCount() > 0 ? (1.0/((double)(GetRegions().GetCount()))) : 0.0);  double currentY = (double)(m_ypos - (m_height / 2.0));  double maxY = (double)(m_ypos + (m_height / 2.0));  double leftX = (double)(m_xpos - (m_width / 2.0));  double rightX = (double)(m_xpos + (m_width / 2.0));  if (m_pen) dc.SetPen(* m_pen);  dc.SetTextForeground(m_textColour);#ifdef __WXMSW__  // For efficiency, don't do this under X - doesn't make  // any visible difference for our purposes.  if (m_brush)    dc.SetTextBackground(m_brush->GetColour());#endif/*  if (!formatted)  {    FormatRegionText();    formatted = true;  }*/  if (GetDisableLabel()) return;  double xMargin = 2;  double yMargin = 2;  dc.SetBackgroundMode(wxTRANSPARENT);  wxObjectList::compatibility_iterator node = GetRegions().GetFirst();  while (node)  {    wxShapeRegion *region = (wxShapeRegion *)node->GetData();    dc.SetFont(* region->GetFont());    dc.SetTextForeground(region->GetActualColourObject());    double proportion =      region->m_regionProportionY < 0.0 ? defaultProportion : region->m_regionProportionY;    double y = currentY + m_height*proportion;    double actualY = maxY < y ? maxY : y;    double centreX = m_xpos;    double centreY = (double)(currentY + (actualY - currentY)/2.0);    oglDrawFormattedText(dc, &region->m_formattedText,             (double)(centreX), (double)(centreY), (double)(m_width-2*xMargin), (double)(actualY - currentY - 2*yMargin),             region->m_formatMode);    if ((y <= maxY) && (node->GetNext()))    {      wxPen *regionPen = region->GetActualPen();      if (regionPen)      {        dc.SetPen(* regionPen);        dc.DrawLine(WXROUND(leftX), WXROUND(y), WXROUND(rightX), WXROUND(y));      }    }    currentY = actualY;    node = node->GetNext();  }}void wxDividedShape::SetSize(double w, double h, bool WXUNUSED(recursive)){  SetAttachmentSize(w, h);  m_width = w;  m_height = h;  SetRegionSizes();}void wxDividedShape::SetRegionSizes(){  if (GetRegions().GetCount() == 0)    return;  double defaultProportion = (double)(GetRegions().GetCount() > 0 ? (1.0/((double)(GetRegions().GetCount()))) : 0.0);  double currentY = (double)(m_ypos - (m_height / 2.0));  double maxY = (double)(m_ypos + (m_height / 2.0));//  double leftX = (double)(m_xpos - (m_width / 2.0));//  double rightX = (double)(m_xpos + (m_width / 2.0));  wxObjectList::compatibility_iterator node = GetRegions().GetFirst();  while (node)  {    wxShapeRegion *region = (wxShapeRegion *)node->GetData();    double proportion =      region->m_regionProportionY <= 0.0 ? defaultProportion : region->m_regionProportionY;    double sizeY = (double)proportion*m_height;    double y = currentY + sizeY;    double actualY = maxY < y ? maxY : y;    double centreY = (double)(currentY + (actualY - currentY)/2.0);    region->SetSize(m_width, sizeY);    region->SetPosition(0.0, (double)(centreY - m_ypos));    currentY = actualY;    node = node->GetNext();  }}// Attachment points correspond to regions in the divided boxbool wxDividedShape::GetAttachmentPosition(int attachment, double *x, double *y, int nth, int no_arcs,  wxLineShape *line){  int totalNumberAttachments = (GetRegions().GetCount() * 2) + 2;  if ((GetAttachmentMode() == ATTACHMENT_MODE_NONE) || (attachment >= totalNumberAttachments))  {    return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs);  }  int n = GetRegions().GetCount();  bool isEnd = (line && line->IsEnd(this));  double left = (double)(m_xpos - m_width/2.0);  double right = (double)(m_xpos + m_width/2.0);  double top = (double)(m_ypos - m_height/2.0);  double bottom = (double)(m_ypos + m_height/2.0);  // Zero is top, n+1 is bottom.  if (attachment == 0)  {    *y = top;    if (m_spaceAttachments)    {      if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))      {        // Align line according to the next handle along        wxRealPoint *point = line->GetNextControlPoint(this);        if (point->x < left)          *x = left;        else if (point->x > right)          *x = right;        else          *x = point->x;      }      else        *x = left + (nth + 1)*m_width/(no_arcs + 1);    }    else      *x = m_xpos;  }  else if (attachment == (n+1))  {    *y = bottom;    if (m_spaceAttachments)    {      if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))      {        // Align line according to the next handle along        wxRealPoint *point = line->GetNextControlPoint(this);        if (point->x < left)          *x = left;        else if (point->x > right)          *x = right;        else          *x = point->x;      }      else        *x = left + (nth + 1)*m_width/(no_arcs + 1);    }    else      *x = m_xpos;  }  // Left or right.  else  {    bool isLeft = !(attachment < (n+1));    int i = (isLeft) ? (totalNumberAttachments - attachment - 1) : (attachment-1);    wxObjectList::compatibility_iterator node = GetRegions().Item(i);    if (node)    {      wxShapeRegion *region = (wxShapeRegion *)node->GetData();      if (isLeft)        *x = left;      else        *x = right;      // Calculate top and bottom of region      top = (double)((m_ypos + region->m_y) - (region->m_height/2.0));      bottom = (double)((m_ypos + region->m_y) + (region->m_height/2.0));      // Assuming we can trust the absolute size and      // position of these regions...      if (m_spaceAttachments)      {        if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))        {          // Align line according to the next handle along          wxRealPoint *point = line->GetNextControlPoint(this);          if (point->y < bottom)            *y = bottom;          else if (point->y > top)            *y = top;          else            *y = point->y;        }        else//          *y = (double)(((m_ypos + region->m_y) - (region->m_height/2.0)) + (nth + 1)*region->m_height/(no_arcs+1));          *y = (double)(top + (nth + 1)*region->m_height/(no_arcs+1));      }      else        *y = (double)(m_ypos + region->m_y);    }    else    {      *x = m_xpos;      *y = m_ypos;      return false;    }  }  return true;}int wxDividedShape::GetNumberOfAttachments() const{  // There are two attachments for each region (left and right),  // plus one on the top and one on the bottom.  int n = (GetRegions().GetCount() * 2) + 2;  int maxN = n - 1;  wxObjectList::compatibility_iterator node = m_attachmentPoints.GetFirst();  while (node)  {    wxAttachmentPoint *point = (wxAttachmentPoint *)node->GetData();    if (point->m_id > maxN)      maxN = point->m_id;    node = node->GetNext();  }  return maxN + 1;}bool wxDividedShape::AttachmentIsValid(int attachment) const{  int totalNumberAttachments = (GetRegions().GetCount() * 2) + 2;  if (attachment >= totalNumberAttachments)  {    return wxShape::AttachmentIsValid(attachment);  }  else if (attachment >= 0)    return true;  else    return false;}void wxDividedShape::Copy(wxShape& copy){  wxRectangleShape::Copy(copy);}// Region operationsvoid wxDividedShape::MakeControlPoints(){  wxRectangleShape::MakeControlPoints();  MakeMandatoryControlPoints();}void wxDividedShape::MakeMandatoryControlPoints(){  double currentY = (double)(GetY() - (m_height / 2.0));  double maxY = (double)(GetY() + (m_height / 2.0));  wxObjectList::compatibility_iterator node = GetRegions().GetFirst();  int i = 0;  while (node)  {    wxShapeRegion *region = (wxShapeRegion *)node->GetData();    double proportion = region->m_regionProportionY;    double y = currentY + m_height*proportion;    double actualY = (double)(maxY < y ? maxY : y);    if (node->GetNext())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -