请教,如何实现通过拖动鼠标,在图象中任意位置选择一个合适大小的区域画一个矩形框,谢谢!
时间:2009-08-20
来源:互联网
作者: happy_jxj 发布时间: 2009-08-20
1.透明的矩形:
需要调用SetBkMode,传TRANSPARENT参数。
2.清除前一次画的矩形:
使用双缓冲,每次重新画整个控件区域,步骤:在后台内存中将背景画成纯的背景色,在上面画矩形,将画的图帖出来。
3.不能画到控件外面去:
画图时使用控件的HDC去画,就不会画到外面了。
作者: fengrx 发布时间: 2009-08-20
作者: Tr0j4n 发布时间: 2009-08-20
为dc选择NULL_BRUSH
2.清除前一次画的矩形:
关联一个矩形成员变量,每次刷新绘制该成员变量。
拖动完成后,修改该矩形。
3.不能画到控件外面去:
画图时使用控件的HDC去画,就不会画到外面了
4.有预览效果
为dc设置下面属性,绘制一遍显示,绘制两遍擦除
dc.SetROP2(R2_XORPEN);
作者: gao_zilai 发布时间: 2009-08-20
作者: gao_zilai 发布时间: 2009-08-20
2、选择位图到内存DC
3、在内存DC上画矩形
4、将内存DC拷贝到控件DC中,完成一次绘画
作者: skybblue 发布时间: 2009-08-20
或者你从主窗口判断坐标点是否落在CStatic内,然后拿到Cstatic的HDC绘制.
作者: I_NBFA 发布时间: 2009-08-20
有几个关健点:
1.透明的矩形:
需要调用SetBkMode,传TRANSPARENT参数。
2.清除前一次画的矩形:
使用双缓冲,每次重新画整个控件区域,步骤:在后台内存中将背景画成纯的背景色,在上面画矩形,将画的图帖出来。
3.不能画到控件外面去:
画图时使用控件的HDC去画,就不会画到外面了。
up
在类中设置一个CRect成员变量,用于记录上一次绘制的矩形。
在绘制新的矩形前,将上一次绘制的矩形擦除
作者: tttyd 发布时间: 2009-08-20
2.OnLButtonUp(UINT nFlags, CPoint point)中用PtInRect判断下m_ptOrigin和point是否在static text中,用背景色把上一次话的矩形在画一次(在类中另设个变量保存),画完再用NULL_BRUSH画这一次的矩形。
作者: zyq5945 发布时间: 2009-08-20
作者: happy_jxj 发布时间: 2009-08-21
C/C++ code
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); }
作者: zyq5945 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-21
m_pParentWnd->UpdateWindow();
这样进行清出
作者: churenxh 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-21
还有一个问题,我发现我画出的矩形位置和我鼠标拖动的位置不一致,矩形有点偏右下方
应该是没有正确获取鼠标的位置参数。
或者说你获取的鼠标位置是关于别的窗口的,你没有转化成对应你的窗口的坐标位置
作者: tttyd 发布时间: 2009-08-21
使用MapWindowPoints函数
作者: tttyd 发布时间: 2009-08-21
使用MapWindowPoints函数
作者: tttyd 发布时间: 2009-08-21
ClientToScreen
这两个都是转换坐标的API
作者: zyq5945 发布时间: 2009-08-21
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;
作者: happy_jxj 发布时间: 2009-08-21
还有point
作者: tttyd 发布时间: 2009-08-21
作者: baodongpo 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-21
相应OnLButtonDown 和OnLButtonUp消息,记下down和up时的坐标,创建memdc,然后花到memdc上,最后在memdc.BitBlt上来
要这么麻烦吗?只是想在控件上画个矩形框选定一块区域
作者: happy_jxj 发布时间: 2009-08-21
引用 22 楼 baodongpo 的回复:
相应OnLButtonDown 和OnLButtonUp消息,记下down和up时的坐标,创建memdc,然后花到memdc上,最后在memdc.BitBlt上来
要这么麻烦吗?只是想在控件上画个矩形框选定一块区域
对,一个区域需要两个点来确定,起始点和终点
作者: tttyd 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-21
作者: happy_jxj 发布时间: 2009-08-22
作者: happy_jxj 发布时间: 2009-08-24
作者: fengyingli 发布时间: 2011-11-25
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28