实现大十字光标,各位有什么好的方法,要求效率很高才行。void CBCGDemoView::OnMouseMove(UINT nFlags, CPoint point) 
{
CRect rect;
GetClientRect(rect); CDC *pDC = GetDC();

CPen pen(PS_SOLID,1,m_clrCursorLine);
CPen* pPenSave = pDC->SelectObject(&pen);
int oldDrawMode = pDC->SetROP2(R2_NOTXORPEN); if(!m_bFirst)
{
DrawCrossCursor(pDC,rect,m_posPre);
}

// Draw
DrawCrossCursor(pDC,rect,point);
m_bFirst = FALSE; m_posPre = point;

pDC->SetROP2(oldDrawMode);
pDC->SelectObject(pPenSave);

ReleaseDC(pDC);
CView::OnMouseMove(nFlags, point);
}void CBCGDemoView::DrawCrossCursor(CDC *pDC, CRect rect, CPoint pos)
{
pDC->MoveTo(rect.left,pos.y);
pDC->LineTo(rect.right,pos.y);
pDC->MoveTo(pos.x,rect.top);
pDC->LineTo(pos.x,rect.bottom);
}我是这么写的,m_posPre 记录上次的坐标
平常的时候正常,但是我最小化窗口,然后再将鼠标移到窗口内,则出现问题(多出来两条线).各位,该怎么办啊

解决方案 »

  1.   

    使用资源Cur,预先画好,然后LoadCursor
      

  2.   

    我看到过有一种实现
    void CBCGDemoView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    RedrawWindow();
    // Draw
    DrawCrossCursor(pDC,rect,point);
    }类似于这样的,就是每次全部绘制,在绘制十字线光标.但是感觉这样效率很低
      

  3.   

    我试了,每次移动鼠标就绘制全部的内容,即使是使用先绘制到内存中的方法,也是效率很低
    延迟能明显的看出来。
    在视中直接绘制,效率要高的多,因为仅仅绘制两条线。但是就是在窗口Resize的时候
    出现问题,大家可以试一下
      

  4.   

    to Dreamer7901() 窗口Resize的时候就出现问题,你可以试一下
      

  5.   

    "但是就是在窗口Resize的时候出现问题,大家可以试一下"你需要把那4个点作为全局或者静态或者试图类的变量,
    在OnSize里面根据客户区大小给这4个点赋值。
      

  6.   

    是OnEraseBkGnd的原因,窗口变过后,系统会将整个背景都涂白,这时原来画的线就米有了,当你试图擦线的时候就相当于把原来的线重新画上去了
    正确的做法是在BOOL CBCGDemoView::OnEraseBkGnd(CDC* pDC)
    {
        m_bFirst = TRUE; // 重新初始化
        CView::OnEraseBkGnd(pDC);
        return TRUE;
    }
      

  7.   

    酱紫可能更好点
    BOOL CBCGDemoView::OnEraseBkGnd(CDC* pDC)
    {
        BOOL result = CView::OnEraseBkGnd(pDC);
        CRect rect;
        GetClientRect(&rect);
        DrawCrossCursor(pDC, rect, m_posPre);
    }另外,m_bFirst用的不好看,因为一共只有第一次有用,不如直接将m_posPre初始化为(-1, -1),这样就不用每次去判断了