实现大十字光标,各位有什么好的方法,要求效率很高才行。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 记录上次的坐标
平常的时候正常,但是我最小化窗口,然后再将鼠标移到窗口内,则出现问题(多出来两条线).各位,该怎么办啊
{
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 记录上次的坐标
平常的时候正常,但是我最小化窗口,然后再将鼠标移到窗口内,则出现问题(多出来两条线).各位,该怎么办啊
void CBCGDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
RedrawWindow();
// Draw
DrawCrossCursor(pDC,rect,point);
}类似于这样的,就是每次全部绘制,在绘制十字线光标.但是感觉这样效率很低
延迟能明显的看出来。
在视中直接绘制,效率要高的多,因为仅仅绘制两条线。但是就是在窗口Resize的时候
出现问题,大家可以试一下
在OnSize里面根据客户区大小给这4个点赋值。
正确的做法是在BOOL CBCGDemoView::OnEraseBkGnd(CDC* pDC)
{
m_bFirst = TRUE; // 重新初始化
CView::OnEraseBkGnd(pDC);
return TRUE;
}
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),这样就不用每次去判断了