zoukankan      html  css  js  c++  java
  • 深入浅出CChart 每日一课——第十八课 女神的套娃,玩转对话框

    前面笨笨已经给大家展示了CChart编程的N个例子。这些例子中,我们的CChart图像都是绘制在程序的主窗口中的。

    在很多情况下,我们面对的情形不是这样的。这节课笨笨就给大家介绍一下怎样在对话框中用CChart画图。

    这里要说明一点,本节课的内容需要CChart的版本号不小于2.5.1.4,否则运行会不正常。请到CSDN网站笨笨的下载频道下载。

    第一步,打开VC,建立一个基于MFC AppWizard(exe)向导的项目Lesson18。向导中选择Dialog Based,其它不做任何更改,直接点Finish

    第二步,把CChart的五个库文件Chart.hPlotDll_d.libPlotDll_d.dllPlotDll.libPlotDll.dll拷贝到Lesson18文件夹中,

    第三步,在VC界面的资源编辑器中,删除掉对话框中间的“TODO: 在这里设置对话控制。”这个标签,然后再对话框中放置一个Picture控件,并把这个控件的ID设置为ID_CANVAS。

    第四步,在VC中打开Lesson18Dlg.h文件,在其头部加入CChart头文件和库文件的引用。

     
    #include "Chart.h"
    #ifdef _DEBUG
    #pragma comment(lib, "PlotDll_d.lib")
    #else
    #pragma comment(lib, "PlotDll.lib")
    #endif
     
    


    第五步,在Lesson18Dlg.h文件中给CLesson18Dlg类添加一个CChartWnd类型的成员变量。

     
    CChartWnd m_ChartWnd;
     
    


    第六步,在Lesson18Dlg.cpp的头部加入数学库头文件引用。

     
    #include <math.h>
     
    


    第七步,利用ClassWizardCLesson18Dlg类添加WM_DESTROY消息的响应函数。

    第八步,修改OnInitDialog函数,在“// TODO: Add extra initialization here”这一行下面,添加如下代码。

     
    CWnd *pWnd = GetDlgItem(IDC_CANVAS);
    if(pWnd)
    {
    	CRect rtWCtrl, rtWParent;
    	pWnd->GetWindowRect(&rtWCtrl);
    	GetWindowRect(&rtWParent);
    	
    	int capH = GetSystemMetrics(SM_CYCAPTION);
    	int dx = GetSystemMetrics(SM_CXBORDER);
    	
    	int offsetx = (rtWCtrl.left - rtWParent.left - dx);
    	int offsety = (rtWCtrl.top - rtWParent.top - capH);
    
    	CRect rtCtrlClient;
    	pWnd->GetClientRect(&rtCtrlClient);
    	OffsetRect(&rtCtrlClient, offsetx, offsety);
    
    	m_ChartWnd.Attach(m_hWnd, kTypeXY, rtCtrlClient);
    	
    	int i;
    	double pX[360], pY[360];
    	for(i=0; i<360; i++)
    	{
    		pX[i] = i*2.0*3.1415926536/360.0;
    		pY[i] = sin(pX[i]);
    	}
    	m_ChartWnd.GetChart()->AddCurve(pX, pY, 360);
    
    	m_ChartWnd.GetChart()->SetTitle(_T("对话框中的CChart"));
    }
     
    


     

    这里注意,我们在“粘窗口”的时候,粘到的不是Picture控件上,而是粘到了对话框的主窗口上。这样做的原因是由于对话框会拦截控件的消息,直接把窗口粘到Picture控件上程序工作会不正常。

    前面一大段代码主要是为了计算Picture控件相对于主窗口的偏移,以便正确绘制图形。

    第九步,修改OnDestroy函数,在“// TODO: Add your message handler code here”这一行下面,加入下面的代码。

     
    m_ChartWnd.Detach();
     
    


    OK,收工了。我们程序的运行结果如下。

    我们看到,在对话框里面嵌套了一个CChart窗口。利用CChart的交互功能,还可以调出CChart的属性对话框窗口,这个窗口是CChart窗口的子窗口。哈哈,这是不是类似俄罗斯套娃呀。

    原来CChart在对话框中使用也不难嘛,哈哈。

    下课啦!

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/james1207/p/3331255.html
Copyright © 2011-2022 走看看