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

📄 gdrawview.cpp

📁 VS2005 MFC 实现的画图程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
					}
				}
			}
			if( sel==0 && isdraw )
			{	
				CPoint bb=CPoint(start_point.x,start_point.y);
					    
			    dc.LPtoDP(&bb);
				 CRect rect2s(bb.x-10,bb.y-10,bb.x+10,bb.y+10);
				 PDC->DrawFocusRect(rect2s);
				isdraw=FALSE;
			}
		}
		else
		{
		//	ShowGU(PDC,m_ptrGL);
		if( isdraw )
		{
			CPoint b=CPoint(start_point.x,start_point.y);
		    dc.LPtoDP(&b);
			CDC*PDC=GetDC();
		    CRect rect2s(b.x-10,b.y-10,b.x+10,b.y+10);
			PDC->DrawFocusRect(rect2s);
			isdraw=FALSE;
			ReleaseDC(PDC);
		}
			m_ptrGL->pp[choicep_num]=point;
			Invalidate();
		}
	   ReleaseDC(PDC);
	}
    if( fillset && point_num )
	{
	   int i;
	   if(abs(ptr_point.begin()->x-point.x)<5 && abs(ptr_point.begin()->y-point.y)<5 && point_num>1 )
          settop=1;
	   else 
		   settop=0;
	   CDC*sdc=GetDC();
	   sdc->SetROP2(R2_XORPEN);
	   CPen pen2(0,1,RGB(255,0,0));
	   sdc->SelectObject(&pen2);
	   fill_w=ptr_point.end();
	   fill_w--;
	   CPoint b=CPoint(fill_w->x,fill_w->y);
		dc.LPtoDP(&b);
	   if(first_draw) first_draw=FALSE;
	   else
	   {

		   CPoint c=CPoint(fill_tmpPoint.x,fill_tmpPoint.y);
		   dc.LPtoDP(&c);
		   sdc->MoveTo(b.x,b.y);
		   sdc->LineTo(c.x,c.y);
	   }
	   sdc->MoveTo(b.x,b.y);
	   CPoint cc=CPoint(point.x,point.y);
		dc.LPtoDP(&cc);
	   sdc->LineTo(cc.x,cc.y);
	   ReleaseDC(sdc);
	   fill_tmpPoint=point;	   
	}
    else if((dline || breakline)&&click_flag)
	{	
		if(click)
		{
			//CPoint p[2]={CPoint(click_down.x ,click_down.y),CPoint(point.x,point.y)};
			CDC*pdc=GetDC();
			
			CPoint a=click_down;
			CPoint b=tmp_point;
			CPoint c=point;
			dc.LPtoDP(&a);
			dc.LPtoDP(&b);
			dc.LPtoDP(&c);

			if( dline )
			{
				pdc->SetROP2(R2_XORPEN);
				if( first_draw )
				   first_draw=FALSE;
				else
					DrawLine11(pdc,a.x,a.y,b.x,b.y,RGB(255,255,255) ,0 ,0);		 
				DrawLine11(pdc,a.x,a.y,c.x,c.y,RGB(255,255,255) ,0 ,0);
			}
			else
			{
				pdc->SetROP2(R2_XORPEN);
				if( first_draw )
				   first_draw=FALSE;
				else
					DrawLine11(pdc,a.x,a.y,b.x,b.y,RGB(255,255,255) ,1 ,0);			 
			    DrawLine11(pdc,a.x,a.y,c.x,c.y,RGB(255,255,255) ,1 ,0);
			}
			tmp_point=point;
			ReleaseDC(pdc);
		}
		else if( select )
		{		
			end_point=point;
			int kx=end_point.x-start_point.x;
			int ky=end_point.y-start_point.y;
			start_point=point;
			m_ptrGL->pp[0].x+=kx;
			m_ptrGL->pp[0].y+=ky;
			m_ptrGL->pp[1].x+=kx;
			m_ptrGL->pp[1].y+=ky;
		}
	}
	else if(select && type==1 )
	{
			end_point=point;
			int kx=end_point.x-start_point.x;
			int ky=end_point.y-start_point.y;
			m_ptrGL->pp[0].x+=kx;
			m_ptrGL->pp[0].y+=ky;  
			start_point=point;
		//	Invalidate();
	}
	else if(select && type==2||select && type==3)
	{
			end_point=point;
			int kx=end_point.x-start_point.x;
			int ky=end_point.y-start_point.y;
			int size=m_ptrGL->count;
			for( int i=0;i<size;i++)
			{
				m_ptrGL->pp[i].x+=kx;
				m_ptrGL->pp[i].y+=ky;  
			}
			start_point=point;
	}

	CScrollView::OnMouseMove(nFlags, point);
}
void CGDrawView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
/*	m_ptrGL=m_graphlist.begin();
	CPoint p=m_ptrGL->pp[0];
	CPoint p2=m_ptrGL->pp[1];*/
	CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.LPtoDP(&point);
	/*dc.LPtoDP(&p2);
	CString str;
	str.Format(L"实际:%d %d %d %d,转换:%d %d %d %d",m_ptrGL->pp[0].x,m_ptrGL->pp[0].y,m_ptrGL->pp[1].x,m_ptrGL->pp[1].y,
		p.x,p.y,p2.x,p2.y);
	MessageBox(str);*/
	int ttype;
	   if( fillset )
		  {
			  ttype=2;
			  if(rail) ttype=3;
	           fill_w=ptr_point.begin();
			    CDC*pDC=GetDC();
			    fillset=0;
				int size=ptr_point.size();
				pnt=new CPoint[size+1];
				int si=0;
				for(si=0,fill_w=ptr_point.begin();fill_w!=ptr_point.end();fill_w++)
					  pnt[si++]=*fill_w;
				Graph_Union sb(ttype,point_num,0,0,pnt,RGB(255,0,30),RGB(150,150,30));
                m_graphlist.push_back(sb);
				ptr_point.clear();
				if(!rail)
				{
					FillPoly_(pDC,pnt,point_num,RGB(150,150,30),RGB(255,0,30));
				}else{
					Point *rpp = new Point [point_num];
					for(int ii=0; ii<point_num; ii++)
					{
						rpp[ii].X = pnt[ii].x;
						rpp[ii].Y = pnt[ii].y;
					}
					DrawTracks(pDC, rpp,point_num, Color::Red, Color::Red); 
				}
				ReleaseDC(pDC);
				point_num=0;
				delete []pnt;
				Invalidate();
		  }
	   if(rail)
	   {
		   list<Graph_Union>::iterator tmp;
		   for(tmp=m_graphlist.begin();tmp!=m_graphlist.end();tmp++)
		   {
			   if(tmp->type==3)
			   {
				   for(int ii=0; ii<tmp->count-2;ii++)
				   {
						if(abs(abs((point.y-tmp->pp[ii].y)/(point.x-tmp->pp[ii].x))-abs((point.y-tmp->pp[ii+1].y)/(point.x-tmp->pp[ii+1].x)))<=0.1)
						{
							/*if(::MessageBox(NULL,L"aa",L"aa",1)!=IDOK)
							{
								int a;
							}*/
						}
				   }
			   }
		   }
	   }
	CScrollView::OnLButtonDblClk(nFlags, point);
}

void CGDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
	int ttype;
	// TODO: 在此添加消息处理程序代码和/或调用
	click_flag = 0;
	CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.DPtoLP(&point);

	if( choice && editpnt)
	{
		ReleaseCapture();

		CMainFrame*   MainFrame   =   (CMainFrame*)AfxGetMainWnd();	
		MainFrame->m_wndSplitter.DeleteView(1,0);
		switch( m_ptrGL->type)
		{case 0:
		   MainFrame->m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(LinePro2),CSize(400,10),NULL);
		   break;
		case 1:
		  MainFrame->m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CCirclePro),CSize(400,10),NULL);
		  break;
case 3:
		case 2:
			MainFrame->m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CPolPro),CSize(400,10),NULL);
		   break;
	   
		}
	    MainFrame->m_wndSplitter.RecalcLayout();
		editpnt=0;
		return ;
	}
	if( fillset )
	{
	  
	  if(point_num==0)
	  {
		  ptr_point.push_back(point);
		  first_draw=TRUE;
		  point_num++;

	  }
	  else 
	  {   
		  if(rail) ttype=3;
		  else ttype=2;
		  fill_w=ptr_point.begin();
		  if( abs(fill_w->x-point.x)<5&& abs(fill_w->y-point.y)<5 && point_num>1)
		  {
			    CDC*pDC=GetDC();
			    fillset=0;
				int size=ptr_point.size();
				pnt=new CPoint[size+1];
				int si=0;
				for(si=0,fill_w=ptr_point.begin();fill_w!=ptr_point.end();fill_w++)
					  pnt[si++]=*fill_w;
				
				ptr_point.clear();
				if(!rail)
				{
					FillPoly_(pDC,pnt,point_num,RGB(150,150,30),RGB(255,0,30));
					Graph_Union sb(ttype,point_num,0,0,pnt,RGB(255,0,30),RGB(150,150,30));
					m_graphlist.push_back(sb);
				}else{
					Point *rpp;
					if(settop)
					{
						rpp = new Point [point_num+1];
						for(int ii=0; ii<point_num; ii++)
						{
							rpp[ii].X = pnt[ii].x;
							rpp[ii].Y = pnt[ii].y;
						}
						rpp[point_num].X = pnt[0].x;
						rpp[point_num].Y = pnt[0].y;

						CPoint *pnt1=new CPoint[point_num+1];
						for(int ii=0; ii<point_num; ii++)
						{
							pnt1[ii].x = pnt[ii].x;
							pnt1[ii].y = pnt[ii].y;
						}
						pnt1[point_num].x = pnt[0].x;
						pnt1[point_num].y = pnt[0].y;

						DrawTracks(pDC, rpp,point_num+1, Color::Red, Color::Red); 
						Graph_Union sb(ttype,point_num+1,0,0,pnt1,RGB(255,0,30),RGB(150,150,30));
						m_graphlist.push_back(sb);
					}else{
						rpp = new Point [point_num];
						for(int ii=0; ii<point_num; ii++)
						{
							rpp[ii].X = pnt[ii].x;
							rpp[ii].Y = pnt[ii].y;
						}
						DrawTracks(pDC, rpp,point_num, Color::Red, Color::Red); 
						Graph_Union sb(ttype,point_num,0,0,pnt,RGB(255,0,30),RGB(150,150,30));
						m_graphlist.push_back(sb);
					}
				}
				ReleaseDC(pDC);
				Invalidate();
				point_num=0;
				delete []pnt;
		  }
		  else 
		  { 
			  fill_w=ptr_point.end();
			  fill_w--;
			  if( *fill_w!=point)
			  {
				  ptr_point.push_back(point);
			       point_num++;
			  }
		  }
	  }
	  settop=0;
	}
	else if( dline || breakline )
	{
		ReleaseCapture();
		click=FALSE;

		CPoint p[2]={CPoint(click_down.x ,click_down.y),CPoint(tmp_point.x,tmp_point.y)};
		if( dline )
		{
			Graph_Union line(0,2,1,0,p,RGB(0,0,0),RGB(0,0,0));
			m_graphlist.push_back (line);
		
			Invalidate();
			//ShowGU(GetDC(),line);
			/*	CPoint a=p[0];
				CPoint b=p[1];
				CClientDC dc(this);
				OnPrepareDC(&dc);
				dc.LPtoDP(&a);
				dc.LPtoDP(&b);
				CString str;
				str.Format(L"%d %d %d %d",a.x,a.y,b.x,b.y);
				MessageBox(str);*/
		}
		else
		{
			Graph_Union line(0,2,1,1,p,RGB(0,0,0),RGB(0,0,0));
			m_graphlist.push_back (line);
					Invalidate();
           // ShowGU(GetDC(),line);
		}
	}
	else if(select && type==0 )
	{  
			ReleaseCapture();	
			end_point=point;
			int kx=end_point.x-start_point.x;
			int ky=end_point.y-start_point.y;
			m_ptrGL->pp[0].x+=kx;
			m_ptrGL->pp[0].y+=ky;
			m_ptrGL->pp[1].x+=kx;
			m_ptrGL->pp[1].y+=ky;	  
			CMainFrame*   MainFrame   =   (CMainFrame*)AfxGetMainWnd();	
		    LinePro2  *SET=(LinePro2*) MainFrame->m_wndSplitter.GetPane(1,0);
			UpdateData(true);
			 SET->SetDlgItemInt(IDC_STRATX,m_ptrGL->pp[0].x,1);
			 SET->SetDlgItemInt(IDC_STRATY,m_ptrGL->pp[0].y,1);
			 SET->SetDlgItemInt(IDC_ENDX,m_ptrGL->pp[1].x,1);
			 SET->SetDlgItemInt(IDC_ENDY,m_ptrGL->pp[1].y,1);  
			Invalidate();
          /*  CDC *pdc=GetDC();
            ShowGU(pdc,*m_ptrGL,RGB(255,0,0));
            ReleaseDC(pdc);	*/
	}
	else if(select && type==1)
	{	
		    ReleaseCapture();
		    type=0;
			end_point=point;	  
			CMainFrame*   MainFrame   =   (CMainFrame*)AfxGetMainWnd();	
		    CCirclePro  *SET=(CCirclePro*) MainFrame->m_wndSplitter.GetPane(1,0);
			 UpdateData(true);
			 SET->SetDlgItemInt(IDC_EDIT1,m_ptrGL->pp[0].x,1);
			 SET->SetDlgItemInt(IDC_EDIT2,m_ptrGL->pp[0].y,1);
			 SET->SetDlgItemInt(IDC_EDIT5,m_ptrGL->shape,1);
			 SET->SetDlgItemInt(IDC_EDIT6,m_ptrGL->wide,1);  
			Invalidate();
	}
	else if(	    select && type==3 ||select && type==2)
	{	
		    ReleaseCapture();
		    type=-1; 
			Invalidate();
	}
	CScrollView::OnLButtonUp(nFlags, point);
}
void CGDrawView::ShowGU(CDC * pDC,Graph_Union& gu) 
{
		switch(gu.type )
		{
		case 0:
			DrawLine(pDC,gu.pp[0].x,gu.pp[0].y,gu.pp[1].x,
				gu.pp[1].y,gu.color ,gu.shape ,gu.wide );
			break;
		case 1:
			drawcircle(pDC,gu.pp[0].x,gu.pp[0].y,gu.shape,gu.color,gu.wide);				
			break;
		case 2:
			/*if(!rail)
			{
				FillPoly_(pDC,gu.pp,gu.count,gu.fill_color,gu.color);
			}else{
				Point *rpp = new Point [gu.count];
				for(int ii=0; ii<gu.count; ii++)
				{
					rpp[ii].X = gu.pp[ii].x;
					rpp[ii].Y = gu.pp[ii].y;
				}
				DrawTracks(pDC, rpp,gu.count, Color::Red, Color::Red); 
			}*/
			FillPoly_(pDC,gu.pp,gu.count,gu.fill_color,gu.color);
			break;
		case 3:
			{
				Point *rpp = new Point [gu.count];
				for(int ii=0; ii<gu.count; ii++)
				{
					rpp[ii].X = gu.pp[ii].x;
					rpp[ii].Y = gu.pp[ii].y;
				}
				DrawTracks(pDC, rpp,gu.count, Color::Red, Color::Red); 
			}
		default:break;
		}
}
void CGDrawView::del(CDC *pDC, Graph_Union &gu) 
{
	switch(gu.type )
		{
		case 0:
			DrawLine(pDC,gu.pp[0].x,gu.pp[0].y,gu.pp[1].x,
				gu.pp[1].y,bg_color ,gu.shape ,gu.wide );
			pDC->FillSolidRect (gu.pp [0].x,gu.pp[0].y,4,4,gu.color);
			pDC->FillSolidRect (gu.pp [1].x,gu.pp[1].y,4,4,bg_color);
			break;
		default:break;
		}
}

void CGDrawView::ShowGU(CDC *pDC, Graph_Union &gu, COLORREF col) 
{
	switch(gu.type )
		{
		case 0:
			DrawLine(pDC,gu.pp[0].x,gu.pp[0].y,gu.pp[1].x,
				gu.pp[1].y,gu.color ,gu.shape ,gu.wide );
			pDC->FillSolidRect (gu.pp [0].x,gu.pp[0].y,4,4,RGB(255,0,0));
			pDC->FillSolidRect (gu.pp [1].x,gu.pp[1].y,4,4,RGB(255,0,0));
			break;
		default:break;
		}
}

void CGDrawView::deletepoint(CDC *pDC, Graph_Union &gu) 
{
	switch(gu.type )
		{
		case 0:
			pDC->FillSolidRect (gu.pp [0].x,gu.pp[0].y,4,4,bg_color);
			pDC->FillSolidRect (gu.pp [1].x,gu.pp[1].y,4,4,bg_color);
			DrawLine(pDC,gu.pp[0].x,gu.pp[0].y,gu.pp[1].x,
				gu.pp[1].y,gu.color ,gu.shape ,gu.wide );
			break;
		default:break;
		}
}

void CGDrawView::savebmp(CString filename)
{
	dline=0;
	breakline=0;
    select=0;
	fillset=0;
     int iWidth =width;
	int iHeight =height;
    int iPixel  = 16;
	//图形格式参数
    LPBITMAPINFO lpbmih = new BITMAPINFO;
    lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmih->bmiHeader.biWidth = iWidth;
    lpbmih->bmiHeader.biHeight = iHeight;
    lpbmih->bmiHeader.biPlanes = 1;
    lpbmih->bmiHeader.biBitCount = iPixel;
    lpbmih->bmiHeader.biCompression = BI_RGB;
    lpbmih->bmiHeader.biSizeImage = 0;
    lpbmih->bmiHeader.biXPelsPerMeter = 0;
    lpbmih->bmiHeader.biYPelsPerMeter = 0;
    lpbmih->bmiHeader.biClrUsed = 0;
    lpbmih->bmiHeader.biClrImportant = 0;

    //创建位图数据
    HDC hdc,hdcMem;
    HBITMAP hBitMap = NULL;
    CBitmap *pBitMap = NULL;
    CDC *pMemDC = NULL;
    BYTE *pBits;

    hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
    hdcMem = CreateCompatibleDC(hdc);
    hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
    pBitMap = new CBitmap;
    pBitMap->Attach(hBitMap);
    pMemDC = new CDC;
    pMemDC->Attach(hdcMem);
    pMemDC->SelectObject(pBitMap);
	CRect rc(0,0,iWidth,iHeight);
	pMemDC->SetBkMode(TRANSPARENT);

    //添加自绘图形 
	list<Graph_Union>::iterator w;
	CRect rect(0,0,width,height);
	CBrush brush(bg_color);
	pMemDC->FillRect(rect,&brush);
	for(w=m_graphlist.begin ();w!=m_graphlist.end();w++)
		ShowGU(pMemDC,*w);

    //保存到文件并创建位图结构
    BITMAPFILEHEADER bmfh;
    ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
    *((char *)&bmfh.bfType) = 'B';
    *(((char *)&bmfh.bfType) + 1) = 'M';
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;

    int iBMPBytes = iWidth * iHeight * iPixel / 8;
   // strcpy(szBMPFileName,filename);
    CFile file;
    if(file.Open(filename,CFile::modeWrite | CFile::modeCreate))
    {
        file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
        file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
        file.Write(pBits,iBMPBytes);
        file.Close();
    }
    pMemDC->DeleteDC();
    delete pMemDC;	pMemDC  = NULL;
    delete pBitMap; pBitMap = NULL;
    delete lpbmih;  lpbmih  = NULL;
}

void CGDrawView::testdraw(CDC *pDC, CRect rcClient)
{
    CBrush brushCtl;
	brushCtl.CreateSolidBrush(RGB(255,255,255));
  	pDC->Rectangle(rcClient);
	pDC->FillRect(rcClient,&brushCtl) ;
	brushCtl.DeleteObject();
}
void CGDrawView::show(CDC *pDC)
{
}

void CGDrawView::OnSave()
{
	// TODO: 在此添加命令处理程序代码
   fillset=0;
   dline=0;
   breakline=0;

	CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		L"位图文件(*.bmp)|*.bmp|",
		NULL);
	if (dlg.DoModal()!= IDOK) return;
	CString filename = dlg.GetFileName() + L".bmp";
	savebmp(filename);	
}

void CGDrawView::OnAllsave()
{ 
	fillset=0;
	dline=0;
    breakline=0;
    Invalidate();
}

void CGDrawView::OnHide()
{
	// TODO: 在此添加命令处理程序代码
  CMainFrame*   MainFrame = (CMainFrame*)AfxGetMainWnd();
  if(hide==0)
  {
	CRect rect;
	GetClientRect(&rect);
	CSize size=rect.Size();
	MainFrame->m_wndSplitter.SetRowInfo(0,(int)rect.Height()*2,0);
	MainFrame->m_wndSplitter.RecalcLayout();
	hide=1;
  }
  else
  {
	CRect rect;
	GetClientRect(&rect);

⌨️ 快捷键说明

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