如何在对话框内画圆,当在圆内点击鼠标左键时,圆随鼠标移动;当松开鼠标时
圆返回原来位置。如何实现?

解决方案 »

  1.   

    响应鼠标的WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP三个消息
      

  2.   

    这些我知道, 但如何避免一长串和松开后返回?
    代码:
    void CRDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    int x=point.x;
    int y=point.y;
    CDC *pDC=GetDC();
        pDC->SetROP2(R2_XORPEN);
    pDC->SelectStockObject(GRAY_BRUSH);
    pDC->Ellipse(x-10, y-10, x+10, y+10); CDialog::OnMouseMove(nFlags, point);}
      

  3.   

    先定义一个标记变量BOOL m_flag = FALSE在WM_LBUTTONDOWN中m_flag = TRUE,同时记录圆的起始位子
    然后在OnMouseMove中画移动的圆,如果要避免一连串的话,要有擦除的语句
    WM_LBUTTONUP中m_flag=TRUE,然后在先前记录的位子画圆
      

  4.   

    写了一个
    void CDfdDlg::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default

              if(m_rcStart.PtInRect(point))
    {
    m_flag = TRUE;//左键按下记录
    m_ptStart = point;//起始点
    m_rcLast = m_rcStart;//起始圆
    }
    CDialog::OnLButtonDown(nFlags, point);
    }void CDfdDlg::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    m_flag = FALSE;
    CDC *dc = GetDC();
    CRect rcClient;
    GetClientRect(&rcClient);
    dc->FillSolidRect(&rcClient,dc->GetBkColor());
    dc->Ellipse(&m_rcStart);
    ReleaseDC(dc);
    CDialog::OnLButtonUp(nFlags, point);
    }void CDfdDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if(m_flag)
    {
    CDC * dc = GetDC();
    CRect rcClient;
    GetClientRect(&rcClient);
    CPoint ptTo = point;
    dc->FillSolidRect(&rcClient,dc->GetBkColor());
    dc->Ellipse(m_rcLast.left+point.x,m_rcLast.top+point.y,m_rcLast.right+point.x,m_rcLast.bottom+point.y);
    ReleaseDC(dc);
    }

    CDialog::OnMouseMove(nFlags, point);
    }
    如果要完整文档,请留下电子邮件地址
      

  5.   

    m_rcLast = m_rcStart;//起始圆
    是什么类型?
      

  6.   

    在移动时,首先要插除以前的圆,这可以通过设置CDC的绘图模式实现,如下:
    pDC->SetROP2(R2_XORPEN);//设置异或模式
    pDC->Ellipse(....l);    //在屏模上绘制圆;
    //屏模上有圆
    //再次绘制,就可以插除;
    pDC->Ellipse(.....);   //插除
    //屏模上没有圆