MFC画图问题

在MFC中画一个圆,然后拖过鼠标来拖动该圆。该过程中的坐标是如何转换的?谢谢!... 在MFC中画一个圆,然后拖过鼠标来拖动该圆。
该过程中的坐标是如何转换的?
谢谢!
展开
 我来答
智勇三国4
2013-05-16
知道答主
回答量:11
采纳率:0%
帮助的人:11.1万
展开全部

刚刚给你弄的,有详细过程和源码

 

1,需求

a,显示圆

b,移动圆

2,概要设计

a,已知圆心和半径,显示圆

b,单击圆开始移动,再次单击结束移动

3,详细设计

a,如果一个点到圆心的距离等于(小于)半径,则在圆上(圆内)。

b,移动过程中以虚线显示。

4,编码

1,新建一个单文档程序Yuan。

2,CYuanView内增加三个变量:

 CPoint  m_pt;//圆心

 int  m_iR;//半径

 BOOL m_bMove;//是不是在移动

3,构造函数中初始化。

CYuanView::CYuanView()

{

 m_pt = CPoint(60,60);

 m_iR = 50 ;

 m_bMove = FALSE ;

}

4,显示圆

void CYuanView::OnDraw(CDC* pDC)

{

 CPen pen(m_bMove?PS_DOT:PS_SOLID,1,RGB(0,0,0));

 pDC->SelectObject(&pen);

 pDC->Ellipse(m_pt.x-m_iR,m_pt.y-m_iR,m_pt.x+m_iR,m_pt.y+m_iR);

}

5,移动

#include "math.h"

int GetJuLi(const CPoint pt1,const CPoint pt2) //两点间的距离

{

 return sqrt((pt1.x-pt2.x)*(pt1.x-pt2.x) + (pt1.y-pt2.y)*(pt1.y-pt2.y));

}

 

void CYuanView::OnLButtonDown(UINT nFlags, CPoint point) 

 CView::OnLButtonDown(nFlags, point);

 if( !m_bMove )

 {//开始移动

  if(GetJuLi(point,m_pt) <= m_iR)

  {

   m_pt = point;

   m_bMove = TRUE ;

  }

 }

 else

 {//结束移动

  m_pt = point;

  m_bMove = FALSE ;

  Invalidate();

 }

}

6,移动过程中

void CYuanView::OnMouseMove(UINT nFlags, CPoint point) 

{

 CView::OnMouseMove(nFlags, point);

 if( m_bMove )

 {

  m_pt = point ;

  Invalidate();

 }

}

 

已知问题:

移动开始后无法取消。

 

 

 

源码:

bhtzu
2013-05-16 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4228万
展开全部
通过OnMouseMove的起点和终点来计算的,可以在OnMouseMove里面判断鼠标左键状态记录两个点,也可以在鼠标响应函数OnLButtonDown/Up里面记录起点终点。
移动位置就是初始(原)位置,减去起点终点的差值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tbyang2011
2013-05-16 · TA获得超过681个赞
知道小有建树答主
回答量:778
采纳率:50%
帮助的人:343万
展开全部
1、声明全局变量
XFORM g_XF={1,0, 0,1, -1E-8,0,};
int cx=0, cy=0;

2、在WM_PAINT消息中实施坐标变换:
(如果你喜欢用MFC, 大概就在 OnPaint消息处理函数中执行)

::SetGraphicsMode(hdc,GM_ADVANCED); // SetWorldTransform will fail unless the graphics mode for the given device context has been set to GM_ADVANCED.
::SetWorldTransform(hdc,&g_XF);

3、最后处理WM_MOUSEMOVE消息
(如果你喜欢用MFC, 大概就在 OnMouseMove消息处理函数中执行)

case WM_MOUSEMOVE:{
int x=LOWORD(lParam), y=HIWORD(lParam); if(x==cx && y==cy) break;
int dx=x-cx, dy=y-cy;
g_XF.eDx+=dx; g_XF.eDy+=dy;

cx=x; cy=y;
InvalidateRect(hWnd,0,true); return 0;
}break;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
归悦欣cf
2013-05-16 · TA获得超过1444个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1329万
展开全部
改变圆的中心点重复画圆就可以。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式