程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入淺出CChart 每日一課——第十五課 實習之旅,百年老店之經典MFC

深入淺出CChart 每日一課——第十五課 實習之旅,百年老店之經典MFC

編輯:關於C語言

前面課程中,笨笨給大家的例子都是在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();
}
 


運行程序,效果如圖。

SouthEast

呵呵,成功了。

在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下畫折線圖的例子,其它圖形的畫法可以照葫蘆畫瓢。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved