二维坐标轴中绘三维图形

二维坐标轴中绘三维图形

代码部分

 CRect rect;
 GetClientRect(rect);
 pDC->SetMapMode(MM_ANISOTROPIC);
 pDC->SetWindowExt(rect.Width(), rect.Height());
 pDC->SetViewportExt(rect.Width(), -rect.Height());
 pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);
 CRect rect1(CPoint(0, 0), CPoint(100, 100));  CPoint p[4];
 p[0] = CPoint(60, 80);
 p[1] = CPoint(60, 180);
 p[2] = CPoint(160, 180);
 p[3] = CPoint(160, 80);

// CBrush NewBrush, *pOldBrush;
// pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);

 pDC->Rectangle(&rect1);
 pDC->MoveTo(0, 100);
 pDC->LineTo(p[1]);
 pDC->MoveTo(100, 100);
 pDC->LineTo(p[2]);
 pDC->MoveTo(100, 0);
 pDC->LineTo(p[3]);
 pDC->MoveTo(p[1]);
 pDC->LineTo(p[2]);
 pDC->LineTo(p[3]);

 CPen NewPen, *pOldPen;
 NewPen.CreatePen(PS_DASH, 1, RGB(0, 0, 0));
 pOldPen = pDC->SelectObject(&NewPen);
 pDC->MoveTo(0, 0);
 pDC->LineTo(p[0]);
 pDC->LineTo(p[1]);
 pDC->LineTo(p[0]);
 pDC->LineTo(p[3]);
 pDC->SelectObject(pOldPen);
// pDC->SelectObject(pOldBrush);
// CRect rect1(CPoint(0, 0), CPoint(200, 200));
// pDC->Rectangle(&rect1);
// pDC->RoundRect(rect1, CPoint(200, 200));
 // TODO: add draw code for native data here
// CRect rect1(CPoint(-25, -25), CPoint(25, 25));
// CPoint p[4];
// p[0] = (15, 5); p[1] = (15, 55); p[2] = (75, 55); p[3] = (75, 5);
// pDC->Rectangle(rect1);

有关于代码中的部分讲解
1.// CBrush NewBrush, *pOldBrush;
  // pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);
这部分可要,可不要(在这段代码中);因为正方形是最先画,那么它是在最下面,即使它不是透明的,后面画的线都在它的上面,是可以看见的
然后是这段代码
// CPoint p[4];
// p[0] = (15, 5); p[1] = (15, 55); p[2] = (75, 55); p[3] = (75, 5);
这个无论是编译,还是链接都不会有错,但是它是错的,进入调试模式可以看到一些情况,这些点的y = 0,而x值却是我们给的坐标点的y值,因为忘了CPoint,虽然我是想将一个坐标赋给CPoint的数组元素,可是忘了在坐标前加上CPoint,这样目的是无法达到的

2.运行代码,可以得到一个正方体似的图形,可是通过代码可以看出,这其实并不能算一个正方体,因为它就只有一个面和8条线,只不过看得像正方体
  下面是关键,图是得到了,说明“二维坐标轴中绘三维图形”是可行的,可是通过看代码发现这样很繁琐,不停地“moveto”,“lineto”,代码多,复杂易出错,而且很乱不清晰;所以这是不行的,只能作为可行性的说明
  其实我在编写代码是也这样想过:一个正方体直观的想法应该是6个面,只需6行代码就可以得到一个正方体,并且相对上面的不完全正方体,这样得到的是拥有6个面的正方体;只不过在编写时要注意里面的,看不到的要先绘,否则可能绘了正方体却在窗口中看不到

补充碰到的一个错误:编译时没问题,链接时报错
LINK : fatal error LNK1168: cannot open Debug/Down1.exe for writing
这是因为这个程序运行过一次,且它的运行窗口没关闭,这样当你再次编译链接就会这样,而如果是直接链接,它是不会报错的