画图时的虚框问题

elegant87 2008-12-06 11:51:18

//我用图形模式中的 SetROP2(R2_XORPEN)来设置虚框模式
//通调用DrawFocusRect()函数来画!
//问题是从左上角右下角可以画虚框的,但是由右到左,下到上就没有虚框了!这是什么原因呢?
//代码如下:
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_bDraw=TRUE;

m_pre.left=point.x;
m_pre.top=point.y;
m_pre.right=point.x;
m_pre.bottom=point.y;

m_new.left=point.x;
m_new.top=point.y;
m_new.right=point.x;
m_new.bottom=point.y;
CView::OnLButtonDown(nFlags, point);
}
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bDraw=FALSE;
CClientDC dc(this);
CPen pen(PS_SOLID,3,RGB(255,0,0));
dc.SelectObject(&pen);
dc.SetROP2(R2_COPYPEN);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CView::OnLButtonUp(nFlags, point);
}
void CGraphicView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bDraw)
{
CClientDC dc(this);
dc.SetROP2(R2_XORPEN); //设置虚框模式
dc.DrawFocusRect(&m_pre);
m_new.right=point.x;
m_new.bottom=point.y;
dc.DrawFocusRect(&m_new);//画新矩形
m_pre.right=m_new.right;
m_pre.bottom=m_new.bottom;
dc.SetROP2(R2_WHITE);
}
CView::OnMouseMove(nFlags, point);
}
...全文
100 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
elegant87 2008-12-06
  • 打赏
  • 举报
回复
谢谢满天星的答复!请问这是为什么呢?大哥帮忙讲讲吧!
cnzdgs 2008-12-06
  • 打赏
  • 举报
回复
void CGraphicView::OnMouseMove(UINT nFlags, CPoint point) 
{
if(m_bDraw)
{
CClientDC dc(this);
dc.SetROP2(R2_XORPEN); //设置虚框模式
dc.DrawFocusRect(&m_pre);
if (m_ptOrigin.x < point.x)
{
m_new.left = m_ptOrigin.x;
m_new.right = point.x;
}
else
{
m_new.left = point.x;
m_new.right = m_ptOrigin.x;
}
if (m_ptOrigin.y < point.y)
{
m_new.top = m_ptOrigin.y;
m_new.bottom = point.y;
}
else
{
m_new.top = point.y;
m_new.bottom = m_ptOrigin.y;
}
dc.DrawFocusRect(&m_new);//画新矩形
m_pre = m_new;
dc.SetROP2(R2_WHITE);
}
CView::OnMouseMove(nFlags, point);
}
Tinary3v0 2008-12-06
  • 打赏
  • 举报
回复
应该是CRect这些类型本身的限制问题,如果你把right,bottom设定的值小于 left,top的值的时候就会出现你说的那个问题, 如果你想
画出虚框 最好是直接使用MovoTo和LineTo划线!
cnzdgs 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 elegant87 的回复:]
谢谢满天星的答复!请问这是为什么呢?大哥帮忙讲讲吧!
[/Quote]
你原本的做法是把鼠标按下的点作为矩形的左上角,鼠标移动后的位置作为右下角,当鼠标不是向右下方移动时,矩形的参数就反了。我给的代码是把两个点的坐标对比,找出两个点中较小的x、y值作为left、top,较大的x、y值作为right、bottom。
Learn-anything 2008-12-06
  • 打赏
  • 举报
回复
mark
feng1976 2008-12-06
  • 打赏
  • 举报
回复
使用矩形绘制之前,调一下NormalizeRect,就好了
实际上是绘制函数的问题,而不是举行本身

16,473

社区成员

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

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

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