前面笨笨已經給大家展示了CChart編程的N個例子。這些例子中,我們的CChart圖像都是繪制在程序的主窗口中的。
在很多情況下,我們面對的情形不是這樣的。這節課笨笨就給大家介紹一下怎樣在對話框中用CChart畫圖。
這裡要說明一點,本節課的內容需要CChart的版本號不小於2.5.1.4,否則運行會不正常。請到CSDN網站笨笨的下載頻道下載。點擊打開鏈接
第一步,打開VC,建立一個基於MFCAppWizard(exe)向導的項目Lesson18。向導中選擇DialogBased,其它不做任何更改,直接點Finish。
第二步,把CChart的五個庫文件Chart.h、PlotDll_d.lib、PlotDll_d.dll、PlotDll.lib、PlotDll.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>第七步,利用ClassWizard給CLesson18Dlg類添加WM_DESTROY消息的響應函數。
第八步,修改OnInitDialog函數,在“//TODO:Addextrainitializationhere”這一行下面,添加如下代碼。
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:Addyourmessagehandlercodehere”這一行下面,加入下面的代碼。
m_ChartWnd.Detach();OK,收工了。我們程序的運行結果如下。
我們看到,在對話框裡面嵌套了一個CChart窗口。利用CChart的交互功能,還可以調出CChart的屬性對話框窗口,這個窗口是CChart窗口的子窗口。哈哈,這是不是類似俄羅斯套娃呀。
原來CChart在對話框中使用也不難嘛,哈哈。
下課啦!