导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

MFC中关于画一条线的问题!大家进来帮帮忙啊!

junliang0824 2010-08-10 03:23:58
MFC中,当鼠标点下时确定一点,然后鼠标弹起移动的话就会有一条线,连接现在鼠标的位置和之前确定的那一点,
就好象画图软件中那样,当你画一条线时,先确定一点,然后不管鼠标移动到哪里就有一条线连接鼠标当前位置和之前确定点。直到你再次按下鼠标时,就真的画一条线。
...全文
153 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小赵儿 2012-06-19
没有其他简单点的方法了?就画一条线分隔一下对话框中的几个控件,有没有直接拖的那种,控件一样的,呵呵
回复
junliang0824 2010-08-11
问题解决了,谢谢大家!
回复
Q446512799 2010-08-11
OnLButtonDown()
OnLButtonUp()
回复
lmy0501 2010-08-10
这是我以前写的一段代码(橡皮筋算法),放在OnMouseMove中的
CClientDC pDC(this);
OnPrepareDC(&pDC);
pDC.DPtoLP(&point);
pDC.SetROP2(R2_NOT); //设置异或
xx=point.x ;
yy=point.y ; //这两行对你应该没用,是显示坐标用的
sprintf(p1,"%4d",xx);
m_wndStatusBar.SetPaneText(2,p1,TRUE);
sprintf(p1,"%4d",yy);
m_wndStatusBar.SetPaneText(3,p1,TRUE);
if(MenuID==1&&PressNum==1) //条件
{
if(mPointOld!=point)
{
pDC.MoveTo(mPointOrigin);pDC.LineTo(mPointOld);//擦旧线
pDC.MoveTo(mPointOrigin);pDC.LineTo(point); //画新线
mPointOld=point;
}
}
回复
l251284007 2010-08-10
OnLButtonDown()
if(temp == FALSE)
{
mPointOrigin=point;//the first point left_top
temp == Ture;
}
else
{
CPen *pOldPen;
CPen LinePen(PS_DOT,1,RGB(255,0,0));
pOldPen = ClientDC.SelectObject(&LinePen);
ClientDC.SelectStockObject(HOLLOW_BRUSH);
ClientDC.SetROP2(R2_NOT);
ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
ClientDC.LineTo(point.x, point.y);
ClientDC.SetROP2(R2_COPYPEN);
ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
ClientDC.LineTo(point.x,point.y);
}
OnMouseMove()

ClientDC.SetROP2(R2_NOT);
CPen *pOldPen;
CPen LinePen(PS_DASH,1,RGB(255,0,0));
pOldPen = ClientDC.SelectObject(&LinePen);
ClientDC.SetBkMode(TRANSPARENT);
ClientDC.SelectStockObject(NULL_BRUSH);
ClientDC.SetROP2(R2_NOT);
ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
ClientDC.LineTo(mPointOld.x, mPointOld.y);
ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
ClientDC.LineTo(point.x,point.y);
回复
SuperLampard 2010-08-10

void CTView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_StartPoint=point;

m_LastEndPoint=point;

SetCapture();

CView::OnLButtonDown(nFlags, point);

}



void CTView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(GetCapture()==this)

{

CClientDC dc(this);

ReleaseCapture();

dc.MoveTo(m_StartPoint);

dc.LineTo(point);

}

CView::OnLButtonUp(nFlags, point);

}



void CTView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(nFlags && MK_LBUTTON)

{

CClientDC dc(this);

int nDrawMode=dc.GetROP2();

dc.SetROP2(R2_NOTXORPEN);

dc.MoveTo(m_StartPoint);

dc.LineTo(m_LastEndPoint);

dc.MoveTo(m_StartPoint);

dc.LineTo(point);

m_LastEndPoint=point;

dc.SetROP2(nDrawMode);

}

CView::OnMouseMove(nFlags, point);

}


回复
wltg2001 2010-08-10
[Quote=引用楼主 junliang0824 的回复:]
MFC中,当鼠标点下时确定一点,然后鼠标弹起移动的话就会有一条线,连接现在鼠标的位置和之前确定的那一点,
就好象画图软件中那样,当你画一条线时,先确定一点,然后不管鼠标移动到哪里就有一条线连接鼠标当前位置和之前确定点。直到你再次按下鼠标时,就真的画一条线。
[/Quote]
先在WM_LBUTTONDOWN处理函数中用一个成员变量或是全局变量记录下鼠标位置。在WM_MOUSEMOVE中不停的用LineTo画线,注意的是因为要将前一次的线擦掉,所以你还要一个全局变量记录前一个WM_MOUSEMOVE的位置,用SetROP2(R2_NOT)设置绘图方式为擦除方式,在原来位置再画一次,将上次的擦掉。
回复
junliang0824 2010-08-10
[Quote=引用 2 楼 lisunlin0 的回复:]
这个太简单了吧~~
[/Quote]
是很简单,但我是在一个系统中实现的,现在搞的好乱,你能给点代码吗 ?
回复
junliang0824 2010-08-10
[Quote=引用 3 楼 cw7600 的回复:]
当你鼠标按下时弹起时 在鼠标弹起响应里面记下按下的坐标
然后在鼠标移动函数里面画线
记得画新线之前得把旧线擦掉
再点击鼠标时 画的线就不擦除了~
[/Quote]
我在移动的里面画了线可是不显示啊。
还有,如果我画上了,怎么把之钱的线擦掉。能给点代码吗
回复
cw7600 2010-08-10
当你鼠标按下时弹起时 在鼠标弹起响应里面记下按下的坐标
然后在鼠标移动函数里面画线
记得画新线之前得把旧线擦掉
再点击鼠标时 画的线就不擦除了~
回复
lisunlin0 2010-08-10
这个太简单了吧~~
回复
cw7600 2010-08-10
当你鼠标按下时 在鼠标按下响应里面记下按下的坐标
然后再鼠标弹起函数里 将这2个点连起来就OK了
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……