请教问题一,如何在画的过程中有虚框

lingdang 2000-03-12 03:29:00
我照着书上的例子依胡芦画票写了个画矩型的程序,程序大至如下

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
....
m_LastPoint=point;
CView::OnLButtonDown(nFlags, point);
...
}

void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
.....
dc.Rectangle(m_LastPoint.x,m_LastPoint.y,m_CurPoint.x,m_CurPoint.y);
....
}
编译成功后,可以通过,也可以画矩型,问题是,我想和WINDOWS画笔那
样,在画的过程中有虚框,(就象拖动窗口的那样)这样可以知道矩型框
的大小,不知道怎么样添代码??(我是新手,麻烦您老人家告诉我的时
候说的尽量详细一点,拜托了)
...全文
211 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingdang 2000-03-15
  • 打赏
  • 举报
回复
jjony
可是我并不想担担就画一个矩型,我还想用到MOUSEMOVE
所以。。。总之还是要谢谢你这么热 心!

SoftCrazy:
谢谢你的指点
我已经按你教我的思路成功完成代码
并测试成功,我觉你的比较好:代码如下:不过我的
代码可能写的很不精简!

CLASS CVIEW:....
....
protected:
CPoint m_LastPoint;
CPoint m_TrackPoint;
...........


void CRectangleView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CRect rc;
int m_top,m_left,m_right,m_bottom;
if (m_LastPoint.x>m_TrackPoint.x)
{
m_left=m_TrackPoint.x;
m_right=m_LastPoint.x;
}
else
{
m_right=m_TrackPoint.x;
m_left=m_LastPoint.x;
}
if (m_LastPoint.y>m_TrackPoint.y)
{
m_top=m_TrackPoint.y;
m_bottom=m_LastPoint.y;
}
else
{
m_bottom=m_TrackPoint.y;
m_top=m_LastPoint.y;
}


rc.top=m_top;
rc.left=m_left;
rc.right=m_right;
rc.bottom=m_bottom;

DrawFocusRect(dc.m_hDC,rc);
Rectangle(dc,m_LastPoint.x,m_LastPoint.y,point.x,point.y);


CView::OnLButtonUp(nFlags, point);
}

void CRectangleView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_LastPoint=point;
m_TrackPoint=point;
CView::OnLButtonDown(nFlags, point);
}

void CRectangleView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CRect rc;
if ((nFlags & MK_LBUTTON)!=0)
{ int m_top,m_left,m_right,m_bottom;
if (m_LastPoint.x>m_TrackPoint.x)
{
m_left=m_TrackPoint.x;
m_right=m_LastPoint.x;
}
else
{
m_right=m_TrackPoint.x;
m_left=m_LastPoint.x;
}
if (m_LastPoint.y>m_TrackPoint.y)
{
m_top=m_TrackPoint.y;
m_bottom=m_LastPoint.y;
}
else
{
m_bottom=m_TrackPoint.y;
m_top=m_LastPoint.y;
}


rc.top=m_top;
rc.left=m_left;
rc.right=m_right;
rc.bottom=m_bottom;

DrawFocusRect(dc.m_hDC,rc);
if (m_LastPoint.x>point.x)
{
m_left=point.x;
m_right=m_LastPoint.x;
}
else
{
m_right=point.x;
m_left=m_LastPoint.x;
}
if (m_LastPoint.y>point.y)
{
m_top=point.y;
m_bottom=m_LastPoint.y;
}
else
{
m_bottom=point.y;
m_top=m_LastPoint.y;
}


rc.top=m_top;
rc.left=m_left;
rc.right=m_right;
rc.bottom=m_bottom;
DrawFocusRect(dc.m_hDC,rc);
m_TrackPoint=point;
}

CView::OnMouseMove(nFlags, point);
}
JJONY 2000-03-14
  • 打赏
  • 举报
回复
lingdang:还需要OnLButtonUp吗?track.TrackRubberBand()执行后,只有在释放鼠标左键后才返回,所以WM_LBUTTONUP消息就被track处理了,窗口自然就不会激发OnLButtonUP函数啦。你在track.TrackRubberBand后续代码操作吧。
E 2000-03-13
  • 打赏
  • 举报
回复
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
....
m_LastPoint=point;
m_TrackPoint=point;
m_bLButtondown=TRUE;
CView::OnLButtonDown(nFlags, point);
...
}

void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
.....
RECT rc;
m_bLButtonDown=FALSE;
set rc to be (m_LastPoint.x,m_LastPoint.y,m_TrackPoint.x,m_TrackPoint.y)
DrawFocusRect(dc.m_hdc,rc); //擦掉原先的FocusRect;
dc.Rectangle(m_LastPoint.x,m_LastPoint.y,point.x,point.y);
....
}

void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{
.....
RECT rc;
if (m_bLButtondown){
set rc to be (m_LastPoint.x,m_LastPoint.y,m_TrackPoint.x,m_TrackPoint.y)
DrawFocusRect(dc.m_hdc,rc); //擦掉原先的FocusRect;
m_TrackPoint=point;
set rc to be (m_LastPoint.x,m_LastPoint.y,m_TrackPoint.x,m_TrackPoint.y)
DrawFocusRect(dc.m_hdc,rc); //画现在的FocusRect
}
....
}
不要给我分,我也是猜想而已,并没测试过!
lingdang 2000-03-13
  • 打赏
  • 举报
回复
jjony:
谢谢你,我已按照你所说的

void CCcyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CClientDC dc(this);
m_LastPoint=point;
CRectTracker track;
CRect rc;
track.TrackRubberBand(this,point);
rc = track.m_rect;
dc.Rectangle(rc);
... ...

试验成功了,但是track.TrackRubberBand(this,point);
这个好象会屏蔽OnLButtonUp
是不是在OnLButtonDown语句中加了就不能用
OnLButtonUp了?

xenogear:
谢谢!
你能不能说的详细一点???
不明白!

929:
我开始也象你那样想了,可是我很菜的,我不知道具体应该怎么做你能不能给我一
段代码加以说明,或者一小段也可以!我先谢谢了!

还有的等会再试!
JJONY 2000-03-12
  • 打赏
  • 举报
回复
你是不是想在View中先画一个虚的矩形,当Kick up时就出现一个矩形?
介绍你用一个类---CRectTracker,该类不难.
在void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 中
加入如下:
CRectTracker track;
CRect rc;
track.TrackRubberBand(this,point);
rc = track.m_rect
.....余下操作
929 2000-03-12
  • 打赏
  • 举报
回复
这种用鼠标拖动来画矩形,一般在MOUSEDOWN下记住原鼠标点位置,在MOUSEMOVE事件中,以XOR异或的方式进行画矩形的操作,并且更新原鼠标位置值。这样,可以保证画出的矩形可被移动后的重画所清除。在一般的VC或其它编程书中介绍绘图功能时都有这样的示例。看看吧。
xenogear 2000-03-12
  • 打赏
  • 举报
回复
在OnMouseMove中处理贝

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧