High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件
MFC调用word制作表格
MFC/VC++调用word进行报表制作使用word进行数据报告的制作可谓非常方便,word具有非常强大的编辑、排版功能。
使用word能够制作出内容丰富、样式精美的报告。
我们在工作中当然会有报表报告的需求,如果能够在MFC/VC++里面能够调用word进行word格式报告的自动生成,岂不是一件非常惬意的事情。
我在工作当中需要对大量的数据或者各种测试数据进行统计分析,最终的统计分析结果总归要汇总为一份报告,不管是内部使用也好还是外部提供给客户也好,一份内容翔实、格式精美的报告自然必不可少。
我对MFC/VC++也不是高手,只是业余爱好自己动动手做些东西。
自然,低于VC操作word可谓完全没有经验,在网络上面也查找了很多资料,都是些只言片语,不能真正的领略通过VC使用word的方法。
于是自己摸索了几个礼拜,可谓耗时甚长,劳心劳力啊。
MS的东西,封装的也太严实了,对于函数部分只有些许的简单介绍,往往看的云里雾里。
没有实践还是不行啊!体会自己的经历,虽然辛苦但也有收获。
不想其他朋友再继续走我走过的路,浪费时间、精力,故成文以共享。
废话少说,进入正题吧。
第一步,当然我们需要首先导入word需要的库。
通过ClassWizard->Add Class选择From a Type Library…定位需要的库文件导入。
本例应该使用C:"Program Files"Microsoft Office"OFFICE11"MSWORD.OLB,在这里尽可选择所有的类导入,反正用的时候都有了,呵呵。
完成这一步,我们得到两个文件msword.h和msword.cpp,那就加入你的工程吧。
说明:如果需要在VC++/MFC开发程序操作word/excel等office 元素,那么需要对必要的类型库进行导入.下面是office系列的类型库参考,导入类型库时候请选择正确的类型库进行导入.应用程序类型库Microsoft Access 97Microsoft Binder 97 Microsoft Excel 97 Microsoft Graph 97 Microsoft Office 97 MsoMicrosoft Outlook 97 Microsoft PowerPoint 97 Microsoft Word 97 Microsoft Access 2000Microsoft Binder 2000 Microsoft Excel 2000 Microsoft Graph 2000 Microsoft Office 2000 Microsoft Outlook 2000 Microsoft PowerPoint 2000 Microsoft Word 2000 Microsoft Access 2002 Microsoft Excel 2002 Microsoft Graph 2002Microsoft Office 2002Microsoft Outlook 2002 Microsoft PowerPoint 2002 Microsoft Word 2002Microsoft Office Access 2003 Microsoft Office Excel 2003 Microsoft Office Graph 2003 Microsoft Office 2003Microsoft Office Outlook 2003 Microsoft Office PowerPoint 2003 Microsoft Office Word 2003注意:这些类型库的默认位置是:Office 版本路径Office 97C:"Program Files"Microsoft Office"OfficeOffice 2000C:"Program Files"Microsoft Office"OfficeOffice XPC:"Program Files"Microsoft Office"Office10Office 2003C:"Program Files"Microsoft Office"Office11Dao350.dll 和Dao360.dll 的默认位置是C:"Program Files"Common Files"Microsoft Shared"Dao。
HighspeedChartingControlMFC绘制图表折线图饼图柱形图控件
H i g h s p e e d C h a r t i n g C o n t r o l M F C绘制图表折线图饼图柱形图控件The latest revision on November 22, 2020High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
MFC画图程序步骤
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
MFC编程绘图概述
2.2 MFC中基本类简介
应用程序体系结构类
–应用程序体系结构类主要包括与命令相关的类:窗口应 用程序类、文档/视图类和线程基类等。 – 1、命令相关类:CCmdTarget类 • 它是MFC库中所有具有消息映射属性的类的基类。 • 它 派 生 出 : 如 窗 口 类 ( CWnd ) 、 应 用 程 序 类 ( CWinApp )、文档模板类( CDocTemplate )、文 档类(CDocument)、视图类(CView)及框架窗口 类(CFrameWnd)等。 –2、窗口应用程序类:CWinApp类 • 每个应用程序只有一个应用程序对象。应用程序对象 的类是从CWinApp类派生出来的。
2.2 MFC中基本类简介
应用程序体系结构类
– 6、设备描述表类:CDC类
•
•
•
• •
该类及其派生类支持设备描述表对象。CDC类是一个较大的类, 包括许多成员函数,如映像函数、绘画工具函数、区域函数等, 通过这些成员函数可以完成所有的绘画工作。 CPaintDC:显示描述表类。用于窗口类的OnPaint成员函数和 视图类的OnDraw成员函数中,自动调用BeginPaint进行构造, 调用EndPaint进行析构。 CClientDC:窗口客户的显示描述表类。例如,用于在快速响 应.鼠标事件时进行绘画。 CWindowDC:整个窗口的显示描述表类,包括客户区和框架区。 CMetaFileDC:Windows 元文件的设备描述表类。Windows元文 件包含一个图形设备接口(GDD命令序列,该序列可被重新执行 而创建一幅图像。对CMetaFileDC的成员函数的调用记录在一个 元文件中。
CWinApp CExam3_1App
CMainFrame CView
MFC曲线绘制-推荐下载
1.使用控件工具栏为对话框添加所需控件,并设置控件属性;使用界面 布局工具栏调整控件布局,完成应用程序界面设计。 2.创建对话框成员变量和成员函数,编写代码。 3.编译、调试程序;运行程序,并对程序功能进行测试。
四.测试数据及运行结果
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电通,力1根保过据护管生高线产中0不工资仅艺料可高试以中卷解资配决料置吊试技顶卷术层要是配求指置,机不对组规电在范气进高设行中备继资进电料行保试空护卷载高问与中题带资2负料2,荷试而下卷且高总可中体保资配障料置2试时32卷,3各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并25工且52作尽22下可护都能1关可地于以缩管正小路常故高工障中作高资;中料对资试于料卷继试连电卷接保破管护坏口进范处行围理整,高核或中对者资定对料值某试,些卷审异弯核常扁与高度校中固对资定图料盒纸试位,卷置编工.写况保复进护杂行层设自防备动腐与处跨装理接置,地高尤线中其弯资要曲料避半试免径卷错标调误高试高等方中,案资要,料求编试技5写、卷术重电保交要气护底设设装。备备置管4高调、动线中试电作敷资高气,设料中课并技3试资件且、术卷料中拒管试试调绝路包验卷试动敷含方技作设线案术,技槽以来术、及避管系免架统不等启必多动要项方高方案中式;资,对料为整试解套卷决启突高动然中过停语程机文中。电高因气中此课资,件料电中试力管卷高壁电中薄气资、设料接备试口进卷不行保严调护等试装问工置题作调,并试合且技理进术利行,用过要管关求线运电敷行力设高保技中护术资装。料置线试做缆卷到敷技准设术确原指灵则导活:。。在对对分于于线调差盒试动处过保,程护当中装不高置同中高电资中压料资回试料路卷试交技卷叉术调时问试,题技应,术采作是用为指金调发属试电隔人机板员一进,变行需压隔要器开在组处事在理前发;掌生同握内一图部线纸故槽资障内料时,、,强设需电备要回制进路造行须厂外同家部时出电切具源断高高习中中题资资电料料源试试,卷卷线试切缆验除敷报从设告而完与采毕相用,关高要技中进术资行资料检料试查,卷和并主检且要测了保处解护理现装。场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
实验四 MFC图形绘制编程实验
实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "tpd1.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。
MFC 一个简单的绘图程序
MFC 一个简单的绘图程序涉及到的知识点:1. 鼠标信息的处理,2. 文档和视图的关系,3. 新建一个类及其使用方法的技巧,4. 改变窗口大小或者刷新窗口后原来所绘制的图形没有显示出来的问题。
绘制图形的原理:鼠标被用作画笔,绘图过程中要进行不同的鼠标消息的处理,如按下鼠标,移动鼠标和释放鼠标。
当用户按下鼠标左键是必须记录鼠标当前的位置,并捕获鼠标,设置光标形状;当移动鼠标时,先判断鼠标左键是否同时被按住,如果是则从上一个鼠标位置到当前鼠标位置绘制一条直线。
并保存当前鼠标位置点,供绘制下一段直线用,当释放鼠标左键时将鼠标释放给系统。
一、简单绘图程序程序的实现1.使用MFC AppWizard 应用程序向导创建一个SDI应用程序MyDraw,在视图类CMyDrawView.h中添加如下代码:protected: // create from serialization onlyCMyDrawView();DECLARE_DYNCREATE(CMyDrawView)CPoint m_ptOrigin; //起始点坐标bool m_bDragging; //鼠标是否处于拖拽状态标记HCURSOR m_hCross;//拖拽状态时鼠标的样式2. 在构造函数中对拖拽标记和鼠标样式进行初始化CMyDrawView::CMyDrawView(){// TODO: add construction code herem_bDragging=false;//初始化为falsem_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//十字光标}3. 使用类向导为视图类添加按下鼠标左键,移动鼠标,释放鼠标左键的消息处理函数。
代码分别为:void CMyDrawView::OnLButtonDown(UINT nFlags, CPoint point) //按下鼠标左键{// TODO: Add your message handler code here and/or call default SetCapture();::SetCursor(m_hCross);m_ptOrigin=point;m_bDragging=true;CView::OnLButtonDown(nFlags, point);}void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) //释放鼠标左键{ // TODO: Add your message handler code here and/or calldefault if(m_bDragging){m_bDragging=false;ReleaseCapture();}CView::OnLButtonUp(nFlags, point);}void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) //移动鼠标{// TODO: Add your message handler code here and/or callif(m_bDragging){//CMyDrawDoc * pDoc=GetDocument();//ASSERT_VALID(pDoc);//pDoc->AddLine(m_ptOrigin,point);CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags, point);}4.在MyDraw.CPP中设置窗口标题m_pMainWnd->SetWindowText("简单的绘图程序");此后,编译、链接,运行程序后可以将鼠标当作一个画笔绘制曲线了。
MFC画图的基本方法
MFC画图的基本方法1.画笔类,CPen,创建画笔类的对象后,需要调用CreatePen(......)函数创建画笔。
然后将其选入设备描述表中。
pDC->SelectObject(.......);2.设置起点坐标。
在这里调用一个函数来设置坐标原点。
pDC->SetViewportOrg(100,255);3.调用LineTo(point),MoveTo(Point)函数画图。
4.删除创建的画笔对象。
pen.DeleteObject();以下是今天所写的画正弦函数的图像。
创建一个单文档的应用程序。
并且在VIEW类中的OnDraw(。
)函数里面做消息响应。
由于调用了sin()函数,所以要把math.h头文件包含进来。
#include "math.h"void CDrawSinXView::OnDraw(CDC* pDC){CDrawSinXDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen pen_Zuobixi,pen_sinx;pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));pDC->SelectObject(&pen_Zuobixi);//指定原点pDC->SetViewportOrg(100,255);pDC->SetTextColor(RGB(255,0,0));//绘制横坐标CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};int n=-1;int nTemp=0;while (nTemp<=660){pDC->LineTo(60*n,0);pDC->LineTo(60*n,-5);pDC->MoveTo(60*n,0);pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);n++;nTemp +=60;}pDC->MoveTo(0,0);CString strTemp;//绘制纵坐标for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60) {pDC->LineTo(0,60*n);pDC->LineTo(5,60*n);pDC->MoveTo(0,60*n);strTemp.Format("%d",-n);pDC->TextOut(10,60*n,strTemp);}double y,radian;pDC->SelectObject(&pen_sinx);for(int x=-60;x<600;x++){//弧度=X坐标/曲线宽度*角系数*π//Y坐标=振幅*曲线宽度*sin(弧度)radian =x/((double)60*2)*PI;y=sin(radian)*2*60;pDC->MoveTo((int)x,(int)y);pDC->LineTo((int)x,(int)y);}pen_sinx.DeleteObject();。
MFC中MSChart的使用示例
MFC中MSChart的使用示例最近由于工作的原因,接触了一些MSChart的东西。
在查看的资料的时候发现,网上很多资料是关于在VB和C#中利用MSChart实现图表的绘制,但关于在MFC中利用MSChart 实现图表绘制的资料甚少,因此在做的过程中遇到了很多问题,下面对MFC中使用MSChart 进行简单的小结:1.添加MSChart点击VS中的“工具-选择工具箱-COM组件”,找到Microsoft Chart Control,version 6.0(OLEDB)并勾选(注:如果COM组件中不存在该项,便可自行安装,从网上下载MSChart.exe 和MSCHART20.OCX。
首先安装MSChart.exe,然后注册MSCHART20.OCX,如果是win7下要用管理方式运行注册,方可成功)。
如下所示:2.在对话框中添加MSChart控件这个比较简单,在此不再赘述,如下所示:3.属性设置MSChart控件的属性及说明如下,可根据需要自行设置。
ChartAreas:增加多个绘图区域,每个绘图区域包含独立的图表组、数据源,用于多个图表类型在一个绘图区不兼容时。
AlignmentOrientation:图表区对齐方向,定义两个绘图区域间的对齐方式。
AlignmentStyle:图表区对齐类型,定义图表间用以对其的元素。
AlignWithChartArea:参照对齐的绘图区名称。
InnerPlotPosition:图表在绘图区内的位置属性。
Auto:是否自动对齐。
Height:图表在绘图区内的高度(百分比,取值在0-100 )Width:图表在绘图区内的宽度(百分比,取值在0-100 )X,Y:图表在绘图区内左上角坐标Position:绘图区位置属性,同InnerPlotPosition。
Name:绘图区名称。
Axis:坐标轴集合Title:坐标轴标题TitleAlignment:坐标轴标题对齐方式Interval:轴刻度间隔大小IntervalOffset:轴刻度偏移量大小MinorGrid:次要辅助线MinorTickMark:次要刻度线MajorGrid:主要辅助线MajorTickMark:主要刻度线DataSourceID:MSChart的数据源。
MFC中简单绘图控制
MFC中简单绘图控制首先建立Graphic2单文档应用程序,在菜单栏帮助菜单后面,新建名为绘图的菜单项,并在其下面新建四个子菜单:IDM_DOT点, IDM_LINE直线,IDM_RECTANGLE矩形, IDM_ELLIPSE椭圆,并在视类中添加其对应的响应函数。
同时添加一变量:private: int m_pt用以标志用户的选择。
点:m_pt=1;直线:m_pt=2,矩形:m_pt=3;椭圆:m_pt=4。
再添加鼠标左键按下和弹起响应函数。
再添加一成员变量,用以保存左键按下时的坐标:private:CPoint m_ptOrigin;void CGraphic2View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_ptOrigin=point;CView::OnLButtonDown(nFlags, point);}void CGraphic2View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CClientDC dc(this);CPen pen;//设定画笔pen.CreatePen(PS_SOLID,2,RGB(255,0,0));CPen *pOldpen=dc.SelectObject(&pen);CBrush*Brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//设定透明画刷CBrush *pOldBrush=dc.SelectObject(Brush);switch(m_pt){case 1:dc.SetPixel(point,RGB(255,0,0));break;case 2:dc.MoveTo(m_ptOrigin);dc.LineTo(point.x,point.y);break;case 3:dc.Rectangle(CRect(m_ptOrigin,point));break;case 4:dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);break;}dc.SelectObject(&pOldpen);dc.SelectObject(&pOldBrush);CView::OnLButtonUp(nFlags, point);}CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush::FromHa ndle:Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.这个函数的意义是将从windows返回的HBrush句柄转换成一个CBrush的指针,这里有一个问题那就是GetStockObject返回的句柄不是HBrush 的,而是HGDIOBJ的,因此我们还需要进行强制转化.改变线宽:首先新建一对话框:ID=IDM_DLG_SETTING;caption=setting;添加一静态文本:caption=线宽;添加一编辑框:ID=IDM_LINE_WIDTH.建立一个与对话框对应的类,类名为CSettingDlg。
【计算机图形学课程】一.MFC基本绘图函数使用方法
【计算机图形学课程】⼀.MFC基本绘图函数使⽤⽅法这是最近我《计算机图形学》课程实践编程课介绍的相关知识,主要是想通过MFC C++绘图,让学⽣体会下图形学相关的编程及简单的图形绘制,同时⾮常佩服学⽣的想象⼒,他们做得真的不错。
希望这篇基础⽂章对你有所帮助吧!尤其是有这门课程的学⽣或编程爱好者,如果⽂章存在错误或不⾜之处,还请海涵。
参考书籍:孔令德·《计算机图形学基础教程(Visual C++版)》学⽣绘制的图形还是⾮常有创新的,表⽰很满意,哈哈哈~⼀. MFC绘图基础知识 CDC类PS:这部分主要引⼊孔令德⽼师的知识,这篇⽂章以后⾯的编程为主。
VC++具有强⼤的绘图功能,虽然基于对话框的应⽤我推荐⼤家使⽤C# Winform程序,但是计算机图形和图像的基础知识,还是强烈推荐使⽤VC++ MFC实现。
这有助于让你深⼊的理解图形变换、图像处理等知识。
在Windows平台下,GDI(Graphics Device Interface)图形设备接⼝被抽象为上下⽂CDC类(Device Context,DC)。
Windows平台直接接收图形数据信息的不是显⽰器和打印机等硬件设备,⽽是CDC对象。
MFC中,CDC类定义设备上下⽂对象的基类,封装了所需的成员函数,调⽤CDC类的成员函数,绘制和打印图形及⽂字。
CDC类派⽣出CClientDC类、CMetaFileDC类、CPaintDC类和CWindowDC类,请读者⾃⾏学习,同时推荐阅读原书。
MFC常⽤CPoint、CRect、CSize等数据类型。
(1) CPoint类:存放点坐标(x,y);(2) CRect类:存放矩形左上顶点和右下⾓顶点的坐标(top、left、right、bottom),其中(top,left)为矩形的左上⾓点,(right,bottom)为矩形的右下⾓点;(3) CSzie类:存放矩形的宽度和⾼度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的⾼度。
High-speed Charting Control--MFC绘制图表控件
High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
mfc画曲线
MFC工程画线本文借鉴以下程序:鼠标响应关键就是对两个函数进行操作:OnLButtonDown和OnLButtonUp;1、使用MFC AppWizard(exe)建立一个单文档MFC工程2、首先要在CxxxView类的定义里加上后续必备的数据成员class CDrawView : public CView{。
private:CPoint m_ptOrigin; //用来记录鼠标按下时的点BOOL m_bDraw; //鼠标按下的标志,用来判断鼠标弹起来了没有CPoint m_ptOld; //用来记录鼠标的移动路劲};void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) //鼠标按下{MessageBox("Haibara Ai"); //鼠标一按下就会送出消息(以对话框形式)m_ptOrigin=m_ptOld=point; //将当前鼠标按下的位置用m_ptOrigin记录m_bDraw=TRUE; //将鼠标按下标志置为TURECView::OnLButtonDown(nFlags, point); //函数自调用,循环检测。
nFlags 表示控制键状态//(包括ctrl,shift,鼠标左、中、右共5个键的状态)//point表示鼠标坐标。
(相对于当前窗口而言的坐标)}void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) //鼠标弹起{//鼠标画直线方式一HDC hdc; //先定义一个HDC对象:Handler to a device context(DC),指向一个DC(设备描述表)的句柄hdc=::GetDC(m_hWnd);//“::”用全局的函数(即SDK中的函数)MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //由原点(0,0)移动到起点(即鼠标按下点)LineTo(hdc,point.x,point.y); //由当前位置移动到坐标点(x,y)(即鼠标弹起点); ::ReleaseDC(m_hWnd,hdc); //释放DC//鼠标画直线方式二CWnd::GetDCCDC* GetDC( );Return ValueIdentifies the device context for the CWnd client area if successful; otherwise, the return value is NULL. The pointer may be temporary and should not be stored for later use.CDC *pDC=GetDC(); //获取一个CDC类对象的指针pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);//鼠标画直线方式三// CClientDC dc(this); //在客户区画直线CClientDC dc(GetParent()); //在框架窗口上画直线dc.MoveTo(m_ptOrigin);dc.LineTo(point);//鼠标画直线方式四// CWindowDC dc(this); //在客户区画直线// CWindowDC dc(GetParent()); //在框架窗口上画直线CWindowDC dc(GetDesktopWindow()); //在整个桌面面板上画直线dc.MoveTo(m_ptOrigin);dc.LineTo(point);//鼠标画直线方式五(画笔)CPen pen(PS_SOLID,20,RGB(255,0,0)); //创建一个笔(CPen类封装了跟画笔相关的操作)//(线型,线粗,线色)CClientDC dc(this); //创建一个DCCPen *pOldPen=dc.SelectObject(&pen); //将笔选到设备描述表中dc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);//鼠标响应画矩形(画刷)CBrush brush(RGB(255,0,0)); //创建画刷,红色CClientDC dc(this); //创建一个dcdc.FillRect(CRect(m_ptOrigin,point),&brush); //用一个指定画刷填充一个指定的区域,//第一个参数用于设定这个区域,用画线时保存下来的起点和终点来设定这个区域//运行结果是:我们的dc在用我们所创建的红色的画刷去填充了一块矩形的区域//用位图对象填充鼠标画出的矩形框图CBitmap bitmap; //首先定义一个位图bitmap.LoadBitmap(IDB_BITMAP1); //用资源的ID加载这个位图CBrush brush(&bitmap); //有了这个位图之后,就可以创建这个位图的画刷,形参为这个位图对象的指针CClientDC dc(this); //然后创建一个dcdc.FillRect(CRect(m_ptOrigin,point),&brush); //用这个指定的画刷(位图画刷)去填充一块矩形区///////////////////////////////////////////////////////////////创建透明画刷,即空画刷 /////////////////////////////////////////////////////////////////////CClientDC dc(this);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//注意这里,GetStockObject函数返回的是一个HGDIOBJ//的一个句柄,需要用强制转换将其转换为画刷的句柄//(HBRUSH)GetStockObject(NULL_BRUSH)//FromHandle是CBrush类的静态成员函数(见MSDN),所以可以直接由类名调用CBrush *pOldBrush=dc.SelectObject(pBrush); //将画刷选到我们的设备描述表中,//用空画刷去替换我们先前的画刷(缺省画刷、默认画刷)dc.Rectangle(CRect(m_ptOrigin,point)); //DC当中用来画矩形矩形的一个函数dc.SelectObject(pOldBrush); //回到画刷替换前的默认画刷m_bDraw=FALSE; //鼠标弹起标志,将m_bDraw置为FALSECView::OnLButtonUp(nFlags, point);}//鼠标移动响应函数,应用在画曲线方面void CDrawView::OnMouseMove(UINT nFlags, CPoint point) //point为函数获取的当前鼠标所在位置的坐标//它会鼠标的移动而不断改变值{CClientDC dc(this); //创建一个DC,指向当前窗口(客户区)dc.SetROP2(R2_BLACK); //设置绘画模式CPen pen(PS_SOLID,1,RGB(255,0,0)); //设置画笔(线型、线宽、线颜色)CPen *pOldPen=dc.SelectObject(&pen); //将画笔选到设备描述表中if(m_bDraw==TRUE){//////////////////////////画曲线dc.MoveTo(m_ptOrigin); //移动到起始点dc.LineTo(point); //画线到,注意这里的每一次画线都是很短的。
mfc绘图程序上机步骤
mfc绘图程序上机步骤首先生成MFC程序空框架空框架中的每个类的职责是什么要自己理解清楚第一次课:1.定义自己的数据类CLine直线类,用于绘图点击菜单:插入—类选择Generic class,输入类名,每个类都是分成两个文件.h 中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现classCLine{int x1,y1,x2,y2;public:CLine(int a=0,int b=0,int c=0,int d=0);virtual ~CLine();int Getx1();int Gety1();int Getx2();int Gety2();void SetPoint1(intx,int y);很多函数是在后面使用中发现问题逐渐添加的void SetPoint2(intx,int y);};2.自定义的类要作为数据成员出现在Doc类中classCSmallCADDoc : public CDocument{protected: // create from serialization onlyCSmallCADDoc();DECLARE_DYNCREATE(CSmallCADDoc)// Attributespublic:CLine line1; //数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。
你也可以定义成私有,再定义一个Get函数间接访问,取他的值3.注意:添加了这个数据成员后,需要增加几个#include “Line.h”语句添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include “。
”语句此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。
所以,凡是包含了#include “SmallCADDoc.h”的地方都要在前面添加#include “Line.h”语句。
MFC经典绘图方法总结
MFC经典绘图方法总结Windows 绘图的实质就是利用windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。
为了支持GDI绘图,MFC提供了两种重要的类:设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。
CDC类介绍:在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类CClientDC 客户区设备上下文,绘制客户区时CPaintDC 一般发生在窗口需要重绘时CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。
CDC包含m_hDC和m_hAttribDC二个设备上下文。
CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。
CDC对象的重要函数如下:1、为指定设备创建上下文virtual BOOL CreateDC(...)比如创建一个为屏幕的设备上下文CDC dc;dc.CreateDC("DISPLAY", NULL, NULL,NULL);2、创建内存设备上下文,与指定设备上下文兼容virtual BOOL CreateCompatibleDC( CDC * pDC)3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序virtual BOOL DeleteDC();4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle( hDC )5、选择GDI对象入选到设备上下文中,一共有五种形式:CPen * SelectObject( CPen * pPen) ;CBrush * SelectObject( CBrush * pBrush) ;virtual CFont * SelectObject( CFont * pFont) ;CBitmap * SelectObject( CBitmap * pBitmap) ;int SelectObject( CRgn * pRgn) ;例:Cpen cpen;pen.CreatePen( PS_SOLID, 2, RGB(255,0,0) );Cpen *pOldPen=(CPen*)pDC->SelectObject(&pen); //设置新画笔,记录旧画笔....pDC->SelectObject(pOldPen); //还原画笔三种方法创建画笔1/构造函数:CPen();CPen( int nPenStyle, int nWidth, COLORREF crColor );CPen(...)略2/CreatePen( int nPenStyle, int nWidth, COLORREF crColor )3/CreatePenIndirect( LPLOGPEN lpLogpen )typedef struct tagLOGPEN{UINT lopnStyle;POINT lopnWidth;COLORREF lopnColor;}LOGPEN, *LPLOGPEN;例:LOGPEN lppn;lppn.lopnColor=RGB(255,0,0);lppn.lopnStype=PS_DASHDOT;lgpn.lopnWidth.x=2;lgpn.lopnWidth.y=2;CPen pen;pen.CreatePenIndirect( &lppn );画刷三种方法创建1/构造函数:CBrush();CBrush(COLROREF crColor);CBrush(int nIndex, COLORREF crColor);nIndex 哪种类型的网格, HS_BDIAGONAL HS_CROSSHS_VERTICAL HS_HORIZONTAL2/CreateSolidBrush( COLORREF crColor);3/CreateHatchBrush( int nIndex , COLORREF crColor );4/CreateBrushIndirect( const LOGBRUSH* lpLogBrush );typedef struct tagBRUSH{UINT lbStyle; // BS_HA TCHED, BS_SOLID , BS_NULLCOLORREF lopnColor;LONG lbHatch; //HS_BDIAGONAL HS_CROSS HS_VERTICAL HS_HORIZONTAL}LOGBRUSH, *LPLOGBURSH;例:CRect Rect(0,0,200,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle(Rect);pDC->SelectObject( pOldBursh);图形绘制1.点绘制//返回RGB值COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor);//返回BOOL值,绘制是否成功.BOOL SetPixelV(int x, int y, COLORREF crColor);BOOL SetPixelV(POINT point, COLORREF crColor);2.直线绘制//返回CPoint对象的x和y坐标的前一次取值CPoint MoveTo(int x, int y);CPoint MoveTo(POINT point);//返回绘制是否成功BOOL MoveTo(int x, int y);BOOL MoveTo(POINT point);例:CPen pen;pen.CreatePen(PS_SOLID,2,RGB(0,255,0));CPen* oldPen =(CPen *)pDC->SelectObject(&pen);CPoint oldPoint=pDC->MoveTo(600,300);pDC->LineTo(500,500);3.矩形绘制1/矩形绘制BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPRECT lpRect);例:pDC->SelectObject( oldPen);pDC->Rectangle(0,0,600,300);CRect Rect(0,0,300,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle( &Rect );pDC->SelectObject( pOldBursh);例:CPen pen;pen.CreatePen(PS_DASH, 1,RGB(255,0,0));LOGBRUSH lb;memset( &lb,0, sizeof(lb));lb.lbStyle=BS_HATCHED;lb.lbHatch=HS_DIAGCROSS;CBrush brush;brush.CreateBrushIndirect( &lb);CPen *pOldPen=(CPen *)pDC->SelectObject( & pen);CBrush *pOldBrush=(CBrush*)pDC->SelectObject(&brush);pDC->Rectangle(0,0,200,200);pDC->SelectObject( pOldPen);pDC->SelectObject( pOldBrush);2/三维矩形线框绘制void Draw3dRect(int x, int y, int cx, int cy , COLORREF clrTopLeft, COLORBEF clrBottomRight );void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORBEF clrBottomRight );例:pDC->Draw3dRect(100, 100, 200, 300, RGB(255,0,0), RGB(0,255,0));3/表示焦点风格矩形void DrawFocusRect( LPCRECT lpRect);例:CRect rt( 400,400, 450, 450);pDC->DrawFocusRect( &rt);4/绘制拖曳形线框void DrawDragRect(LPCRECT lpRect , SIZE size LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush=NULL , CBrush* pBrushLast=NULL);5/圆角矩形void RoundRect(LPCRECT lpRect , POINT point); //point.x 椭圆宽, point.y 椭圆高void RoundRect(int x1, int y1, int x2, int y2, int x3, int y3 );例:pDC->RoundRect(250, 250, 400, 400, 50, 100);4.椭圆绘制BOOL Ellipse( LPCRECT lpRect ) //椭圆的外接矩形范围文字绘制TextOut函数返回值是BOOLBOOL TextOut( int x, int y, const CString & str );virtual BOOL TextOut(int x, int y, LPCSTR lpszString, int nCount);DrawText函数返回值是文本高度int DrawText ( LPCSTR lpszString, int nCount, LPRECT lpRect, UNIT nFormat);int DrawText ( const CString& str, LPRECT lpRect, UNIT nFormat); //DT_BOTTOM DT_LEFT...//注意:如果nFormat 参数指定了DT_CALCRECT标志,由lpRect指定的矩形将会更新,以反映显示文本需要的高度和宽度,但并不绘制显示文字背景色和前景色virtual COLORREF SetBKColor( COLORREF crColor);int SetBKMode( int nBKMode); // nBKMode: OPAQUE, TRANSPARENT时,SetBKColor失效例:CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect,RGB(0,0,255));CString strText=L"VC++ BKColor Demo...";pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(10,10,strText);文字字体设置文字的字体会使用到MFC下的CFont类,然后调用CFont类下的四个成员函数: CreateFont, CreateFontIndirect, CreatePointFont和CreatePointFontIndirect,详见msdn帮助例:1/CreateFont 函数CFont font;font.CreateFont(25,0,1800,0,FW_BOLD,1,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,L"Courier New");CString strText=L"VC++ Font Demo...";pDC->SetTextColor( RGB(255,0,0));CFont *pOldFont=(CFont*)pDC->SelectObject(&font);pDC->TextOut(210,210, strText);pDC->SelectObject(pOldFont);2/ CreateFontIndirect(const LOGFONT* lpLogFont);typedef struct tagLOGFONT{//14个成员变量与世隔绝CreateFont函数类似}LOGFONT;3/如果只注重字体的高度和字体名时,使用CreatePointFont(int nPointSize, LPCSTR lpszFaceName, CDC* pDC=NULL);位图显示A:位图介绍,CBitmap类封装了Windows图形设备接口中的位图,并提供了操作位图的成员函数1/创建兼容位图,使之与指定设备兼容.BOOL CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight);2/得到位图信息,作用是填充BITMAP结构.int GetBitmap(BITMAP * pBitMap);3/加载位图资源,加载一个命名的位图资源来初始化位图对象.BOOL LoadBitmap( LPCSTR lpszResourceName);BOOL LoadBitmap( UINT nIDResuource );B:显示位图,VC++提供BitBlt, StretchBlt和TransparentBit(需加入msimg32.lib库) 1/ BOOL BitBlt(int x , int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );//尺寸不变2/ BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC,int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop); //支持缩放/* dwRop一般设置为SRCCOPY */3/ BOOL TransparentBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,HDC hdcSrc, int nXoriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);例:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITAMBOW);BITMAP bm;bitmap.GetBitmap(&bm);CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap);CRect rect(10,10, bm.bmWidth, bm.bmHeight);TransparentBlt(pDC->GetSafeHdc(), rect.left, rect.top, rect.Width()*5, rect.Height()*5, MemDC.GetSafeHdc(), 0, 0, bm.bmWidth, bm.bmHeight, RGB(0,0,0));//长宽扩大5倍,图片中黑色的部分将作为透明处理。
High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件
High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
MFC课程设计 绘制曲线
《MFC编程及应用》课程设计报告题目:绘制曲线学号:姓名:指导老师:***时间: 2013.61、设计步骤(1)工程建立建立一个单文档应用程序,命名为简单绘图,在绘制曲线的题目要求上有所扩展,除了绘制二次函数,正弦曲线,余弦曲线,还添加了直线,矩形,椭圆,圆的菜单项,另外有颜色对话框和线型对话框,用于改变颜色,线型和线宽。
响应鼠标右键消息绘制坐标轴。
(2)类中添加的变量a)CCosDialog类:编辑框视图类int m_acos acint m_bcos bcint m_ccos cc(m_acos不是必要的,用作余弦函数的系数,类型都为int形,将变量类型设为double形更好,但并无影响)。
b)CSinDialog类视图类int m_asin asint m_bsin bsint m_csin csc)CFunction类m_afunction am_bfunction bm_cfunction cd)在CLinedialog中定义了编辑框整型变量m_nlinewidth以及单选按钮变量m_nlinestyle,在视图类中分别用m_nLineWidth和m_nLineStyle接收。
e)在视图类中定义m_nDrawType,直线、矩形、椭圆、圆是分别赋值1、2、3、4,然后在鼠标消息中用switch语句分别响应。
(3)设计思想及需处理的消息的详细代码a)首先绘制坐标轴;void CMy***********View::OnRButtonDown(UINT nFlags, CPoint point){ CRect rc ;GetClientRect(&rc) ;// 获取窗口客户区的坐标CClientDC dc(this);dc.MoveTo(rc.right/4,rc.bottom/2) ;dc.LineTo(rc.right*3/4,rc.bottom/2) ;dc.MoveTo(rc.right/2,rc.bottom*2/3) ;dc.LineTo(rc.right/2,rc.bottom/3) ;//Crect类的两个数据成员,right、bottom指矩形区域右下角的横纵坐标}b)设计对话框IDD_COS,并用CCosDialog类管理,然后在菜单项下用OnCos() 函数响应;void CMy***********View::OnCos(){ CcosDialog dlg;if(dlg.DoModal()==IDOK){ this->ac=dlg.m_acos;this->bc=dlg.m_bcos;this->cc=dlg.m_ccos;CClientDC dc(this);CRect rect;this->GetClientRect (&rect);dc.SetViewportOrg (rect.CenterPoint ());/* CRect类的成员函数CenterPoint (),返回返回矩形区域中心的坐标 */CPen pen(m_nLineStyle,m_nLineWidth,m_clr);dc.SelectObject(&pen);dc.MoveTo(0,-50*ac*cos(cc));for(double x = 0,y;x <300;x+=1){ y = -50*ac*cos(bc*x/30+cc);dc.LineTo (x,y);Sleep(10);}画二次函数和正弦函数的思想与此类似,可以举一反三。
MFC绘图总结(5):设置绘图属性求索阁
MFC绘图总结(5):设置绘图属性求索阁除了映射模式外,还有许多绘图属性可以设置,如背景、绘图方式、多边形填充方式、画弧方向、刷原点等。
1.背景1)背景色当背景模式为不透明时,背景色决定线状图的空隙颜色(如虚线中的空隙、条纹刷的空隙和文字的空隙),可以使用CDC类的成员函数GetBkColor和SetBkColor来获得和设置当前的背景颜色:COLORREF GetBkColor( ) const; // 返回当前的背景色virtual COLORREF SetBkColor( COLORREF crColor ); // 返回先前的背景色// 若出错返回0x800000002)背景模式背景模式影响有空隙的线状图的空隙(如虚线中的空隙、条纹刷的空隙和文字的空隙)用什么办法填充。
可以使用CDC类的成员函数GetBkMode和SetBkMode来获得和设置当前的背景模式:int GetBkMode( ) const; // 返回当前背景模式int SetBkMode( int nBkMode ); // 返回先前背景模式背景模式的取值2. 绘图模式绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。
1)设置绘图模式可使用CDC类的成员函数SetROP2 (ROP = Raster OPeration 光栅操作)来设置绘图模式:int SetROP2( int nDrawMode );其中,nDrawMode可取值:绘图模式nDrawMode的取值其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN (异或)较常用。
2)画移动图形为了能画移动的位置标识(如十字、一字)和随鼠标移动画动态图形(如直线、矩形、椭圆),必须在不破坏原有背景图形的基础上移动这些图形。
移动图形采用的是异或画图方法,移动图形的过程为:异或画图、在原位置再异或化图(擦除)、在新位置异或画图、……。
VCmfc画坐标图
int w idth=1000;int heig ht=300;i nt m_rowX=0;i nt i;//确定坐标图四周预留的空白大小cons t int myto p=10;con st in t myb ottom=40;cons t int myle ft=60;co nst i nt my right=10;cons t int x_di stanc e=15;//确定X,Y轴每单位显示宽度f loatm_x_n um=60,m_y_num=10,m_p otY1=5,m_p otY2=100;floa t int erval X=(wi dth-m yleft-myri ght)/(m_x_num);flo at in terva lY=(h eight-mybo ttom-mytop)/(m_y_num);//确定显示刻度个数flo at bo ttomY=0;float left X=0;cons t int coun t_x=m_x_nu m/2;cons t int coun t_y=m_y_nu m;//确定每个显示刻度之间的宽度flo at sp aceX=(floa t)(wi dth-m yleft-myri ght)/count_x; f loatspace Y=(fl oat)(heigh t-myb ottom-myto p)/co unt_y;fl oat m_x_x=space X+7;//x轴pD C->Mo veTo(int(m yleft),int(heig ht-(m ybott om+(b ottom Y)*in terva lY)));pD C->Li neTo(int(w idth-myrig ht),i nt(he ight-(mybo ttom+(bott omY)*inter valY))); //Y轴从图形区域最底端到最顶端//电流坐标轴兰m_rowX = in t(myl eft+(leftX)*int erval X);CPenpen1(PS_SO LID,1,RGB(0,200,0));CPe n *pO ldPen1=pDC->Sel ectOb ject(&pen1);p DC->M oveTo(m_ro wX,in t(hei ght-m ybott om));pDC->Lin eTo(m_rowX,int(mytop));pDC->Selec tObje ct(pO ldPen1);//电流坐标轴红CPe n pen2(PS_SOLID,1,RG B(255,0,0));C Pen *pOldP en2=p DC->S elect Objec t(&pe n2);pDC->Move To(m_rowX-m_x_x,int(heigh t-myb ottom)); p DC->L ineTo(m_ro wX-m_x_x,i nt(my top));pD C->Se lectO bject(pOld Pen2);//绘制刻度和刻度值CSt ringstr;//选择字体C Fontfont;fon t.Cre ateFo nt(14,4,0,0,FW_REGUL AR,FA LSE,F ALSE,0,ANS I_CHA RSET,O UT_S TROKE_PREC IS,CLIP_DEFA ULT_P RECIS,PROO F_QUA LITY,FIXED_PITC H| F F_MOD ERN,_T("Ar ial"));C Font* def_font=pDC->Selec tObje ct(&f ont);//X轴f or(in t i=0;i<=c ount_x;i++){pDC->MoveT o(int(myle ft+sp aceX*i),in t(hei ght-(mybot tom+(botto mY)*i nterv alY)));pDC->LineT o(int(myle ft+sp aceX*i),in t(hei ght-(mybot tom+(botto mY)*i nterv alY+5)));}i nt m_initx=0;for(i=0;i<=cou nt_x;i++){ str.F ormat(_T("%d"),m_ini tx+i*2);// pD C->Te xtOut(int(mylef t+spa ceX*i-3),int(h eight-(myb ottom+(bot tomY)*inte rvalY-5)),str);}//Y轴兰CP en pe n3(PS_SOLI D,1,R GB(0,200,0));CPen*pOld Pen3=pDC->Selec tObje ct(&p en3);for(i=0;i<=co unt_y;i++){str.Forma t(_T("%.1f"),i*(m_po tY1/c ount_y));// p DC->M oveTo(m_ro wX,in t(hei ght-(mybot tom+s paceY*i))); p DC->L ineTo(m_ro wX+5,int(h eight-(myb ottom+spac eY*i))); pDC->Text Out(m_rowX-x_di stanc e, int(heig ht-(m ybott om+sp aceY*i+8)),str);}pDC->Sel ectOb ject(pOldP en3);pDC->Mov eTo(m_rowX,int(heigh t-(my botto m+spa ceY*5)));pDC->Line To(m_rowX+10,in t(hei ght-(mybot tom+s paceY*5)));pD C->Mo veTo(m_row X,int(heig ht-(m ybott om+sp aceY*8.4)));p DC->L ineTo(m_ro wX+10,int(heigh t-(my botto m+spa ceY*8.4)));st r.For mat(_T("%.1f"),4.2);pDC->Tex tOut(int(m yleft+(lef tX)*i nterv alX-x_dist ance),i nt(he ight-(mybo ttom+space Y*8.4+8)),str);//Y轴红CPen pen5(PS_S OLID,1,RGB(255,0,0));CP en *p OldPe n5=pD C->Se lectO bject(&pen5);for(i=0;i<=coun t_y;i++) {s tr.Fo rmat(_T("%.f"),i*(m_potY2/coun t_y)); p DC->M oveTo(m_ro wX-m_x_x,i nt(he ight-(mybo ttom+space Y*i))); pDC->LineT o(m_r owX+5-m_x_x,int(heig ht-(m ybott om+sp aceY*i)));pD C->Te xtOut(m_ro wX-m_x_x-x_dist ance,i nt(he ight-(mybo ttom+space Y*i+8)),st r);}pD C->Se lectO bject(pOld Pen5);//绘制网格CPen pen6(PS_D OT,1,RGB(200,240,240));CPen*pOld Pen6=pDC->Selec tObje ct(&p en6);for(i=1;i<=co unt_y;i++){ pDC->Move To(m_rowX+10,in t(hei ght-m ybott om-i*space Y));pDC->Lin eTo(w idth,int(h eight-mybo ttom-i*spa ceY));}for(i=1;i<coun t_x;i++){p DC->M oveTo(int(m_row X+i*s paceX),int(heig ht-my botto m));pDC->Lin eTo(i nt(m_rowX+i*spa ceX),mytop);}pDC->Sel ectOb ject(pOldP en6);//绘制虚线CPen pen4(PS_D ASHDO T,1,R GB(0,200,0));CPen*pOld Pen4=pDC->Selec tObje ct(&p en4);pDC->Mov eTo(m_rowX+10,i nt(he ight-(mybo ttom+space Y*5)));p DC->L ineTo(widt h,int(heig ht-(m ybott om+sp aceY*5)));pDC->Mov eTo(m_rowX+10,i nt(he ight-(mybo ttom+space Y*8.4)));pDC->Line To(in t(wid th),i nt(he ight-(mybo ttom+space Y*8.4)));pDC->Sele ctObj ect(p OldPe n4);//绘制X,Y轴的变量名CFont font1;f ont1.Creat eFont(15,6,0,0,FW_RE GULAR,FALS E,FAL SE,0,ANSI_CHARS ET, OU T_STR OKE_P RECIS,C LIP_D EFAUL T_PRE CIS,P ROOF_QUALI TY,FI XED_P ITCH|FF_SWISS,_T("Arial"));CFon t* de f_fon t1=pD C->Se lectO bject(&fon t1);pDC->Text Out(w idth/2,hei ght-20,_T("时间(h)"));pDC->Tex tOut(m_row X-m_x_x-8,heigh t-22,_T("(A)"));pD C->Te xtOut(m_ro wX-8,heigh t-22,_T("(V)"));pD C->Se lectO bject(def_font1);加性噪声一般指热噪声、散弹噪声等,它们与信号的关系是相加,不管有没有信号,噪声都存在。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
主要特点控件的主要特点是:高速绘图(轴固定时),允许快速绘制数据无限数量的数据序列(内存是限制)每个数据序列的数据量不受限制支持线图,点图,平面图,柱状图,K线图和甘特图系列最多四个轴(左,下,右和上轴)标准轴,对数轴或日期/时间轴自动伸缩的坐标轴, 翻转的坐标轴(相互独立)轴标签点标签平滑的曲线网格图例和标题交互性(在控件中发生特定事件时的通知)支持手动缩放和鼠标平移支持鼠标指针支持轴上的滚动条高度可定制(颜色,标题,标签,边缘,字体等)支持UNICODE支持打印和保存到图像文件文档结构本文通过一系列简短的教程来涵盖控件的大部分功能。
阅读本文后,您将能够快速地在自己的应用程序中使用本控件。
我决定从文章中删除所有的类和函数的文档,因为它不是非常友好并且我很难维护。
此外,随着代码的增长,要记录的类和函数的列表变得过于广泛以至于不能将所有内容放在文章中。
作为替代,我提供了一个doxygen文档,您可以从本文中(文章的开头)下载:只需下载“Doxygen文档”zip文件,解压所有文件,双击“Index.html”文件,进行查看。
入门学习此图表控件允许您在屏幕上绘制一系列数据。
此控件可以添加几个不同类型数据序列并且最多可以使用四个轴。
添加到图表的数据序列与一个水平轴(底部或顶部)和一个垂直轴(右侧或左侧)相关联。
这两个轴控制数据序列在图表上的显示方式。
为了能够在应用程序中使用次图表控件,您首先需要在自己的工程里添加源代码zip中包含的文件。
注意:控件在内部使用动态转型,因此必须启用RTTI(RunTime Type Information 运行时自动类型识别的机制),否则可能会发生崩溃。
默认情况下,VC6没有启用RTTI,因此要启用它打开项目设置- >“C / C ++”选项卡- >“C ++语言”类别,并确保“Enable Run-Time Type Information (RTTI) “选项已选中。
在应用程序中使用图表控件有两种方法:手动插入,或通过资源编辑器插入。
手动插入1.#include "ChartCtrl"添加在对话框(Dialog)类的头文件中2.在对话框类中添加变量CChartCtrl://{{AFX_DATA(CChartDemoDlg)//}}AFX_DATACChartCtrl m_ChartCtrl;3.在对话框类的OnInitDialog方法中添加这个控件的Create方法。
使用资源管理器1.向对话框资源添加自定义控件,打开控件的属性,并为Class属性指定ChartCtrl。
为了避免滚动条上的闪烁,必须设置WS_CLIPCHILDREN样式(0x02000000L),如图所示。
2.#include "ChartCtrl.h"添加在对话框(Dialog)类的头文件中3.在对话框类中添加变量CChartCtrl://{{AFX_DATA(CChartDemoDlg)//}}AFX_DATACChartCtrl m_ChartCtrl;4.在DoDataExchange函数中添加DDX_Control(不要忘了更改ID号和控件名字):Add a variable of type CChartCtrl in your dialog class:Hide Copy Code//{{AFX_DATA(CChartDemoDlg)//}}AFX_DATA操作数据序列几种类型的数据序列可以添加到控制:点序列,线序列,曲面序列,柱状图序列,K 线图序列或甘特图序列。
点的数据格式可能因序列而异(例如,K线图和甘特图系列使用不同的点格式)。
一旦你选择了一种系列,你可以通过调用上表中列出的CChartCtrl类的辅助函数之一将其添加到图表中。
这些函数接受两个可选参数:两个布尔值来确定描述该系列是连接到副水平轴(顶轴)或者是连接大副垂直轴(右轴)。
如果未指定参数,则数据系列将附加到主水平轴(底部轴)和主垂直轴(左轴)。
警告: 在将任何系列添加到图表之前,您需要创建该系列所连接的两个轴。
如果不这样做,将导致控件失效(assert)。
有关详细信息,请参见“操纵轴”一节。
一旦将系列添加到图表后,我们就可以使用数据填充该图表。
有两种方法:将数据放到一个单元中一起添加,或者逐点添加。
后者用于有动态数据时:每次调用函数时都会更新图表。
虽然这个调用是快速的(在某些特定条件下),但是最好尽可能地将数据放到一个单元中。
下面是一个简单代码示例,它在图表中创建两个系列,并用数据填充它们:一个系列在初始化时完全填充,另一个系列在调用OnDataReceived函数(仅存在于此示例的目的)时填充。
m_pLineSeries,m_pPointsSeries和m_ChartCtrl是CMyClass类的成员变量。
void CMyClass::Init(){.... // SNIP: Creation of the axes in the chart. This MUST be done before.m_pLineSeries = m_ChartCtrl.CreateLineSerie();m_pPointsSeries = m_ChartCtrl.CreatePointsSerie();double YValues[10];for (inti=0;i<10;i++)XValues[i] = YValues[i] = i;m_pLineSerie->SetPoints(XValues,YValues,10);}void CMyClass::OnDataReceived(double X, double Y){m_pPointsSeries->AddPoint(X, Y);}所有系列类继承自同一抽象基类:CChartSerie。
该类处理所有系列通用的功能,但对具体的数据点没有任何处理功能。
点的概念在子类CChartSerieBase中引入,它是一个模板类,模板参数是要操作为点的数据类型。
这很重要,因为序列可能必须处理不同的数据类型:例如点序列操作具有X和Y值的点,但是K线图系列操纵具有5个值(打开,关闭,高,低和时间值)的点。
其他系列继承自CChartSerieBase并提供他们操作的数据类型。
CChartSerieBase类已经处理了大多数数据管理,并通过纯虚函数将渲染委托给子类。
每个系列在创建时也会分配一个Id。
此标识可通过CChartSerie :: GetSerieId()检索,并可用于从图表中删除该系列。
该系列的一个重要特征是控制点的顺序:该系列中的所有点将根据它们的值重新排序。
默认情况下,点是基于它们的X值排序的,但您可以通过对它们的Y值排序或不对它们进行排序来改变这种行为(在这种情况下,系列保持将点添加到系列中的顺序)。
对点进行排序会对性能产生影响:如果点是有序的,则控件能够从完整系列中检索第一个和最后一个可见点,并且仅绘制两个点之间的点。
另一方面,你将不能绘制像椭圆形的曲线。
您可以通过调用CChartSerieBase :: SetSeriesOrdering来更改点的顺序。
控件中的不同系列的功能通常是不言自明的。
然而,柱状图系列需要一些解释。
柱状图系列这个系列有点特别,如果其中几个在同一个控件上绘制在一起,他们将互相影响。
目的是能够绘制多个条形图系列,而不会重叠:它们是彼此相邻绘制的。
为此,您需要指定每个所属的组(一个简单的整数标识符)。
同一组的系列彼此相邻地绘制(或者对于水平条在彼此的顶部):参见两个图形的示例。
设置组ID是通过SetGroupId函数完成的。
您还可以通过调用SetInterSpace静态函数来控制所有柱形图之间剩余的空间的宽度。
这将为所有系列设置以像素为单位的空间(因此,如果显示多于两个系列,则在任何位置使用相同的空间)。
注意,您可以通过调用SetBarWidth单独设置柱状图系列的宽度。
在点上添加标签一旦使用数据填充您的系列,您还可以在系列的特定点上添加标签:这个标签始终附加到特定点。
现在,只提供一种类型的标签,气泡标签:包含文本的圆角矩形并用线连接到特定点上。
当然,如果需要,您也可以提供自己的自定义标签(参见“扩展功能”一节)。
有两种方式创建文本标签:静态创建标签时,或动态注册一个对象,当标签请求时,它将提供文本。
第一种方法是最简单的,但也不太灵活。