我想在view中画一条线,而这条线是一个类的对象(当然这个类还有其它的属性),我希望在鼠标移动到线上时,鼠标的事件由线所在的类直接处理,而不是在由view处理,而且,这条线要能够支持拖动,哪位能给个好的建议,谢谢!
解决方案 »
- WTL 关于GDI一些操作
- win32 dll简单问题求教
- 简单udp server。。
- VC中运行exe程序的问题?在线等,急....
- 很简单的问题,四行程序,怎么会这样输出结果
- 求助:dll被调用的细节
- 在MFC程序中,向窗口发一个WM_SETICON消息,编译出错,怎么改?
- 我在线等待 请大家帮帮忙我在线等待 请大家帮帮忙我在线等待 请大家帮帮忙我在线等待 请大家帮帮忙我在线等待 请大家帮帮忙我在线等待 请
- 关于WINDOWSM虚拟内存的使用,高手帮助!
- tab控件下的对话框弹框不显示问题
- CreateProcess以后 如何得到该Process 的HWND(CWnd)(zls!)
- dll的问题!
{
public:
public:
double m_1X,m_1Y,m_2X,m_2Y; //直线的起点和终点
// DECLARE_SERIAL(CLine); //声明串形化
BOOL bDisplay; //是否可视
BOOL bLocated; //是否可选
int iMinScale; //最小显示比例尺
int iMaxScale; //最小显示比例尺
int m_id_only1, m_id_only2;
public:
int x1,x2,y1,y2;
public:
CLine(); //不带任何参数的构造函数
//以下是有初始化参数的构造函数
CLine(short ColorPen,short ColorBrush,
short LineWide,short LineType,short Layer,int id_only1,
int id_only2,double X1,double Y1,double X2,double Y2);
//直线的绘制函数
virtual void Draw(CDC *pDC,int m_brushMode,int m_penMode,short BackColor);
//得到边界矩形的函数
virtual void GetRect(double *minX,double *minY,double *maxX,double *maxY);
//判断是否被点选中的函数
virtual BOOL IsPoint(double x,double y,double jl,double blc);
virtual ~CLine();
};
return; //<<<<<<<<<<<<<<<<<<<<<<<<<<
double minx,miny,maxx,maxy;
GetRect(&minx,&miny,&maxx,&maxy);
if(!IsRectCross(minx,miny,maxx,maxy))//若不与屏幕相交则返回
return; //<<<<<<<<<<<<<<<<<<<<
*/ //-------------------------------------------------------------
// int x1,y1,x2,y2; //·两个点的坐标
short LineType=m_LineType; //·轮廓线
short ColorPen=m_ColorPen; //·轮廓色
//pDC->SetTextColor(RGB(255,0,0));
if(m_penMode==1)//如被鼠标选择后特殊显示******************
{
if(m_LineType!=2)
LineType=2;
else
LineType++; }// ::MessageBox(NULL,NULL,"b",NULL);
//没有选中时正常的显示
DWORD m_color;
if(ColorPen==1)
{
m_color=RGB(0,0,255);
}
else if(ColorPen==2)
{
m_color=RGB(255,0,0);
}
// pDC->TextOut(100,100,"SEL");
// }
//设定画笔的<线型.宽度.颜色>-----------------
CPen pen((int)LineType,(int)m_LineWide,m_color);
CPen* pOldPen=pDC->SelectObject(&pen);//保存旧画笔
/*
if(m_brushMode==0) //若是
pDC->SetROP2(R2_COPYPEN);//设定正常覆盖的绘制模式
else if(m_brushMode==1) //若是
pDC->SetROP2(R2_NOT); //设定反色的绘制模式// DPtoVp(11,33,&x1,&y1);//转换两点坐标
DPtoVp(22,77,&x2,&y2);
*/ if(m_penMode==1)//如被鼠标选择后特殊显示点******************
{
// pDC->SetROP2(NULL);
pDC->Rectangle(x1-5,y1-5,x1+5,y1+5);
pDC->Rectangle(x2-5,y2-5,x2+5,y2+5);
}
pDC->MoveTo(x1,y1); //以屏幕坐标画图
pDC->LineTo(x2,y2); pDC->SelectObject(pOldPen);//恢复旧画笔
pOldPen->DeleteObject();
pen.DeleteObject();
}//函数Line::GetRect作用:计算并返回一条直线的矩形边界
void CLine::GetRect(double *minX,double *minY,double *maxX,double *maxY)
{
*minX=min(m_1X,m_2X); //计算并返回最小x值
*maxX=max(m_1X,m_2X); //计算并返回最大x值
*minY=min(m_1Y,m_2Y); //计算并返回最小y值
*maxY=max(m_1Y,m_2Y); //计算并返回最大y值
}//函数:CLine::IsPoint
//作用:判断点是否在直线上,参数(x,y)是点中点的坐标,jl为点中的距离范围
//返回:1-点中直线 0-没有点中
BOOL CLine::IsPoint(double x,double y,double jl,double blc)
{
// if(b_Delete)
// return FALSE; double xx,x1,x2,y1,y2;
GetRect(&x1,&y1,&x2,&y2);//得到每条直线的边界矩形
if(!(x>=x1&&x<=x2&&y>=y1&&y<=y2))
return FALSE; //如果点不在边界矩形内,继续判断下一个图形元素
xx=PointLine(x,y,m_1X,m_1Y,m_2X,m_2Y);//得到点到直线距离
if(xx<jl)//如果选中
return TRUE;
return FALSE;
}
void CLine::Draw(CDC* pDC)
{
//以下设置DC
CPen pen(PS_SOLID, GetPenWidth(), GetPenColor()), *oldpen;
oldpen = pDC->SelectObject(&pen);
//以下移动直线
pDC->MoveTo(m_x1, m_y1);
pDC->LineTo(m_x2, m_y2); //以下恢复DC
pDC->SelectObject(oldpen);
pen.DeleteObject();//释放笔资源
}在void CView::OnLButtonDown(UINT nFlags, CPoint point)和
CView::OnLButtonUp(UINT nFlags, CPoint point) 和
CView::OnMouseMove(UINT nFlags, CPoint point)中处理CLine::Draw(CDC* pDC)
http://hot-yys.vicp.net/demo.rar