我想在一副图像上用鼠标画一条直线,同时能够获得直线两端点的坐标
我该怎么做呢?

解决方案 »

  1.   

    点两次,在view类里用一个变量存储点击次数。int m_nClickCount;每点击一次,m_nClickCount++;当m_nClickCount是单数的时候,把鼠标坐标记入CPoint m_ptFirst中,如果是偶数,记入CPoint m_ptSecond。这样就可以获得两个点的坐标。
      

  2.   

    响应WM_LBUTTONDOWN跟WM_LBUTTONUP消息  
    如果是sdk的话 坐标在wParam中(如果没记错的话)
    如果是mfc的话  坐标在CPoint类型的参数中
      

  3.   

    第一次鼠标点击的时候
    调用MoveToEx函数把点移到那个位置
    第二次在LineTo到鼠标提出的位置
      

  4.   

    利用pMsg->pt可得到坐标点;
    CPoint pointOrign(pMsg->pt);
      

  5.   

    在BOOL CXXXView::PreTranslateMessage(MSG* pMsg) 
    中判断pMsg->message==WM_LBUTTONDOWN 
    然后利用pMsg->pt可得到坐标点;
      

  6.   

    谢谢上述回答我用mfc编程的,由于使用鼠标点击得到坐标,得到window2000中画图程序中
    画直线的一样,点一个点,然后拖动鼠标,在另外一处在点击,得到自己所需的
    直线,另外一个点是不固定的,所以我认为用 kingofvc(还是喜欢97)的方法
    应该合理,但还是没有明白,如何画线呢?
    谢谢大家! 请再指点!!!
      

  7.   

    是不是想实现橡皮筋的功能啊?
    可用下面的代码试试。
    void CPgsView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    int x1,y1,x2,y2,x3,y3;
             CPen  *poldpen,newpen; if ((mPointOld!=point)&&(MouseDownFlag))
    {
              CClientDC dc(this);
     dc.SetBkMode(TRANSPARENT);
              newpen.CreatePen(PS_SOLID,2,RGB(0,0,0));
      poldpen=dc.SelectObject(&newpen);
    CPgsDoc* pDoc=GetDocument();
            switch(pDoc->m_SendData.m_Operation) {
             //m_Operation是2就绘制直线
    case 2:
    dc.SetROP2(R2_NOTXORPEN);
    dc.MoveTo(mPointOrign);
    dc.LineTo(mPointOld);
    dc.MoveTo(mPointOrign);
    dc.LineTo(point);
    break;
    default:
    break;
    }//switch dc.SelectObject(poldpen);
    newpen.DeleteObject ()
    mPointOld=point;
    ReleaseDC(&dc);
       
          }//if CView::OnMouseMove(nFlags, point);
    }
      

  8.   

    如果没有拖动效果,就很简单了,记录两点的位置,moveto lineto旧可以了.
    如果要拖动,要设一个表示绘图的变量,好在拖动是判断,并且反色重画旧的线段,再画新线.
      

  9.   

    你的这个应用程序应该基于WM_MOUSEMOVE事件消息,用
    CClientDC dc(this)dc.MoveTo(m_iPointX,m_iPointY);
    dc.Lineto(point.x,point.y);m_iPointX=Point.x;
    m_iPointY=Point.y;
    这样就可以了做到点一个点,然后拖动鼠标,在另外一处在点击,得到自己所需的直线                
      

  10.   

    我正好在写WINDOWS的那个画图程序void CXPaintView::DrawLine(CDC *pdc, char cMouse)//cMouse 判断左右键/决定前景背景颜色
    {CPen hPen; 
    CRect rect;
    COLORREF color;
    int iWid;//笔宽
    CSize size;
    CPoint ptTemp;iWid=((CMainFrame*)AfxGetMainWnd())->m_wndToolBox.GetLineWidth();
    switch(cMouse)
    {
    case 'L':
    color=((CMainFrame*)AfxGetMainWnd())->m_wndColorBox.GetForeColor();
    hPen.CreatePen(PS_SOLID,iWid,color);
        break;
    case 'R':
    color=((CMainFrame*)AfxGetMainWnd())->m_wndColorBox.GetBackColor();
        hPen.CreatePen(PS_SOLID,iWid,color);
    break;
    }size=GetDocument()->prSize; //画纸大小GetDocument()->hdcPreStore.SelectObject(&hPen);pdc->StretchBlt(0,0,size.cx*iMagSize,size.cy*iMagSize,&(GetDocument()->hdcPreStore),0,0,size.cx,size.cy,SRCCOPY);//用原来每画线时的内存背景擦掉刚才画的
    if(ptCur.x>0 && ptCur.y>0 && ptCur.x<PMAX && ptCur.y<PMAX) //判断鼠标是否越界,如果用了SetCapture可以不用检查
    {
    GetDocument()->hdcPreStore.StretchBlt(0,0,size.cx,size.cy,&(GetDocument()->hdcShade),0,0,size.cx,size.cy,SRCCOPY);  //把存储当前线段的内存DC清除一遍
              //iMagSize 为当前放大倍数(如果用了放大镜功能的话)
            
    ptTemp.x=ptPre.x/iMagSize;ptTemp.y=ptPre.y/iMagSize;
    GetDocument()->hdcPreStore.MoveTo(ptTemp);
    ptTemp.x=ptCur.x/iMagSize;ptTemp.y=ptCur.y/iMagSize;
    GetDocument()->hdcPreStore.LineTo(ptTemp);
    }}