📄 gdrawview.cpp
字号:
}
}
}
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 + -