MFC绘制直方图和饼图

简介:

转载原文:使用Win32API 编程方法编写一个程序绘制直方图和饼图

 

MFC 工程中的代码

复制代码
 void CChildView::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
//  改字体
    LOGFONT log;
    CFont font;
    log.lfHeight=0;
    log.lfEscapement=0;
    log.lfItalic=0;
    log.lfUnderline=0;
    log.lfStrikeOut=0;

//    dc.SelectObject(&font); 
    font.CreateFontIndirect(&log);
    //画笔
    CPen pen(PS_SOLID,1,RGB(0,0,0));         
    dc.SelectObject(&pen); 
//    *OldPen = dc.SelectObject(&pen);//旧画笔


    //逻辑坐标
    SetViewportOrgEx(dc,50,500,NULL);
    dc.SetMapMode(MM_LOMETRIC);//0.1毫米
   
    //纵坐标
    dc.MoveTo(0,0);
    dc.LineTo(0,1000);//高1000
    dc.LineTo(-10,980);
    dc.MoveTo(0,1000);
    dc.LineTo(10,980);
  //纵坐标循环
    CString str;
    int i;
    for(i=1;i<10;i++)
    {   str.Format("%d",i*10);
    
        dc.TextOut(-30,i*100,str);
    }
        dc.TextOut(-50,1050,"%");
    //横坐标
    dc.MoveTo(0,0);
   dc.LineTo(850,0);
    dc.LineTo(830,10);
    dc.MoveTo(850,0);
    dc.LineTo(830,-10);

    int x1,y1,x2,y2,y3,x3;
    float zhuan=0.4,ben=0.3,shuo=0.2,bo=0.1;
    int h=1000,r=400;

    
    
    //画柱子
 
    dc.SelectObject(&font);     //修改字体
    
    CRect r1(100,zhuan*h,200,0);
    CBrush br1(RGB(253,51,67));
    dc.FillRect(r1,&br1);//矩形,颜色
   dc.TextOut(130,-10,"专科");//横坐标的说明文字

    CRect r2(300,ben*h,400,0);
    CBrush br2(RGB(250,164,51));
    dc.FillRect(r2,&br2);
    dc.TextOut(330,-10,"本科");

    CRect r3(500,shuo*h,600,0);
    CBrush br3(RGB(139,197,51));
    dc.FillRect(r3,&br3);
    dc.TextOut(530,-10,"硕士");

    CRect r4(700,bo*h,800,0);
    CBrush br4(RGB(3,141,216));
    dc.FillRect(r4,&br4);
    dc.TextOut(730,-10,"博士");


//    dc.SetBkColor(RGB(0,0,0));
//    dc.Rectangle(100,zhuan*h,200,0);
//    dc.Rectangle(300,ben*h,400,0);
//    dc.Rectangle(500,shuo*h,600,0);
//    dc.Rectangle(700,bo*h,800,0);
    
    //画饼图,利用cos,sin函数计算顶点值,颜色沿用之前已经定义了的brush
    dc.SelectObject(&br1);
    x1=int(r*cos(zhuan*3.14*2))+1400;
    y1=int(r*sin(zhuan*3.14*2)+400);
  dc.Pie(1000,800,1800,0,1800,400,x1,y1);


    dc.SelectObject(&br2);
    x2=int(r*cos((ben+zhuan)*3.14*2))+1400;
    y2=int(r*sin((ben+zhuan)*3.14*2))+400;
    dc.Pie(1000,800,1800,0,x1,y1,x2,y2);

    dc.SelectObject(&br3);
    x3=int(r*cos((ben+zhuan+shuo)*3.14*2))+1400;
    y3=int(r*sin((ben+zhuan+shuo)*3.14*2))+400;
    dc.Pie(1000,800,1800,0,x2,y2,x3,y3);
    CBrush   br9(RGB(125,30,227));
    dc.SelectObject(&br9);

    dc.SelectObject(&br4);
    dc.Pie(1000,800,1800,0,x3,y3,1800,400); 

    //在园外右上角画图例,加上说明文字
   CRect r5(2000,1000,2080,1060);
    dc.FillRect(r5,&br1);
    dc.TextOut(2100,1040,"专科");

    CRect r6(2000,900,2080,960);
    dc.FillRect(r6,&br2);
    dc.TextOut(2100,940,"本科");

    CRect r7(2000,800,2080,860);
    dc.FillRect(r7,&br3);
    dc.TextOut(2100,840,"硕士");

    CRect r8(2000,700,2080,760);
    dc.FillRect(r8,&br4);
    dc.TextOut(2100,740,"博士");

    // TODO: Add your message handler code here
    
    // Do not call CWnd::OnPaint() for painting messages
}
复制代码

 

PS:

CPaintDCCClientDC的区别

  CPaintDC类是CDC类的一个派生类,一般用在响应WM_PAINT消息的函数OnPaint()中。如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使用CDC类的成员函数完成视图客户区中的图形绘制操作。

  CClientDC类也是CDC类的派生类。它只能在窗口的客户区(即窗口中除了边框、标题栏、菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角。

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。





    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/4911321.html,如需转载请自行联系原作者


相关文章
|
4月前
|
安全 数据安全/隐私保护 虚拟化
Windows Server 2022 中文版、英文版下载 (2025 年 8 月更新)
Windows Server 2022 中文版、英文版下载 (2025 年 8 月更新)
789 3
Windows Server 2022 中文版、英文版下载 (2025 年 8 月更新)
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
22046 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
3263 0
|
安全 数据库 数据安全/隐私保护
|
8月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
325 12
|
10月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
人工智能 前端开发 云计算
本地搭建AI服务器
本地搭建AI服务器
1290 1
|
10月前
|
人工智能 C# C++
在 Visual Studio 上体验腾讯云 AI 代码助手
本文介绍如何在 Visual Studio 2022 中安装和使用腾讯云 AI 代码助手。首先,通过扩展管理器搜索并安装插件,重启 VS 完成安装。接着,在工具栏的“工具”中找到并启动助手,快捷键为 ALT + T。测试时输入问题如冒泡排序,助手会生成 C# 代码并可直接运行。建议优化默认代码语言为 C#、增加代码插入功能,并统一显示位置以提升用户体验。
526 1
|
网络协议 安全 JavaScript
Web实时通信的学习之旅:WebSocket入门指南及示例演示
Web实时通信的学习之旅:WebSocket入门指南及示例演示
2272 0
|
算法 程序员 数据处理
SSE - 多媒体编程中的利器 - SSE指令集简介和C代码示例
本文介绍了SSE(Stream SIMD Extensions)指令集在多媒体处理中的应用,它能提升浮点运算性能,尤其适合处理大量数据。SSE允许一次处理4个32位浮点数,提高效率。文中通过示例展示了如何在C++中集成SSE,比如使用`__m128`数据类型和`_mm_set_ps1()`等函数优化浮点数放大算法。测试结果显示,使用SSE优化后的算法比未优化版本快约3倍,强调了SSE在高效处理多媒体数据中的价值。