CDialogBar为基类的对话框,用对话框绘制圆已经实现。但用鼠标直接在视图中绘制圆不知道怎样做?请教高人

jk11100 2003-08-18 05:38:39
CDialogBar为基类的对话框,用对话框绘制圆已经实现,但用鼠标直接在视图中绘制圆不知道怎样做?请教高人。
请大家详细点,我一定会给分的。
...全文
53 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrcluomo 2003-08-19
  • 打赏
  • 举报
回复
有点乱,可以精简。
wrcluomo 2003-08-19
  • 打赏
  • 举报
回复
mousemove:
//过两点画圆
if(m_Circle1)
{
//擦去上次的画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_OldEnd.x ,m_OldEnd.y );
//重新绘画
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_End.x ,m_End.y );
int r=(int)sqrt((m_OldEnd.x-m_Begin.x)*(m_OldEnd.x-m_Begin.x)+(m_OldEnd.y-m_Begin.y)*(m_OldEnd.y-m_Begin.y))/2;
int r1=(int)sqrt((m_End.x-m_Begin.x)*(m_End.x-m_Begin.x)+(m_End.y-m_Begin.y)*(m_End.y-m_Begin.y))/2;
CPoint cpoint,point1,point11,point2,point22;
cpoint.x=(m_OldEnd.x+m_Begin.x)/2;
cpoint.y=(m_OldEnd.y+m_Begin.y)/2;
cpoint.Offset(-r,-r);
point1=cpoint;
cpoint.x=(m_OldEnd.x+m_Begin.x)/2;
cpoint.y=(m_OldEnd.y+m_Begin.y)/2;
cpoint.Offset(r,r);
point11=cpoint;
cpoint.x=(m_End.x+m_Begin.x)/2;
cpoint.y=(m_End.y+m_Begin.y)/2;
cpoint.Offset(-r1,-r1);
point2=cpoint;
cpoint.x=(m_End.x+m_Begin.x)/2;
cpoint.y=(m_End.y+m_Begin.y)/2;
cpoint.Offset(r1,r1);
point22=cpoint;
pdc->Ellipse(CRect(point1,point11));//擦去上次的画
pdc->Ellipse(CRect(point2,point22));//重新绘画
}
lbuttondown:
if(m_Circle1)
{

m_OldDrawMode=pdc->SetROP2(R2_NOTXORPEN);
//pen.CreatePen(PenStyle,PenWidth,m_PenColor); //PS_SOLID
// OldPen=pdc->SelectObject(&pen);
//重新绘画
//pdc->MoveTo(m_Begin.x ,m_Begin.y );
// pdc->LineTo(m_OldEnd.x ,m_OldEnd.y );
pdc->MoveTo(m_Begin.x ,m_Begin.y );
pdc->LineTo(m_End.x ,m_End.y );
if(m_LineMeasure)
{
//m_pGridCtrl->SetItemText(0, 1,"直径");
int InsertRow;
double LineLen;
CString strMessage;
strMessage.Format (_T ("%d"),m_pGridCtrl->GetRowCount());
InsertRow=m_pGridCtrl->InsertRow(strMessage, -1);//-1为在最后增加一行
LineLen=sqrt((m_End.x-m_Begin.x-1)*(m_End.x-m_Begin.x-1)*CurrentScaler.HCoefficient*CurrentScaler.HCoefficient+(m_End.y-m_Begin.y-1)*(m_End.y-m_Begin.y-1)*CurrentScaler.VCoefficient*CurrentScaler.VCoefficient);
strMessage.Format (_T ("%.4f"),LineLen);
m_pGridCtrl->SetItemText(InsertRow, 1,strMessage);
m_pGridCtrl->RedrawRow(InsertRow);
}
pdc->SetROP2(m_OldDrawMode);
// pdc->SelectObject(OldPen);
//pen.DeleteObject();
CBrush Brush,*OldBrush;
OldBrush=(CBrush*)pdc->SelectStockObject(NULL_BRUSH);
int r1=(int)sqrt((m_End.x-m_Begin.x)*(m_End.x-m_Begin.x)+(m_End.y-m_Begin.y)*(m_End.y-m_Begin.y))/2;
CPoint cpoint,point2,point22;

cpoint.x=(m_Begin.x+m_End.x)/2;
cpoint.y=(m_Begin.y+m_End.y)/2;
//cpoint=m_Begin;
cpoint.Offset(-r1,-r1);
point2=cpoint;
cpoint.x=(m_Begin.x+m_End.x)/2;
cpoint.y=(m_Begin.y+m_End.y)/2;
//cpoint=m_Begin;
cpoint.Offset(r1,r1);
point22=cpoint;
//重新绘画
pdc->Ellipse(CRect(point2,point22));
//将直线画到图形上
// if(!m_LineMeasure)
// {
// CBrush *OldMemBrush;
// OldMemBrush=(CBrush*)pMemDC->SelectStockObject(NULL_BRUSH);
// pMemDC->Ellipse(point2.x+ScrollPoint.x,point2.y+ScrollPoint.y,point22.x+ScrollPoint.x,point22.y+ScrollPoint.y);
// pMemDC->SelectObject(OldMemBrush);
//}
pdc->SelectObject(OldBrush);
}
Napoleo 2003-08-19
  • 打赏
  • 举报
回复
一句话:
在鼠标事件中画图
Sportbeuty 2003-08-18
  • 打赏
  • 举报
回复
这个很多书有例程序的,北京希望电子出版社的数字图象处理学,就有。我看过,记得和楼上的大侠说得差不多。^_^
Sportbeuty 2003-08-18
  • 打赏
  • 举报
回复
这个很多书有例程序的,北京希望电子出版社的数字图象处理学,就有。我看过,记得和楼上的大侠说得差不多。^_^
GZCompiler 2003-08-18
  • 打赏
  • 举报
回复
首先明确鼠标绘图的操作,我设计如下:
1. 按下左键确定圆心;
2. 按住左键拖动出半径,同时画临时圆;
3. 松开左键确定半径,画出最终的圆。

实现方法:
1. 按下左键确定圆心;
在OnLeftBtnDown消息中,记录point.x与point.y作为圆心,保存在某个POINT变量中;

2. 按住左键拖动出半径,同时画临时圆;
在OnMouseMove消息中:
根据上一次的鼠标point,与先前记录的圆心,用CDC::SetROP2(R2_NOT)方式绘制圆形(达到擦除目的);
记录当前鼠标point坐标,以便下次清除临时圆;
根据当前鼠标point,与先前记录的圆心,用CDC::SetROP2(R2_NOT)方式绘制新的圆形;

3. 松开左键确定半径,画出最终的圆。
在OnLeftBtnUp函数中:
根据鼠标point和先前记录的半径,用黑色绘制永久圆形。注意:此时不用R2_NOT方式。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧