如何获取鼠标点击所在点的坐标?

chenthree723 2012-08-03 04:35:40
具体情况是我要利用ONLBUTTONDOWN和ONMOUSEMOVE画一条折线,并计算这条折线的函数表达式。所以在点击鼠标的时候,需要记录每一个点击左键时候的点的坐标,放进一个动态数组里。下面是我的代码,哪个地方出错了?


void CWaveTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

// CString sMousePos;
// sMousePos.Format("x=%d,y=%d",point.x,point.y);
// GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(sMousePos);

if (m_OnDrawLine == TRUE)
{
int nPointCount = 0;

CPoint *pDrawPoint = new CPoint[];

if(nFlags==MK_LBUTTON) //按下左键
{
CPen pen,cpen;
pen.CreatePen(PS_SOLID,4,RGB(0,0,0));
cpen.CreatePen(PS_SOLID,2,RGB(0,0,255));

m_PtOld = point;//鼠标当前位置相对下一次移动的位置是“旧位置”

CClientDC dc(this);
dc.SetROP2(R2_NOT);
dc.SelectObject(&pen);
dc.MoveTo(m_PtStart);
dc.LineTo(m_PtOld);
dc.MoveTo(m_PtStart);
dc.LineTo(point);

nPointCount++;
}

for (int i=0;i<nPointCount;i++)
{
pDrawPoint[i] = point;
}

}



CView::OnMouseMove(nFlags, point);
}

另外,上面有段被注释掉的代码,是想显示鼠标当前位置的坐标,但是在运行的时候,会提示“UNHANDLED EXCEPTION IN xxxx.exe access violation”,请帮忙一并解决,我新人,分不多。谢谢!
...全文
1588 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2012-08-03
  • 打赏
  • 举报
回复
稍微整理一下

class CWaveTestDoc : public CDocument
{
public:
CArray< POINT, const POINT& >PointArray;
POINT PointLastActive, PointLast;

……



//WM_PAINT中绘制所有点
void CWaveTestView::OnDraw(CDC* pDC)
{
CWaveTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

//添加绘制背景代码
CRect rcClient;
GetClientRect(&rcClient);
pDC->FillSolidRect(rcClient, RGB(255,255,255));

// TODO: 在此处为本机数据添加绘制代码
if(pDoc->PointArray.GetSize() > 1)
{
CPen LinePen(PS_SOLID, 1, RGB(255,0,0));
CPen *pOldPen = pDC->SelectObject(&LinePen);
pDC->MoveTo(pDoc->PointArray[0]);

for(INT_PTR iPos=1; iPos<pDoc->PointArray.GetSize(); iPos++)
{
pDC->LineTo(pDoc->PointArray[iPos]);
}
pDC->SelectObject(pOldPen);
}
}

//左键点下加入新点
void CWaveTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWaveTestDoc* pDoc = GetDocument();
pDoc->PointArray.Add(point);
pDoc->PointLast = pDoc->PointLastActive = point;
InvalidateRect(NULL, TRUE);

CView::OnMButtonDown(nFlags, point);
}

//移动鼠标时绘制从最后一点到当前鼠标点的线
void CWaveTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWaveTestDoc* pDoc = GetDocument();
if(pDoc->PointArray.GetSize())
{
if(point != pDoc->PointLast)
{
CClientDC dc(this);
CDC *pDC = &dc;

CPen LinePen(PS_SOLID, 5, RGB(255,0,0));
CPen *pOldPen = pDC->SelectObject(&LinePen);

int rop2 = pDC->SetROP2(R2_XORPEN);

pDC->MoveTo(pDoc->PointLastActive);
pDC->LineTo(pDoc->PointLast);

pDC->MoveTo(pDoc->PointLastActive);
pDC->LineTo(point);

pDoc->PointLast = point;

pDC->SetROP2(rop2);
pDC->SelectObject(pOldPen);

//InvalidateRect(NULL);
}
}

CView::OnMouseMove(nFlags, point);
}

//右键双击取消所有点
void CWaveTestView::OnRButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWaveTestDoc* pDoc = GetDocument();
if(pDoc->PointArray.GetSize())
{
pDoc->PointArray.RemoveAll();
pDoc->PointLastActive = pDoc->PointLastActive = CPoint(-1, -1);
InvalidateRect(NULL);
}
CView::OnRButtonDblClk(nFlags, point);
}


看不见的裂痕 2012-08-03
  • 打赏
  • 举报
回复
CPoint *pDrawPoint = new CPoint[];

这句话问题很大。
不确定大小的话,
1.可以先申请个很大的空间
2.用容器Vector之类的
schlafenhamster 2012-08-03
  • 打赏
  • 举报
回复
CPoint *pDrawPoint = new CPoint[];// 多少?
知道:nPointCount 后 再new:
CPoint *pDrawPoint = new CPoint[nPointCount];
BombZhang 2012-08-03
  • 打赏
  • 举报
回复
下面两个都应该是类的成员变量,否则没办法保存每次点击的坐标
int nPointCount;
CPoint *pDrawPoint;

而且不能用CPoint *pDrawPoint;
用个CList比较合适,每点击一次在list中增加一个point对象
CList<CPoint,CPoint> m_Points;
qlizhang 2012-08-03
  • 打赏
  • 举报
回复
在点击事件中记录坐标并画线。
lgstudyvc 2012-08-03
  • 打赏
  • 举报
回复
m_PtStart值呢?

在说了,你跟进去看看啊,值是多少
qlizhang 2012-08-03
  • 打赏
  • 举报
回复
void CTrailMousePosDlg::OnMouseMove(UINT nFlags, CPoint point)
{
//获得鼠标当前位置
m_strX.Format("%d",point.x);
m_strY.Format("%d",point.y);
UpdateData(FALSE);

CDialog::OnMouseMove(nFlags, point);
}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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