关于画十字线的难题

hill_qd hill_qd 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
程序目的:
1、窗口限制最小范围,通过响应WM_GETMINMAXINFO事件,已经实现
2、双击窗口的某个区域,开始绘十字
3、光标在区域中移动时,绘十字,如果超出范围,隐藏十字,但是再进来时,又显示十字
4、再次双击绘图区域,退出画十字模式

目前做法:响应鼠标左键双击事件,和鼠标移动事件来实现。发现在进入画十字模式后,基本上正常,但是在拖拽窗口到最小限制时,如果鼠标停在绘图区域上时,当放开鼠标左键,移动后,就会留下一个十字没有被擦出掉,想好多天了,没有解决,请高手帮忙。
以下是我的程序代码:

用到的几个变量:
BOOL m_bNeedEraseCross; //是否需要擦除光标
BOOL m_bDispCross; //是否显示光标
CPoint m_ptCrossOld; //上次光标位置
CPoint m_ptCrossLast; //当前光标位置

void CUserFunctionView::DrawSelectCross(CDC* pDC, CPoint point)
{
pDC->GetBkMode();

COLORREF XorColor = pDC->GetBkColor() ^ RGB(64,64,112);
CPen pen( PS_SOLID, 1, XorColor ), *oldpen;
oldpen = pDC->SelectObject( &pen );
int nOldDrawMode = pDC->SetROP2( R2_XORPEN );
pDC->MoveTo( m_rectCross.left, point.y );
pDC->LineTo( m_rectCross.right, point.y );
pDC->MoveTo( point.x, m_rectCross.top );
pDC->LineTo( point.x, m_rectCross.bottom);
pDC->SetROP2( nOldDrawMode );
pDC->SelectObject(oldpen);
}
void CUserFunctionView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect client;
GetClientRect(&client);

CDC* pDC = GetDC();
if(m_bDispCross)
{
if(m_rectCross.PtInRect(point))
{

if(m_rectCross.PtInRect(m_ptCrossLast) && m_bNeedEraseCross)
DrawSelectCross(pDC, m_ptCrossLast);

DrawSelectCross(pDC, point);
m_bNeedEraseCross = TRUE;
m_ptCrossLast = point;
}
else
{
if(m_rectCross.PtInRect(m_ptCrossLast) && m_bNeedEraseCross)
{
DrawSelectCross(pDC, m_ptCrossLast);
m_bNeedEraseCross = FALSE;
}
}
}
ReleaseDC(pDC);
}
void CUserFunctionView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//CString str;
//str.Format("%d-%d",point.x,point.y);
//AfxMessageBox(str,1,0);


CDC* pDC = GetDC();





if(m_rectCross.PtInRect(point))
{
if(m_bDispCross)
{
if(m_rectCross.PtInRect(m_ptCrossLast) && m_bNeedEraseCross)
DrawSelectCross(pDC, m_ptCrossLast);
m_bNeedEraseCross = FALSE;
m_bDispCross = FALSE;
}
else
{
//DrawSelectCross(pDC, m_ptCrossLast);
DrawSelectCross(pDC, point);
m_bDispCross = TRUE;
m_bNeedEraseCross = TRUE;
m_ptCrossLast = point;
}
}
ReleaseDC(pDC);

CView::OnLButtonDblClk(nFlags, point);
}
没有重载OnDraw,是不是跟这个有关?请高手一定帮忙!
...全文

相关推荐

评论 50
收藏 已收藏
分享
返回顶部
hill_qd
图形处理/算法 19,463 成员 50,678 内容