📄 paintdoc.cpp
字号:
if(!OpenClipboard(NULL))//打开剪裁板
{
delete []p_Char;
return FALSE;
}
::EmptyClipboard();//清空剪裁板
//将全局堆内的字符串以DrawFormat格式存入剪裁板
::SetClipboardData(DrawFormat,HMem);
::SetClipboardData(CF_TEXT,HMem);
HMem=0;
::CloseClipboard();//关闭剪裁板
delete []p_Char;
return TRUE;
}
BOOL CPaintobjDoc::ReadClipBoard()
{
int n_Num[2];//存储各图形元素数量的数组
double minx,miny;
HANDLE HClipText;
char *PClipText;
char *CharTemp,*p_Char;
if(!OpenClipboard(NULL))//打开剪裁板
return FALSE;
//读取DrawFormat格式的数据,成功则得到指向数据的句柄
HClipText=::GetClipboardData(DrawFormat);
if(HClipText==NULL)
{
return FALSE;
}
//给字符串指针分配能够存储句柄指向数据的空间
CharTemp=new char[::GlobalSize(HClipText)];
if(CharTemp==0)
{
::CloseClipboard();//关闭剪裁板
return FALSE;
}
PClipText=(char *)::GlobalLock(HClipText);//锁定句柄
if(PClipText==NULL)
{
return FALSE;
}
::lstrcpy(CharTemp,PClipText);//将句柄指向的剪裁板数据拷贝到字符串
::GlobalUnlock(HClipText);//打开对句柄的锁定
::CloseClipboard();//关闭剪裁板
p_Char=CharTemp;//将字符串指针指向字符串
//读出并得到各图形元素的数量
char p1[11];
strncpy(p1,p_Char,10);
p_Char+=10;
p1[10]=0;
sscanf(p1,"%d,%d\n",&n_Num[0],&n_Num[1]);
//读出插入点的坐标
char p3[27];
strncpy(p3,p_Char,26);
p_Char+=26;
p3[26]=0;
sscanf(p3,"%f,%f\n",&minx,&miny);
//得到插入点与图形元素基点的相对偏移
minx=minx;
miny=miny;
//以下根据图形元素的数目创建图形元素对象,并将图形元素对
//象指针加入到记录图形元素对象指针的数组,调用toData函数
//从字符串中读出并初始化数据成员,并对图形元素对象作相对
//于插入点和基点的移动
for(int i=0;i<2;i++)//只有两种图形元素对象,多则循环多次
{
for(int j=0;j<n_Num[i];j++)
{
if(i==0)//如果是直线
{
m_pSelectedTool= new CPaintLine();//创建一个直线对象
m_Objects.Add(m_pSelectedTool);//将对象指针加入对象数组
p_Char=m_pSelectedTool->toData(p_Char);//从字符串中读出并初始化数据成员
m_pSelectedTool->m_uFigureType=0;
m_pSelectedTool->m_uPathId=m_uCurPathIdMax;
m_uCurPathIdMax++;
m_pSelectedTool->m_bSelect=TRUE;
m_pSelectedTool->Move(1.0,-1.0);//移动图形元素
int index1=m_Objects.GetSize();
BOOL bbb=AddSelectList(0,index1-1);
m_pSelectedTool=NULL;
}
else if(i==1)//如果是圆弧
{
m_pSelectedTool= new CPaintArc();//创建一个圆弧对象
m_Objects.Add(m_pSelectedTool);//将对象指针加入对象数组
p_Char=m_pSelectedTool->toData(p_Char);//从字符串中读出并初始化数据成员
m_pSelectedTool->m_uFigureType=1;
m_pSelectedTool->m_uPathId=m_uCurPathIdMax;
m_uCurPathIdMax++;
m_pSelectedTool->m_bSelect=TRUE;
m_pSelectedTool->Move(1,-1);//移动图形元素
int index1=m_Objects.GetSize();
BOOL bbb=AddSelectList(1,index1-1);
m_pSelectedTool=NULL;
}
}
}
delete []CharTemp;
return TRUE;
}
//存储选中的图形元素
BOOL CPaintobjDoc::AddSelectList(UINT Type, UINT Index)
{
for(int i=0;i<m_nGraphSelect;i++)//判断此图形元素是否已经被选中
{ //如果已经被选中,则不进行存储
if((Type==GraphSelect[i].Type) && (Index==GraphSelect[i].Index))
return FALSE;
}
//如果以前没有被选中,则进行存储,并使选中图形数目加1
GraphSelect[m_nGraphSelect].Type=Type;
GraphSelect[m_nGraphSelect].Index=Index;
m_nGraphSelect++;
return TRUE;
}
void CPaintobjDoc::OnUpdateViewMove(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_nGraphSelect);
pCmdUI->SetCheck(m_bMove);
}
void CPaintobjDoc::OnViewMove()
{
// TODO: Add your command handler code here
m_bMove= TRUE;//移动图形
m_nSelectedTool = IDC_CURSORMOVE;
GenerateTool();
}
void CPaintobjDoc::GetSelectedBounds(double &xmin,double &xmax,double &ymin,double &ymax)
{
double minx,maxx,miny,maxy;
for(int i=0;i<m_nGraphSelect;i++)
{ double minx1,miny1,maxx1,maxy1;
CPainted* pPainted;
pPainted =GetShape(GraphSelect[i].Index);
pPainted->GetBoundingRect(minx1,miny1,maxx1,maxy1);
if(i==0)//如果是第一个图形元素
{ minx=minx1;
miny=miny1;
maxx=maxx1;
maxy=maxy1;
}
else//不是第一个图形元素,比较得到边界
{
if(minx>minx1) minx=minx1;
if(miny>miny1) miny=miny1;
if(maxx<maxx1) maxx=maxx1;
if(maxy<maxy1) maxy=maxy1;
}
}
xmin=minx;
ymin=miny;
xmax=maxx;
ymax=maxy;
}
void CPaintobjDoc::OnSelectTangency()
{
// TODO: Add your command handler code here
m_bBrushwork=TRUE;//画法选择TRUE为相切画法
}
void CPaintobjDoc::OnUpdateSelectTangency(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bBrushwork);
}
void CPaintobjDoc::OnSelectNottangency()
{
// TODO: Add your command handler code here
m_bBrushwork=FALSE;//画法选择TRUE为相切画法
}
void CPaintobjDoc::OnUpdateSelectNottangency(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(!m_bBrushwork);
}
//得到m_uCurPathIdMax其值比最大的路径编号大1。
void CPaintobjDoc::GetPathIdMax()
{
int max0=0;
CPainted* pPainted;
int nShapes = m_Objects.GetSize();
if(nShapes==0)
{
m_uCurPathIdMax=0;
}
else
{
for (int index = 0; index < nShapes; index++)
{
pPainted =(CPainted*) m_Objects[index];
int max1=pPainted->m_uPathId;
max0=max(max0, max1);
}
m_uCurPathIdMax=max0+1;
}
}
//得到m_uCurNodeIdMax其值比最大的节点编号大1。
void CPaintobjDoc::GetNodeIdMax()
{
int max0=0;
CPainted* pPainted;
int nShapes = m_Objects.GetSize();
if(nShapes==0)
{
m_uCurNodeIdMax=0;
}
else
{
for (int index = 0; index < nShapes; index++)
{
pPainted =(CPainted*) m_Objects[index];
int max1=pPainted->m_uStartNodeId;
max0=max(max0, max1);
int max2=pPainted->m_uEndNodeId;
max0=max(max0, max2);
}
m_uCurNodeIdMax=max0+1;
}
}
void CPaintobjDoc::OnToolLineNormal()
{
// TODO: Add your command handler code here
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool =ID_TOOL_LINE_NORMAL;
m_PathPaintMode=0;//直线的绘制模式
GenerateTool();
}
void CPaintobjDoc::OnToolLineStartnode()
{
// TODO: Add your command handler code here
CInputLineStartNode lll;
int result=lll.DoModal(m_nGraphSelect);
if(result==IDOK)
{
m_pPaintStartNode.x=lll.m_startx;//绘图时给定的起点
m_pPaintStartNode.y=lll.m_starty;//绘图时给定的起点
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool =ID_TOOL_LINE_STARTNODE;
m_PathPaintMode=1;//直线的绘制模式
}
GenerateTool();
}
void CPaintobjDoc::OnToolLineStartendnode()
{
// TODO: Add your command handler code here
CInputLineStartEndNode lll;
if(lll.DoModal(m_nGraphSelect,m_banglelengthok)==IDOK)
{
m_pPaintStartNode.x=lll.m_uStartx;//绘图时给定的起点
m_pPaintStartNode.y=lll.m_uStarty;//绘图时给定的起点
m_pPaintEndNode.x=lll.m_uEndx;//绘图时给定的终点
m_pPaintEndNode.y=lll.m_uEndy;//绘图时给定的终点
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool =ID_TOOL_LINE_STARTENDNODE;
m_PathPaintMode=2;//直线的绘制模式
}
GenerateTool();
}
void CPaintobjDoc::OnToolLineAnglelength()
{
// TODO: Add your command handler code here
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool =ID_TOOL_LINE_ANGLELENGTH;
m_PathPaintMode=3;
/* CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
//CButton* bu=(CButton*)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_CHECKED));
CComboBox * pcom1=(CComboBox *)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_COMBO1));
CEdit * angle=(CEdit *)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_ANGLE));
CEdit * length=(CEdit *)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_LENGTH));
pcom1->EnableWindow();
angle->EnableWindow();
length->EnableWindow();
*/ GenerateTool();
}
void CPaintobjDoc::OnToolClockwiseNormal()
{
// TODO: Add your command handler code here
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_CLOCKWISE_NORMAL;
m_PathPaintMode=4;//圆弧的绘制模式
GenerateTool();
}
void CPaintobjDoc::OnToolClockwiseRadius()
{
// TODO: Add your command handler code here
CInputArcRadius lll;
if(lll.DoModal()==IDOK)
{
m_dPaintRadius=lll.m_dRadius;
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_CLOCKWISE_RADIUS;
m_PathPaintMode=5;//圆弧的绘制模式
}
GenerateTool();
}
void CPaintobjDoc::OnToolClockwiseStartnode()
{
// TODO: Add your command handler code here
CInputArcStartNode lll;
if(lll.DoModal(m_nGraphSelect)==IDOK)
{
m_dPaintRadius=lll.m_dRadius;
m_pPaintStartNode.x=lll.m_dStartx;//绘图时给定的起点
m_pPaintStartNode.y=lll.m_dStarty;//绘图时给定的起点
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_CLOCKWISE_STARTNODE;
m_PathPaintMode=6;//圆弧的绘制模式
}
GenerateTool();
}
void CPaintobjDoc::OnToolClockwiseStartendnode()
{
// TODO: Add your command handler code here
CInputArcStartEndNode lll;
if(lll.DoModal(m_nGraphSelect)==IDOK)
{
m_dPaintRadius=lll.m_dRadius;
m_pPaintStartNode.x=lll.m_dStartx;//绘图时给定的起点
m_pPaintStartNode.y=lll.m_dStarty;//绘图时给定的起点
m_pPaintEndNode.x=lll.m_dEndx;//绘图时给定的终点
m_pPaintEndNode.y=lll.m_dEndy;//绘图时给定的终点
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_CLOCKWISE_STARTENDNODE;
m_PathPaintMode=7;//圆弧的绘制模式
}
GenerateTool();
}
void CPaintobjDoc::OnToolAnticlockwiseNormal()
{
// TODO: Add your command handler code here
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_ANTICLOCKWISE_NORMAL;
m_PathPaintMode=8;//圆弧的绘制模式
GenerateTool();
}
void CPaintobjDoc::OnToolAnticlockwiseRadius()
{
// TODO: Add your command handler code here
CInputArcRadius lll;
if(lll.DoModal()==IDOK)
{
m_dPaintRadius=lll.m_dRadius;
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSelectedTool = ID_TOOL_ANTICLOCKWISE_RADIUS;
m_PathPaintMode=9;//圆弧的绘制模式
}
GenerateTool();
}
void CPaintobjDoc::OnToolAnticlockwiseStartnode()
{
// TODO: Add your command handler code here
CInputArcStartNode lll;
if(lll.DoModal(m_nGraphSelect)==IDOK)
{
m_dPaintRadius=lll.m_dRadius;
m_pPaintStartNode.x=lll.m_dStartx;//绘图时给定的起点
m_pPaintStartNode.y=lll.m_dStarty;//绘图时给定的起点
m_bZoomIn= FALSE;
m_bZoomOut= FALSE;
m_nSele
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -