MFC 怎样绘制透明矩形

Ada-Wu 2015-07-20 04:25:04
我想在截图的时候绘制出最外面的那个矩形,就像QQ截图一样,但是现在却得到下面的结果

代码如下
void CCalibrationDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bIsBegin == TRUE && m_bIsEnd == FALSE)
{



CClientDC dc(this);
CPen pen(PS_SOLID, 0, RGB(255, 0, 0));
dc.SelectObject(&pen);
//CBrush *brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectStockObject(NULL_BRUSH);
//dc.SelectStockObject(NULL_PEN);
//dc.FillRect(CRect(m_ptBegin,point),brush);
dc.Rectangle(m_ptBegin.x, m_ptBegin.y, point.x, point.y);

}
CDialogEx::OnMouseMove(nFlags, point);
}
...全文
1013 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小叮dang 2019-07-17
  • 打赏
  • 举报
回复
你每次都把背景重新绘制一遍,再绘制矩形就行了
gz_qmc 2016-11-11
  • 打赏
  • 举报
回复
据说QQ截图画的框就是某一指定颜色 QQ做截图功能的程序员就是个小学生 一点都不懂得节省资源
boreboluomi 2016-11-11
  • 打赏
  • 举报
回复
您的问题就出在没有去掉之前绘制的矩形外框。 常见解决方法: 方法一:绘制下一个矩形前重新绘制底图,但要使用内存兼容位图(双缓冲)解决闪烁问题。 方法二:使用异或方式绘制矩形,画下一个矩形前使用异或方式绘制前一个矩形,起到擦除作用。 方法三:使用反转色方式,反转色方式可能不是你想要的效果,但也比较常用。 推荐使用第二种异或方法来绘制,效率高图形动态体现流畅,而且节省资源。 对于楼中某位满嘴脏话的,就不要听信他了。认为只能在OnDraw OnPaint 里绘制的基本都是小学生。 方法二,方法三就在你的OnMouseMove中绘制就好,而且不要在Ondraw里绘制。
阿源是少年 2015-07-21
  • 打赏
  • 举报
回复
引用 7 楼 gz_qmc 的回复:
教人在OnMouseMove里画图的都他娘的2B 一个窗口永远只有一个DC,别动不动就定义DC来画图 永远在OnPaint里或者OnDraw里画 鼠标只标记位置信息然后通知就可以了 2B青年最喜欢就是GetDC来画图
我可以理解为,你是在人身攻击吗?
向立天 2015-07-21
  • 打赏
  • 举报
回复
把绘图的代码都整理到OnPaint中
gz_qmc 2015-07-21
  • 打赏
  • 举报
回复
教人在OnMouseMove里画图的都他娘的2B 一个窗口永远只有一个DC,别动不动就定义DC来画图 永远在OnPaint里或者OnDraw里画 鼠标只标记位置信息然后通知就可以了 2B青年最喜欢就是GetDC来画图
coolcoffee4051982 2015-07-21
  • 打赏
  • 举报
回复
引用 9 楼 pcradio 的回复:
[quote=引用 7 楼 gz_qmc 的回复:] 教人在OnMouseMove里画图的都他娘的2B 一个窗口永远只有一个DC,别动不动就定义DC来画图 永远在OnPaint里或者OnDraw里画 鼠标只标记位置信息然后通知就可以了 2B青年最喜欢就是GetDC来画图
我可以理解为,你是在人身攻击吗?[/quote] 理解的很对。
阿源是少年 2015-07-20
  • 打赏
  • 举报
回复
每次画图前,先清屏,见红色部分
阿源是少年 2015-07-20
  • 打赏
  • 举报
回复
	if(m_bTrack)
	{
		CClientDC dc(this);
		CRect rcClient;
		GetClientRect(rcClient);
		dc.FillSolidRect(rcClient, RGB(255, 255, 255));
		dc.SelectStockObject(NULL_BRUSH);
		CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
		CRect rect(m_ptLast, point);
		dc.SelectObject(&pen);
		dc.Rectangle(rect);
		Invalidate();
	}
阿源是少年 2015-07-20
  • 打赏
  • 举报
回复
可以在Move里面画,但是上次画的,你没有清除掉,所以就留下了轨迹,你把你的代码贴上来,很好改
Ada-Wu 2015-07-20
  • 打赏
  • 举报
回复
引用 1 楼 pcradio 的回复:
不要在OnMouseMove里面画矩形 啊,这样你移动鼠标就画矩形了,就如上你画了N多 响应OnMouseUp,在OnMouseDown里记录m_ptBegin,在OnMouseUp里面画矩形就只有一个了
这样子我在画线的过程中它是没有显示最外面的矩形的,而是在鼠标up后显示出矩形,我想要的效果就是在画的过程中矩形外框不断扩大,就像QQ截图那样
worldy 2015-07-20
  • 打赏
  • 举报
回复
使用空刷:GetStockObject使用NULL_BRUSH参数,
阿源是少年 2015-07-20
  • 打赏
  • 举报
回复
不要在OnMouseMove里面画矩形 啊,这样你移动鼠标就画矩形了,就如上你画了N多 响应OnMouseUp,在OnMouseDown里记录m_ptBegin,在OnMouseUp里面画矩形就只有一个了

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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