www.pudn.com > 4533566799.rar > FractalView.cpp


//贵州省安顺市第二高级中学 高二一班 蒋伟	 
//2002.7.1 
//请勿修改版权信息 谢谢 
//Neil 
// 
// FractalView.cpp : implementation of the CFractalView class 
// 
 
#include "stdafx.h" 
#include "Fractal.h" 
 
#include "FractalDoc.h" 
#include "mainfrm.h" 
#include "FractalView.h" 
#include "adjustFractal.h" 
#include "mainfrm.h" 
 
#include "math.h" 
#define PI 3.14159265358 
 
#define MY_UPDATESTATUSBAR_MSG "Update Status Bar" 
#define ML_DRAWING 1 
#define ML_DONE 2 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
struct DrawInfo{ 
	HWND hWnd; 
	CFractalDoc *pDoc; 
	CRect rectClient; 
}; 
 
static DrawInfo g_Environment; 
static BOOL g_bDraw=false; 
static UINT DrawFractal(LPVOID pPar); 
 
HDC hdc; 
HPEN hPen, hOldPen; 
 
UINT UpdateMsg = RegisterWindowMessage(MY_UPDATESTATUSBAR_MSG); 
 
UINT CFractalView::m_AdjustMsg= 
	RegisterWindowMessage(MY_ADJUST_MSG); 
///////////////////////////////////////////////////////////////////////////// 
// CFractalView 
 
IMPLEMENT_DYNCREATE(CFractalView, CView) 
 
BEGIN_MESSAGE_MAP(CFractalView, CView) 
	//{{AFX_MSG_MAP(CFractalView) 
	ON_WM_MOUSEMOVE() 
	ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_REGISTERED_MESSAGE(m_AdjustMsg, OnAdjustBar) 
	ON_REGISTERED_MESSAGE(UpdateMsg, OnUpdateStautsBar) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFractalView construction/destruction 
 
CFractalView::CFractalView():m_pDrawThread(0){} 
CFractalView::~CFractalView(){} 
BOOL CFractalView::PreCreateWindow(CREATESTRUCT& cs){return CView::PreCreateWindow(cs);} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFractalView diagnostics 
 
#ifdef _DEBUG 
void CFractalView::AssertValid() const{CView::AssertValid();} 
void CFractalView::Dump(CDumpContext& dc) const{CView::Dump(dc);} 
 
CFractalDoc* CFractalView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFractalDoc))); 
	return (CFractalDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CFractalView message handlers 
 
void CFractalView::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	strLocation.Format("X:%u,Y:%u",point.x,point.y); 
	((CMainFrame *)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(2,strLocation); 
	 
	CView::OnMouseMove(nFlags, point); 
} 
 
void DrawBranch(int x, int y, double Length, int StartAngle, HDC hdc,CFractalDoc* pDoc) 
{ 
	 
	double x1,y1,nx,ny,count; 
	double nLength; 
	 
	x1=x+Length*cos(StartAngle*PI/180); 
	y1=y-Length*sin(StartAngle*PI/180); 
	::MoveToEx(hdc,(int)x,(int)y,0); 
	if(pDoc->m_bDrawPixel) 
		::SetPixel(hdc,(int)x1,(int)y1,pDoc->m_color); 
	else 
		::LineTo(hdc,(int)x1,(int)y1); 
	if(Lengthm_last_branch_length) 
		return; 
	nLength=Length; 
	nx=x; 
	ny=y; 
	for(count=0;countm_branch_num;count++) 
	{ 
		nx+=nLength*(1-pDoc->m_cut_rate)*cos(StartAngle*PI/180); 
		ny-=nLength*(1-pDoc->m_cut_rate)*sin(StartAngle*PI/180); 
		DrawBranch((int)nx,(int)ny,nLength*(1-pDoc->m_cut_rate),StartAngle+(int)pDoc->m_left_branch_angle,hdc,pDoc); 
		DrawBranch((int)nx,(int)ny,nLength*(1-pDoc->m_cut_rate),StartAngle-(int)pDoc->m_right_branch_angle,hdc,pDoc); 
		nLength*=pDoc->m_cut_rate; 
	} 
	 
} 
 
UINT DrawFractal(LPVOID pPar) 
{ 
	g_bDraw=true; 
 
	DrawInfo* pDrawInfo=(DrawInfo*)pPar; 
 
	::SendMessage(pDrawInfo->hWnd,UpdateMsg, ML_DRAWING,0);	 
 
	if(hdc)::ReleaseDC( pDrawInfo->hWnd, hdc ); 
	hdc = ::GetDC( pDrawInfo->hWnd ); 
	::GetClientRect(pDrawInfo->hWnd,&(pDrawInfo->rectClient)); 
	 
	if(hPen)::DeleteObject( hPen ); 
	hPen =::CreatePen( PS_SOLID, pDrawInfo->pDoc->m_linewidth,pDrawInfo->pDoc->m_color); 
	hOldPen = (HPEN) ::SelectObject( hdc, hPen ); 
 
	::InvalidateRect( pDrawInfo->hWnd,&pDrawInfo->rectClient,TRUE ); 
	::UpdateWindow( pDrawInfo->hWnd ); 
 
	DrawBranch(pDrawInfo->rectClient.left+pDrawInfo->rectClient.Width()/2, 
		pDrawInfo->rectClient.bottom, 
		pDrawInfo->pDoc->m_branch_length,90, 
		hdc,pDrawInfo->pDoc); 
	 
	::SelectObject( hdc, hOldPen ); 
	::DeleteObject( hPen ); 
	::ReleaseDC( pDrawInfo->hWnd, hdc ); 
	 
	::SendMessage(pDrawInfo->hWnd,UpdateMsg, ML_DONE,0);	 
 
	g_bDraw=false; 
	 
	return 0; 
} 
 
void CFractalView::OnViewRefresh()  
{ 
	if(g_bDraw){ 
		::TerminateThread(m_pDrawThread->m_hThread,0); 
		g_bDraw=false; 
	} 
	::SendMessage(AfxGetMainWnd()->m_hWnd,WM_SHOWWINDOW,0,0); 
 
	Invalidate();	 
} 
 
LRESULT CFractalView::OnUpdateStautsBar(WPARAM wParam, LPARAM lParam) 
{ 
	switch (wParam) 
	{ 
		case ML_DRAWING: 
			((CMainFrame *)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(1,"正在绘图..."); 
			break; 
		case ML_DONE: 
			((CMainFrame *)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(1,"绘图完毕"); 
			break; 
	} 
	return TRUE; 
} 
 
LRESULT CFractalView::OnAdjustBar(WPARAM wParam, LPARAM lParam) 
{ 
	CFractalDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc);	 
 
	CAdjustFractal *pAdjustBox=((CMainFrame*)AfxGetMainWnd())->m_pAdjustBox; 
 
	switch (wParam) 
	{ 
	case ML_APPLY: 
		pDoc->m_branch_length=pAdjustBox->m_iBranchLength; 
		pDoc->m_branch_num=pAdjustBox->m_iBranchNum; 
		pDoc->m_cut_rate=pAdjustBox->m_dblCutRate; 
		pDoc->m_last_branch_length=pAdjustBox->m_iLastBranchLength; 
		pDoc->m_left_branch_angle=pAdjustBox->m_iLeftAngle; 
		pDoc->m_right_branch_angle=pAdjustBox->m_iRightAngle; 
		pDoc->m_linewidth=pAdjustBox->m_iLineWidth; 
		pDoc->m_bDrawPixel=pAdjustBox->m_bDrawPixel; 
		pDoc->m_color=pAdjustBox->m_Color; 
 
		pDoc->SetModifiedFlag(); 
		 
		SendMessage(WM_COMMAND,ID_VIEW_REFRESH); 
 
		break; 
	} 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFractalView drawing 
 
void CFractalView::OnDraw(CDC* pDC)  
{ 
 	CFractalDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	 
	if(!g_bDraw){ 
		g_Environment.hWnd = m_hWnd; 
		g_Environment.pDoc=pDoc; 
		 
		m_pDrawThread=AfxBeginThread(DrawFractal,(LPVOID*)&g_Environment); 
	} 
}