关于画十字线的难题
程序目的:
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,是不是跟这个有关?请高手一定帮忙!
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,是不是跟这个有关?请高手一定帮忙!
...全文
相关推荐
mfc picture在中心画十字线
mfc在picture控件的中心画两条分割线::::::::::::::
MatlabGui坐标轴内随鼠标移动的十字线坐标程序
Matlab GUI界面设计,实现鼠标在坐标轴内移动时,十字线坐标随之移动,并可以选择平滑移动 和 只在原始数据间跳动。 在matlab6.5下运行。
QT QChartView十字线实现[代码]
本文详细介绍了如何在QT的QChartView中实现鼠标随动的十字线功能,包括十字线的创建、添加到场景、随鼠标移动更新位置等核心代码。同时,文章还提供了图表缩放、平移拖动的实现方法,通过重写鼠标事件和滚轮事件来实现这些交互功能。代码示例展示了QGraphicsLineItem的使用方式,以及如何将十字线添加到QChartView的场景中,并处理鼠标移动时的坐标转换和信号发送。
鼠标十字线工具
单文件版,无需安装,直接运行,十字线颜色可以修改。有快捷键。
crosshair光标辅助十字线
crosshair光标辅助十字线


图形处理/算法
