19,468
社区成员
发帖
与我相关
我的任务
分享
void Draw(CDC *p,double house[28][4],int Color,int DispAxis)
{
double x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3;
int nface=0;
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//HWND hwndIE = FindWindow(CMy3D_ShowDlg,NULL);
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
CRect rect;
GetClientRect(AfxGetMainWnd()->m_hWnd,&rect);
MemBitmap.CreateCompatibleBitmap(p,rect.Width(),rect.Height());
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是黑色作为背景
MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),BLACK);
CPen pen(PS_SOLID,1,Color);
CBrush brush(MYCOLOR);
MemDC.SelectObject(pen);
MemDC.SelectObject(brush);
for(nface=0;nface<6;nface++)
{
MemDC.BeginPath();
x0=house[nface*4][0];
y0=house[nface*4][1];
z0=house[nface*4][2];
x1=house[nface*4+1][0];
y1=house[nface*4+1][1];
z1=house[nface*4+1][2];
x2=house[nface*4+2][0];
y2=house[nface*4+2][1];
z2=house[nface*4+2][2];
x3=house[nface*4+3][0];
y3=house[nface*4+3][1];
z3=house[nface*4+3][2];
moveto2(&MemDC,house[nface*4][0],house[nface*4][1],house[nface*4][2]);
lineto2(&MemDC,house[nface*4+1][0],house[nface*4+1][1],house[nface*4+1][2]);
lineto2(&MemDC,house[nface*4+2][0],house[nface*4+2][1],house[nface*4+2][2]);
lineto2(&MemDC,house[nface*4+3][0],house[nface*4+3][1],house[nface*4+3][2]);
lineto2(&MemDC,house[nface*4][0],house[nface*4][1],house[nface*4][2]);
MemDC.EndPath();
MemDC.FillPath();
}
//将内存中的图拷贝到屏幕上进行显示
p->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
void CMy3D_ShowDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// & bit-and
// && logical-and
if(nFlags & MK_LBUTTON && RotateMode!=ROTATE_N)
{
if(oldPoint.x<point.x)
Rotate(house,-R_STEP,RotateMode);
else
Rotate(house,R_STEP,RotateMode);
InvalidateRect(NULL,false);
}
else if(nFlags & MK_LBUTTON && flag == 1)
{
if(oldPoint.x!=point.x||oldPoint.y!=point.y)
{
Move(house,point.x-oldPoint.x,oldPoint.y-point.y,0);
InvalidateRect(NULL,false);
}
InvalidateRect(NULL,false);
}
oldPoint=point;
CDialog::OnMouseMove(nFlags, point);
}
void Move(double house[28][4],double x,double y,double z)
{
double SMatrix[4][4];
ResetMatrix(SMatrix);
SMatrix[3][0]=x;
SMatrix[3][1]=y;
SMatrix[3][2]=z;
MultiMatrix((double*)house,SMatrix,28,4);
}