QQ登录

只需一步,快速开始

上位机MFC扩展编程图表自定义图例位置与外观

[ 复制链接 ]
上位机MFC扩展编程图表自定义图例位置与外观

在创建一个图表时,其默认图例显示位置共有五个,分别是上,下,左,右,右上。
对应枚举类型为:
        enum LegendPosition
        {
                LP_NONE,
                LP_TOP,
                LP_BOTTOM,
                LP_LEFT,
                LP_RIGHT,
                LP_TOPRIGHT
        };

可通过图表控件进行设置:
SetLegendPosition(BCGPChartLayout:P_NONE);
LP_NONE表示不显示图例。
默认只有五个位置,如果还想自定义图例显示位置的话,
就得自己从CBCGPChartVisualObject派生类来实现。

另外如果图例默认外观不满意也是可以在派生类中进行重绘。
当前例程实现从CBCGPChartVisualObject派生自己的类CMyChart,
实现自定义图例外观的绘制与图例左上角显示的新位置.
例程界面如下:
2020-01-03_215607.jpg
点击自绘图例外观,可以显示派生类中绘制的图例外观。
多次点击更改图例位置,会依次循环更改图例的位置:
不显示,上,下,左,右,右上角,左上角(自定义).
自定义类源代码为:
  1. class CMyChart : public CBCGPChartVisualObject
  2. {
  3.         DECLARE_DYNCREATE(CMyChart)

  4. protected:
  5.         CBCGPBrush        m_brWhite;
  6.         CBCGPPoint        m_ptLegendCustomPos;
  7.         BOOL m_bOwnerDrawLegendKey;
  8. public:
  9.         //图例是否在自定义位置;
  10.         BOOL IsLegendCustomPosition() const
  11.         {
  12.                 return m_ptLegendCustomPos != CBCGPPoint(-1, -1);
  13.         }
  14.         //图例是水平还是垂直布局;
  15.         virtual BOOL IsLegendHorizontal() const
  16.         {
  17.                 if (IsLegendCustomPosition())
  18.                         return FALSE;//图例在自定义位置表示垂直;
  19.                 return CBCGPChartVisualObject::IsLegendHorizontal();
  20.         }
  21.         //图例自绘开,开;
  22.         void EnableLegendCustomDraw(BOOL bEnable = true)
  23.         {
  24.                 EnableDrawLegendShape(bEnable);
  25.                 m_bOwnerDrawLegendKey = bEnable;
  26.         }
  27.         //图例自定义位置开、关;
  28.         void EnableLegendCustomPosition(BOOL bEnable, BOOL bLegendOverlapsChart = FALSE)
  29.         {
  30.                 m_ptLegendCustomPos = bEnable ? CBCGPPoint(0, 25) : CBCGPPoint(-1, -1);
  31.                 m_chartLayout.m_bLegendOverlapsChart = bLegendOverlapsChart;
  32.                 m_rectPlotAreaPadding.left = 0;
  33.         }
  34. protected:
  35.         CMyChart()
  36.         {
  37.                 m_bOwnerDrawLegendKey = FALSE;
  38.                 m_brWhite.SetColor(CBCGPColor::White, 0.7);
  39.                 m_ptLegendCustomPos.SetPoint(-1, -1);
  40.         }
  41.         //由库调用,计算数据标签大小;
  42.         virtual BOOL OnCalcDataLabelSize(CBCGPGraphicsManager* pGM, const CString& strText, CBCGPChartSeries* pSeries,
复制代码
重绘图例按钮点击函数为:
  1. void CMy123View::OnBnClickedCheck1()
  2. {
  3.         BOOL bOwnerDraw = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck();
  4.         //获取自定义图表;
  5.         CMyChart* pChart = DYNAMIC_DOWNCAST(CMyChart,m_wndChart.GetChart() );
  6.         ASSERT_VALID(pChart);
  7.         pChart->EnableLegendCustomDraw(bOwnerDraw);
  8.         pChart->Redraw();
  9. }
复制代码
更改图例显示位置按钮函数为:
  1. void CMy123View::OnBnClickedButton2()
  2. {
  3.         static int nLegendPosition=0;//维护图表位置;
  4.         BOOL bOwnerDrawPos = ((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck();
  5.         if(bOwnerDrawPos)
  6.                 nLegendPosition +=1;
  7.         //获取自定义图表;
  8.         CMyChart* pChart = DYNAMIC_DOWNCAST(CMyChart,m_wndChart.GetChart() );
  9.         ASSERT_VALID(pChart);
  10.         //设置图例位置;
  11.         if(nLegendPosition>6)
  12.                 nLegendPosition=0;
  13.         if(nLegendPosition==6)
  14.         {
  15.                 pChart->EnableLegendCustomPosition(true);//自定义图例位置于图表左上角;
  16.         }
  17.         else
  18.         {
  19.                 pChart->EnableLegendCustomPosition(false);
  20.                 pChart->SetLegendPosition((BCGPChartLayout::LegendPosition)nLegendPosition);
  21.         }
  22.         pChart->SetDirty(true,true);
  23. }
复制代码
在使用图例前,得创建一个图表,添加一些数据来演示。
例程中图表创建函数为:
  1. BOOL CMy123View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
复制代码
例程下载地址:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:图表自定义图例位置与外观.rar 
文件大小:79.87 KB  售价:3金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  



回复

使用道具 举报

快速回复 返回列表 客服中心 搜索