⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawdlg.cpp

📁 本程序描绘了一个球体怎样进行旋转的细节。
💻 CPP
字号:
// DrawDlg.cpp : implementation file
//

#include "stdafx.h"
#include "iu.h"
#include "DrawDlg.h"
#include "iuDlg.h"
#include "math.h"

#define  DU 3.14159/180
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDrawDlg dialog


CDrawDlg::CDrawDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDrawDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDrawDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CDrawDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDrawDlg)
	DDX_Control(pDX, IDC_SCROLLBAR3, m_scroll3);
	DDX_Control(pDX, IDC_SCROLLBAR2, m_scroll2);
	DDX_Control(pDX, IDC_SCROLLBAR1, m_scroll1);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDrawDlg, CDialog)
	//{{AFX_MSG_MAP(CDrawDlg)
	ON_WM_PAINT()
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawDlg message handlers

void CDrawDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CWnd *pWnd=GetDlgItem(IDC_DRAW);
	pWnd->UpdateWindow();
//	CDC *PDC=pWnd->GetDC();
	Draw();
	
}

void CDrawDlg::Draw()
{	
	CWnd *pWnd=GetDlgItem(IDC_DRAW);
	pWnd->UpdateWindow();
	CDC *pDC=pWnd->GetDC();
	CRect rect;
	pWnd->GetClientRect(rect);
	int cx=(int)((rect.right-rect.left)/2);
	int cy=(int)((rect.bottom-rect.top)/2);

/*	CDC dcmem;
	dcmem.CreateCompatibleDC(pDC);
	CBitmap bmp,*oldbmp;
	bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
	oldbmp=dcmem.SelectObject(&bmp);*/

	D v[8]={
		{-50,-50,50},{-50,50,50},{50,50,50},{50,-50,50},{-50,-50,-50},{-50,50,-50},{50,50,-50},{50,-50,-50}
	},d[8];
	
	POINT p0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8];
	int z[8];
	
//	if (pscroll->GetDlgCtrlID()==(IDC_SCROLLBAR1||IDC_SCROLLBAR2||IDC_SCROLLBAR3))
//  (CScrollBar *)GetDlgItem(IDC_SCROLLBAR1)

//	CScrollBar *pscrolla=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR1);
//	a=pscrolla->GetScrollPos();
//	CScrollBar *pscrollb=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR2);
//	b=pscrollb->GetScrollPos();
//	CScrollBar *pscrollc=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR3);
//	c=pscrollc->GetScrollPos();

	for (int i=0; i<8; i++)
	{		

		d[i].x=v[i].x;
		d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU));
		d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU));

		v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU));
  	    v[i].y=d[i].y;
		v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU));
		
		d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU));
	    d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU));
		d[i].z=v[i].z;
		
		w[i].x=d[i].x+cx;
		w[i].y=d[i].y+cy;
		z[i]=d[i].z;
	}
//	pscroll=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR2);
//	if (pscroll->GetDlgCtrlID()==IDC_SCROLLBAR2)
//	if (pscroll->GetDlgCtrlID()==IDC_SCROLLBAR3)
		
//		w[i].x=(int)(d[i].x+v[i].z*0.866)+cx;
//		w[i].y=(int)(d[i].y+v[i].z*0.5)+cy;
	
//	compare(z,7);
//	Maxnum(z,7);
//	CBrush brush(RGB(255,0,0));
//	CBrush *oldbrush=pDC->SelectObject(&brush);
//	pDC->Polygon(p0,4);
//	brush.Detach();
//	brush.CreateSolidBrush(RGB(0,255,0));
//	pDC->SelectObject(&brush);
//	pDC->Polygon(p3,4);
//	brush.Detach();
//	brush.CreateSolidBrush(RGB(127,127,127));
//	pDC->SelectObject(&brush);
//	pDC->Polygon(p4,4);
//	brush.Detach();
//	brush.CreateSolidBrush(RGB(0,255,255));
//	pDC->SelectObject(&brush);
//	pDC->Polygon(p5,4);
//	brush.Detach();
//	brush.CreateSolidBrush(RGB(0,0,255));
//	pDC->SelectObject(&brush);
//	pDC->Polygon(p2,4);
//	brush.Detach();
//	brush.CreateSolidBrush(RGB(255,0,255));
//	pDC->SelectObject(&brush);
//	pDC->Polygon(p1,4);
//	brush.DeleteObject();
//	pDC->SelectObject(oldbrush);
	p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3];
	p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7];
    p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4];
	p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5];
	p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6];
	p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4];
	switch (Maxnum(z,7))
	{
		case 0:fill(p0,p2,p5,0,2,5);break;
		case 1:fill(p0,p2,p3,0,2,3);break;
		case 2:fill(p0,p3,p4,0,3,4);break;
		case 3:fill(p0,p4,p5,0,4,5);break;
		case 4:fill(p1,p2,p5,1,2,5);break;
		case 5:fill(p1,p2,p3,1,2,3);break;
		case 6:fill(p1,p3,p4,1,3,4);break;
		case 7:fill(p1,p4,p5,1,4,5);break;
	}

}

BOOL CDrawDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	m_scroll1.SetScrollRange(-180,180);
	m_scroll1.SetScrollPos(0);
	m_scroll2.SetScrollRange(-180,180);
	m_scroll2.SetScrollPos(0);
	m_scroll3.SetScrollRange(-180,180);
	m_scroll3.SetScrollPos(0);
	a=b=c=0;
	SetTimer(1,100,NULL);	
	Ctrl=0;


	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDrawDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int nID=pScrollBar->GetDlgCtrlID();
	switch(nID)
	{
		case IDC_SCROLLBAR1: a=pScrollBar->GetScrollPos();
						 switch (nSBCode)
						 {
							case SB_LINELEFT: a--;break;
							case SB_LINERIGHT: a++;break;
							case SB_PAGELEFT: a-=10;break;
							case SB_PAGERIGHT: a+=10;break;
							case SB_THUMBTRACK: a=nPos;break;
						 }
						 if (a<-180)a=180;
						 if (a>180)a=-180;
						 pScrollBar->SetScrollPos(a);
						 break;
		case IDC_SCROLLBAR2: b=pScrollBar->GetScrollPos();
						 switch (nSBCode)
						 {
							case SB_LINELEFT: b--;break;
							case SB_LINERIGHT: b++;break;
							case SB_PAGELEFT: b-=10;break;
							case SB_PAGERIGHT: b+=10;break;
							case SB_THUMBTRACK: b=nPos;break;
						 }
						 if (b<-180)b=180;
						 if (b>180)b=-180;
						 pScrollBar->SetScrollPos(b);
						 break;
		case IDC_SCROLLBAR3: c=pScrollBar->GetScrollPos();
						 switch (nSBCode)
						 {
							case SB_LINELEFT: c--;break;
							case SB_LINERIGHT: c++;break;
							case SB_PAGELEFT: c-=10;break;
							case SB_PAGERIGHT: c+=10;break;
							case SB_THUMBTRACK: c=nPos;break;
						 }
						 if (c<-180)c=180;
						 if (c>180)c=-180;
						 pScrollBar->SetScrollPos(c);
						 break;


//	UpdateData(FALSE);
	}
//	Invalidate();
	Draw();
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CDrawDlg::OnOK() 
{
	// TODO: Add extra validation here
	KillTimer(1);	
	CDialog::OnOK();
	CIuDlg dlg;
	dlg.DoModal();
}

//void CDrawDlg::compare(int *p,int n)
//{
//	for (int i=0;int <n;i++)
//		for (int j=0; j<n;j++)
//		{
//			if (p[j]>p[j+1])
//		 int t;
//		 p=p[j];
//		 p[j]=p[j+1];
//		 p[j+1]=t;
//		}

//}

int CDrawDlg::Maxnum(int *p, int n)
{
	int max=p[0];
	int x;
	for (int i=0; i<=n;i++)
	{		
		if (max<=p[i])
		{	
			max=p[i];
			x=i;
		}
	}
	return x;
}

void CDrawDlg::fill(POINT *x, POINT *y, POINT *z, int i,int j,int q)
{
	CWnd *pWnd=GetDlgItem(IDC_DRAW);
	pWnd->UpdateWindow();
	CDC  *pDC=pWnd->GetDC();
	CRect rect;
	pWnd->GetClientRect(rect);

	CDC dcmem;
	dcmem.CreateCompatibleDC(pDC);
	CBitmap bmp,*oldbmp;
	bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
	oldbmp=dcmem.SelectObject(&bmp);

	CBrush brush[6];
	brush[0].CreateSolidBrush(RGB(255,255,0));
	brush[1].CreateSolidBrush(RGB(0,255,255));
	brush[2].CreateSolidBrush(RGB(0,255,0));
	brush[3].CreateSolidBrush(RGB(255,0,0));
	brush[4].CreateSolidBrush(RGB(0,0,255));
	brush[5].CreateSolidBrush(RGB(255,0,255));

/*	CBrush *oldbrush=pDC->SelectObject(&brush[i]);
	pDC->Polygon(x,4);
	pDC->SelectObject(&brush[j]);
	pDC->Polygon(y,4);
	pDC->SelectObject(&brush[q]);
	pDC->Polygon(z,4);
	pDC->SelectObject(oldbrush);
	for (int b=0; b<6;b++)
	brush[b].DeleteObject();*/

	CBrush *oldbrush=dcmem.SelectObject(&brush[i]);
	dcmem.FillSolidRect(rect,RGB(255,255,255));
	dcmem.Polygon(x,4);
	dcmem.SelectObject(&brush[j]);
	dcmem.Polygon(y,4);
	dcmem.SelectObject(&brush[q]);
	dcmem.Polygon(z,4);
	dcmem.SelectObject(oldbrush);
	for (int b=0; b<6;b++)
	brush[b].DeleteObject();
	pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
		&dcmem,0,0,SRCCOPY);
	dcmem.SelectObject(oldbmp);
	bmp.DeleteObject();
	dcmem.DeleteDC();

}

void CDrawDlg::OnButton1() 
{
	Ctrl=1;
	// TODO: Add your control notification handler code here
	
}

void CDrawDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (1==Ctrl)
	{
		CScrollBar *pscrolla=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR1);
		a--;
		if (a<-180)a=180;
		pscrolla->SetScrollPos(a);
	//		Invalidate();
		Draw();
	}
	if (2==Ctrl)
	{

		CScrollBar *pscrollb=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR2);
		b--;
		if (b<-180)b=180;
		pscrollb->SetScrollPos(b);
	//		Invalidate();
		Draw();
	}
	if (3==Ctrl)
	{
		CScrollBar *pscrollc=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR3);
		c--;
		if (c<-180)c=180;
		pscrollc->SetScrollPos(c);
	//		Invalidate();
		Draw();
	}
	CDialog::OnTimer(nIDEvent);
}

void CDrawDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	Ctrl=2;
	
}

void CDrawDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	Ctrl=3;
	
}

void CDrawDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	KillTimer(1);

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -