VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 19773|回复: 163

[原创] VC-MFC封装柱形图标控件CBarChart

  [复制链接]
001
51_avatar_middle
最佳答案
79 
online_admins 发表于 2014-11-8 22:12:06 | 显示全部楼层 |阅读模式


本篇文章为【集思广益 - 原创作品投稿活动】的投稿作品,投稿到VC驿站邮箱:service@cctry.com
已被VC驿站收录,并奖励作者100元稿费,收录稿件版权!
欢迎驿站网友踊跃参与,稿费丰厚哦!
本次活动说明详见:https://www.cctry.com/thread-59248-1-1.html



本篇文章翻译自:http://www.codeproject.com/Articles/17105/CBarChart#Introduction
VC++ 6.0 和 VS2008 均编译调试通过;
VC++6.0 Test 界面如下:
VC-MFC封装柱形图标控件CBarChart


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////


内容
    *介绍
        *开发背景
        *代码的应用
                >创建柱形图
                >标题文本和背景色
                >添加柱形图
                >网格,标签和提示工具
                >缩放功能
                >删除柱形图
        >打印
                >连接数据库

介绍
CBarChart 是一个来自CWnd派生的MFC控件的简单实例,它可以帮助你很快速很简单得到你想要的矩形图表.

开发背景
几天前,我需要去添加一个图表项目,当我完成时,我感觉我自己做的不是太烂,所以我决定在这里和我的同事朋友们,分享一下这些代码.
我没有太多时间在这个控件上,所以我尽可能怎么简单怎么来.下面是我做这个图表的目标:
         开发不超过两三天.
        图表必须有吸引力,必须准确,用户不太熟悉电脑或程序也可以很方便操作.
        它必须简单易懂,不是处理大数据,而是为了方便新用户.
        它应该可以打印.
        它应该可以重用.
以上面为目的开始写程序的,如果你有什么意见,有什么错误,或者你有什么优化代码,请帮我指出.


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////


代码的应用
        >创建柱形图
首先我们要创建柱形图:
1.        添加 BarChart.cpp 和 BarChar.h 到你的工程里
2.        添加#include “BarChart.h”到你想创建柱形图表类的头文件中
3.        添加CBarChart类型的成员变量m_chart.
4.        在你的CPP文件中使用Create方法来创建柱形图表
  1. // 创建柱形图表
  2. if (!m_chart.Create(
  3.     rcBound,              // 创建边界区域
  4.    this,                 // 父窗口的指针
  5.    0 ))                  // 控件ID
  6.     {
  7.     // 如果错误在这里处理
  8.     }
复制代码

如果创建成功返回TRUE.

>标题文本和背景色
你可以使用SetTitle和SetBKColor去添加和改变背景色
  1. m_chart.SetTitle("A test chart, displaying some dummy data...");
  2. m_chart.SetBKColor(RGB(255, 255, 240));
复制代码

>添加柱形图
最终,去添加柱形图,使用:AddBar函数如下:
  1. m_chart.AddBar(
  2. 1600.356,           // 设置柱形图的值
  3. "Jan",              // 设置柱形图的标签
  4. RGB(255,255,0));    // 设置柱形图的颜色
复制代码


>网格,标签和提示工具
你可以决定是否可以看到网格,标签和设定的值
  1. m_chart.ShowGrid(m_bShowGrid, TRUE);            // 显示或隐藏风格
  2. m_chart.ShowBarText(1, m_bShowText, TRUE);      // 显示或隐藏 值(顶部)
  3. m_chart.ShowLabel(m_bShowLabel, TRUE);          // 显示或隐藏 标签(底部)
  4. m_chart.ShowTooltip(m_bShowTip);                // 激活或不激活 提示工具
复制代码

还要注意ShowBarText使用时位置,0表示显示在柱形的顶部,1表示关于其他值的百分比
你也可以使网格改变成默认.在默认的情况下网格填充图背景且垂直和水平线交错,改变这种网络可以使用SetGridLine函数.
  1. SetGridLines(
  2. int nHorLineCount,      // 水平线的数量 0 = 默认
  3. int nVerLineCount,      // 垂直线的数量, 0 = 默认
  4. BOOL bFixedSize,        // 如果这个值为TRUE前面两参数失效
  5. int nFixedSize)         // 定义2线之间的距离
复制代码



//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

>缩放功能
柱形图主要使用的是StretchBlt,图形的质量不够好,因为时间问题,没有绘制图表到屏幕上
  1. m_chart.SetAutoScale(m_bScale);         // 设置图表自动缩放
  2. // 重新定义窗口到适合大小
  3. m_chart.SetWindowPos( 0, 0, 0,
  4. rcClient.Width(),
  5. rcClient.Height() , SWP_NOMOVE);
  6. m_chart.Refresh();                      // 重绘

  7. // You might also need to override OnSize of the
  8. // Parent to position the chart, so it is always at the size you like
复制代码


>删除柱形图
你可以使用RemoveAt和RemoveAll来删除一个或者全部
  1. m_chart.RemoveAt(nRemIndex);    // 删除一个
  2. m_chart.RemoveAll();            // 删除全部

  3. 保存成Bitmap文件
  4.         使用SaveToFile保存位图文件,接受一个参数,默认为空.如果为空,就会提示输入文件路径对话框.如果返回False,说明保存失败.使用GetLastErrorMessage来获得失败原因
  5. // 保存
  6. if (!m_chart.SaveToFile())
  7.     {
  8.     AfxMessageBox(m_chart.GetLastErrorMessage());
  9.     };
复制代码


>打印
使用打印的功能打印图表
因为我不态熟悉打印功能的实现,如果你有时间可以帮助查看打印的代码,如有错误,还望修正.
  1. m_chart.Print();        // 打印整个柱形图表页
复制代码


>连接数据库
有三步连接到ODBC数据库的
首先使用ReadFromDatabase连接ODBC数据库
  1. // Use this form to call a stored procedure or a query and use
  2. // result set as chart input

  3. ReadFromDatabase("DS Name", "Stored proc/Query Name", "List of all parameters",
  4.          "Bars Color", "UserName", "Password"));

  5. // Note that the query or stored procedure MUST have at least 2 columns,
  6. // First column MUST be of type char with maximum length of 50 and
  7. // Second a double. These columns will be used as input data for the chart.
复制代码


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////


第二是用于连接到一个表
  1. m_chart.ReadFromDatabase("DS Name", "Table name", "Filter",
  2. "Laabel column name", "dValue column name",
  3. Bars color , "username", "password");
复制代码

最后是调用这函数的例子
  1. if (!m_chart.ReadFromDatabase("CHTst", "SpChartGetSale", "1, 12",
  2.                       RGB(0, 0, 0), "hamed", "hamed"))
  3.     {
  4.         AfxMessageBox(m_chart.GetLastDatabaseErrMessage());
  5.     };
  6. or
  7. m_chart.ReadFromDatabase("CHTst", "Sales", "",
  8. "Month", "SaleRate",
  9. RGB(0, 0, 0) , "hamed", "hamed");
复制代码


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

源码及相关文档下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复





上一篇:VC编程Windows消息处理机制、阻塞试验、MessageBox、小心消息响应处理函重复调用
下一篇:C++多语言实现的一种方案
52_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-8 23:24:47 | 显示全部楼层
谢谢老师分享
37_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-9 01:17:59 | 显示全部楼层
谢谢楼主的无私奉献!!!!!!
45_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-9 08:13:42 | 显示全部楼层
感谢分享!!!!!!
59_avatar_middle
最佳答案
0 
online_vip 发表于 2014-11-9 09:22:44 | 显示全部楼层
图表控件
88_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-9 12:37:06 | 显示全部楼层
支持一下。。。
09_avatar_middle
最佳答案
0 
online_vip 发表于 2014-11-9 14:11:49 | 显示全部楼层
进步啊,不错,收藏了。
71_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-9 15:49:25 | 显示全部楼层
感谢楼主,正好需要....
46_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-9 19:08:23 | 显示全部楼层
感谢分享,学习下
59_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-10 02:25:24 | 显示全部楼层
好吧  我下载啦 呵呵
08_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-10 09:07:10 | 显示全部楼层
VC-MFC封装柱形图标控件CBarChart
37_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-10 12:46:40 | 显示全部楼层
使用方法,简单明了,不错。
41_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-10 12:52:48 | 显示全部楼层
VC-MFC封装柱形图标控件CBarChart
75_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-11 07:47:09 | 显示全部楼层
这还是不错ode··
06_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-11 09:10:15 | 显示全部楼层
谢谢楼主的无私奉献!!!!!!
40_avatar_middle
最佳答案
0 
online_vip 发表于 2014-11-11 10:33:54 | 显示全部楼层
VC-MFC封装柱形图标控件CBarChartVC-MFC封装柱形图标控件CBarChart
46_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-15 14:55:32 | 显示全部楼层
感觉很强大哦,看看先
56_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-15 20:51:24 | 显示全部楼层
谢谢楼主提供分享!
47_avatar_middle
最佳答案
0 
在线会员 发表于 2014-11-16 10:17:43 | 显示全部楼层
感谢分享!!!
87_avatar_middle
最佳答案
0 
online_vip 发表于 2014-11-16 22:58:11 | 显示全部楼层
看看什么东西
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-7-8 08:21

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表