CDialogBar为基类的对话框,用对话框绘制圆已经实现。但用鼠标直接在视图中绘制圆不知道怎样做?请教高人 CDialogBar为基类的对话框,用对话框绘制圆已经实现,但用鼠标直接在视图中绘制圆不知道怎样做?请教高人。请大家详细点,我一定会给分的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先明确鼠标绘图的操作,我设计如下: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方式。 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); } 关于MFC 劳驾各位大神帮忙 看看有什么办法? 救急——类之间变量的传递。真心谢谢大哥们了。 在MFC下进行TCP连接遇到的问题?? 帮忙看一下这个问题! 高手给个不使用mfc、不使用向导,在命令行程序中创建一个window或者dialog的代码,谢谢!!! ■■■有一个叫着"无忧登录"的软件,功能如下,大家分析下它是怎么实现的? 哪里能免费下载电影呀? 谁可以救我的数据啊!-硬盘没有格式化或者己破坏 菜鸟求助,关于serilize的问题 多线程问题 初学者的数据库的问题? 如何将rational rose2000升级,对oracle9i,Vs7支持呢?
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方式。
//过两点画圆
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);
}