请教,如何实现通过拖动鼠标,在图象中任意位置选择一个合适大小的区域画一个矩形框,谢谢!

happy_jxj 2009-08-20 03:11:43
我在窗体的static text控件上绘制图像,现在想在图像上通过拖动鼠标画定一个透明的矩形区域,要求每次画矩形都能清除前一次画的矩形,而且不能画到控件外面去,如何实现,请高手们帮忙,谢谢!
...全文
605 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyingli 2011-11-25
  • 打赏
  • 举报
回复
不懂不懂
yujia1989bmw 2011-11-25
  • 打赏
  • 举报
回复
嫌麻烦直接用CRectTracker类。
happy_jxj 2009-08-24
  • 打赏
  • 举报
回复
up上去
happy_jxj 2009-08-22
  • 打赏
  • 举报
回复
up
zyq5945 2009-08-21
  • 打赏
  • 举报
回复
矩形框就是线组成的,用背景色画线在原来用别的画笔画线的地方话一次,就会覆盖原来话的线,效果就像是清除画线。
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);

HBRUSH pOldBrush;
pOldBrush =(HBRUSH)dc.SelectObject(HBRUSH(GetStockObject(NULL_BRUSH)));
CPen pen,*pOldPen;
//pen.CreatePen(PS_SOLID,1,dc.GetBkColor()); //用背景色画线,也就是覆盖原来的画线
pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); //用红色画笔画线
pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);

CView::OnLButtonUp(nFlags, point);
}
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
如何擦除前一次的矩形框,能给我段代码吗?谢谢!
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
谁来帮我看看我的代码问题出在哪里?
雪影 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 happy_jxj 的回复:]
引用 22 楼 baodongpo 的回复:
相应OnLButtonDown 和OnLButtonUp消息,记下down和up时的坐标,创建memdc,然后花到memdc上,最后在memdc.BitBlt上来



要这么麻烦吗?只是想在控件上画个矩形框选定一块区域
[/Quote]
对,一个区域需要两个点来确定,起始点和终点
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 baodongpo 的回复:]
相应OnLButtonDown 和OnLButtonUp消息,记下down和up时的坐标,创建memdc,然后花到memdc上,最后在memdc.BitBlt上来
[/Quote]


要这么麻烦吗?只是想在控件上画个矩形框选定一块区域
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
m_ptOrigin 是在OnLButtonDown中得到的,上面这段代码是在OnLButtonUp中实现的
baodongpo 2009-08-21
  • 打赏
  • 举报
回复
相应OnLButtonDown 和OnLButtonUp消息,记下down和up时的坐标,创建memdc,然后花到memdc上,最后在memdc.BitBlt上来
雪影 2009-08-21
  • 打赏
  • 举报
回复
m_ptOrigin是在什么地方赋值的?如何获取的?
还有point
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
我是新手,对vc还不很熟悉,请高手们帮我看看我的代码,帮我完善一下功能吧,还有代码最好也能优化一下,感觉我的太笨了,谢谢!
CWnd* pWnd = GetDlgItem(IDC_GRAPHSTATIC);
CClientDC dc(pWnd);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *poldBrush=dc.SelectObject(pBrush);
CPen pen,*pOldPen;
Tcolor dd;
dd=dc.GetBkColor();
pen.CreatePen(PS_SOLID,1,dc.GetBkColor()); //用背景色画线,也就是覆盖原来的画线
pOldPen = dc.SelectObject(&pen);
dc.Rectangle(CRect(m_oldptOrigin,oldpoint));
dc.SelectObject(poldBrush);
dc.SelectObject(pOldPen);

CBrush *pBrush1=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *poldBrush1=dc.SelectObject(pBrush1);
CPen pen1,*pOldPen1;

pen1.CreatePen(PS_SOLID,1,RGB(0,0,0)); //用黑色画笔画线

pOldPen1 = dc.SelectObject(&pen1);

dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(poldBrush1);
dc.SelectObject(pOldPen1);
m_oldptOrigin=m_ptOrigin;
oldpoint=point;
zyq5945 2009-08-21
  • 打赏
  • 举报
回复
ScreenToClient
ClientToScreen
这两个都是转换坐标的API
雪影 2009-08-21
  • 打赏
  • 举报
回复
窗口之间的坐标转换
使用MapWindowPoints函数
雪影 2009-08-21
  • 打赏
  • 举报
回复
窗口之间的左边转换
使用MapWindowPoints函数
雪影 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 happy_jxj 的回复:]
还有一个问题,我发现我画出的矩形位置和我鼠标拖动的位置不一致,矩形有点偏右下方
[/Quote]
应该是没有正确获取鼠标的位置参数。
或者说你获取的鼠标位置是关于别的窗口的,你没有转化成对应你的窗口的坐标位置
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
谁知道,请指教
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
还有一个问题,我发现我画出的矩形位置和我鼠标拖动的位置不一致,矩形有点偏右下方
happy_jxj 2009-08-21
  • 打赏
  • 举报
回复
我现在用背景色重新画前一次的矩形,怎么画出来的是白色的呢,背景不是白色的啊,新矩形是用黑色笔画的
加载更多回复(10)

16,551

社区成员

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

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

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