前面課程中,笨笨給大家的例子都是在VC下建立的Win32Application項目。
CChart是與框架無關的,其內部只使用了Win32API,沒有使用任何與框架有關的代碼,例如MFC、WTL、QT等。但CChart完全可以在這些框架下使用。
順便介紹一下,其實最早的CChart版本就是基於MFC的,後來笨笨重新開發,拋棄了MFC。
本節課介紹CChart在MFC框架下的編程方法。
MFC大家都很熟了吧,實際上用VC的人大部分都是在使用MFC,而不用VC的人大部分人也不知道MFC是什麼。這裡笨笨假定大家使用的都是VC,所以也不用解釋MFC了,呵呵。
仍然以實例的形式。
第一步,打開VC,建立一個基於MFCAppWizard(exe)向導的項目Lesson15,向導中不做任何更改,直接點Finish。
第二步,拷貝五個庫文件到Lesson15文件夾。
第三步,在VC中打開Lesson15View.h文件,在其頭部添加如下代碼。
#include "Chart.h" #ifdef _DEBUG #pragma comment(lib, "PlotDll_d.lib") #else #pragma comment(lib, "PlotDll.lib") #endif
第四步,在Lesson15View.h文件中,給CLesson15View類添加一個CChartWnd變量。
CChartWnd m_ChartWnd;第五步,利用ClassWizard給CLesson15View類添加OnCreate和OnDestroy消息處理函數。
第六步,修改OnCreate函數如下。
int CLesson15View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_ChartWnd.Attach(m_hWnd, kTypeXY); m_ChartWnd.GetChart()->AddPoint2D(1.0, 3.0); m_ChartWnd.GetChart()->AddPoint2D(2.0, 2.5); m_ChartWnd.GetChart()->AddPoint2D(3.0, 1.0); m_ChartWnd.GetChart()->AddPoint2D(4.0, 6.0); m_ChartWnd.GetChart()->AddPoint2D(5.0, 7.0); m_ChartWnd.GetChart()->AddPoint2D(6.0, 2.0); m_ChartWnd.GetChart()->AddPoint2D(7.0, 1.0); m_ChartWnd.GetChart()->AddPoint2D(8.0, 4.0); m_ChartWnd.GetChart()->SetTitle(_T("測試在MFC下繪圖")); return 0; }
第七步,修改OnDestroy函數如下。
void CLesson15View::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here m_ChartWnd.Detach(); }
運行程序,效果如圖。
呵呵,成功了。
在MFC下編程也相當相當的簡單。
前面采用CChartWnd類編程,其實也可以采用CChart類,但需要手動處理消息。下面把上面的步驟修改一下。
第四步(新),在Lesson15View.h文件中,給CLesson15View類添加一個CChart變量。
CChart m_Chart;
第五步(新),利用ClassWizard給CLesson15View類添加OnCreate消息處理函數。
這裡不需要處理OnDestroy。
第六步(新),修改OnCreate函數如下。
int CLesson15View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_Chart.SetType(kTypeXY); m_Chart.AddPoint2D(1.0, 3.0); m_Chart.AddPoint2D(2.0, 2.5); m_Chart.AddPoint2D(3.0, 1.0); m_Chart.AddPoint2D(4.0, 6.0); m_Chart.AddPoint2D(5.0, 7.0); m_Chart.AddPoint2D(6.0, 2.0); m_Chart.AddPoint2D(7.0, 1.0); m_Chart.AddPoint2D(8.0, 4.0); m_Chart.SetTitle(_T("測試在MFC下繪圖")); return 0; }第七步(新),修改OnDraw函數如下。
void CLesson15View::OnDraw(CDC* pDC) { CLesson15Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here m_Chart.OnDraw(m_hWnd); }現在已經可以運行了,但還沒有實現交互。
第八步,利用ClassWizard添加WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_MOUSEMOVE、WM_CONTEXTMENU、WM_KEYDOWN、WM_ERASEBKGND消息的響應函數。
第九步,修改上述響應函數如下。
void CLesson15View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_Chart.OnLButtonDown(m_hWnd, point)) GetDocument()->UpdateAllViews(NULL); //CView::OnLButtonDown(nFlags, point); } void CLesson15View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_Chart.OnLButtonUp(m_hWnd, point)) GetDocument()->UpdateAllViews(NULL); //CView::OnLButtonUp(nFlags, point); } void CLesson15View::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_Chart.OnLButtonDblClk(m_hWnd, point)) GetDocument()->UpdateAllViews(NULL); //CView::OnLButtonDblClk(nFlags, point); } void CLesson15View::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_Chart.OnMouseMove(m_hWnd, point)) GetDocument()->UpdateAllViews(NULL); //CView::OnMouseMove(nFlags, point); } void CLesson15View::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here if(m_Chart.OnContextMenu(NULL, m_hWnd, point)) GetDocument()->UpdateAllViews(NULL); } void CLesson15View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if(m_Chart.OnKeyDown(m_hWnd, nChar)) GetDocument()->UpdateAllViews(NULL); //CView::OnKeyDown(nChar, nRepCnt, nFlags); } BOOL CLesson15View::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; //return CView::OnEraseBkgnd(pDC); }運行程序,效果和前面一模一樣。
從這裡可以看出,在MFC下還是用CChartWnd編程要方便一點。
本節課笨笨給大家介紹了CChart在MFC下畫折線圖的例子,其它圖形的畫法可以照葫蘆畫瓢。