头疼,我想刷新屏幕上指定的一块区域怎么做? 注意我说的是屏幕上的比如我现在整个屏幕都被CWindowDC dc(GetDesktopWindow()) 的DC给FillRect成了 RGB 0,0,255蓝色我想让屏幕刷新我试过 ::InvalidateRect 搞不定。。我是屏幕指定区域刷新哪位大神有方法实现~~~~~~~~~~~~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你得在InvalidateRect(GetDesktopWindow(),...)的同时在你的OnPaint里面继续CWindowDC dc(GetDesktopWindow())、FillRect。 LZ放心,凡是刷新重绘肯定得用InvalidateRect 还是不行,我把代码贴出来吧// 全局变量 CWnd *pWnd; CRect m_rt;// 填充桌面为蓝色(按钮1事件) pWnd = GetDesktopWindow(); pWnd->GetWindowRect(m_rt); CWindowDC dc(GetDesktopWindow()); dc.FillRect(m_rt,&CBrush(RGB(0,0,255))); ReleaseDC(&dc);// 使用InvalidateRect(按钮2事件) InvalidateRect(m_rt,TRUE);// OnPaint中(在CDialog::OnPaint();上面增加的语句) CWindowDC dc(GetDesktopWindow()); dc.FillRect(m_rt,&CBrush(RGB(0,0,255))); ReleaseDC(&dc);我这样操作出来的结果还是没有刷新,如果被刷新成功的话,那么屏幕上的m_rt区域蓝色应该都被刷掉。 LZ到底是要做什么?把这个区域去掉?用SelectClipRgn吧 比如我用CWindowDC dc(GetDesktopWindow()) 的DC在屏幕上画了CPoint的曲线画完以后我想擦掉这些线 那么我就要刷新屏幕 ::InvalidteRect(NULL,NULL,TRUE); 刷新一下曲线确实消失了但这是刷新整个屏幕 屏幕会闪烁所以我想只刷新一块区域 明白了。沿着这条线的点,以每个点坐标为中心画一个很小的RECT(也可以适当隔几个点画这个RECT,这个RECT可以稍微大一点,这样隔开取的点就少。),然后InvalidteRect这些RECT(循环这个线上的点的RECT),这样就不是刷新整个屏幕,擦了线而且屏幕不会闪。 InvalidteRect我不会用 这是实话比如我InvalidteRect(CRect,TRUE);同时在OnPaint中 用CWindowDC的DC来FillRect整个CRect吗 不用。InvalidteRect就是擦除你不需要的区域。 你的意思是直接 InvalidteRect(CRect,TRUE);??????就行了么 你可以把InvalidteRect想象成一块橡皮擦,InvalidteRect(CRect)中的CRect是橡皮擦的大小以及要擦除的区域,如果橡皮小的话擦得慢,但是擦得很准确,而且因为变化的范围很小,不会闪烁。如果大的话擦得快,但是变化的范围大会产生屏幕闪烁。 比如擦一条线,如果橡皮很大的话,一次就擦了,但是会闪烁,这就相当于InvalidteRect(NULL, NULL, TRUE)或者Invalidte。如果橡皮小的话,你就得沿着这条线的轨迹擦,但是不会闪烁。就相当于:for(遍历这条线){ InvalidteRect(RECT/*沿着这条线的RECT*/, ...);} 加一个STATI或图片控件上去,在他们上边DRAW,然后只刷新他们就可以 OnMouseMove: CWindowDC dc(GetDesktopWindow()); dc.MoveTo(m_pt); dc.LineTo(point); ReleaseDC(&dc); m_pt = point;这是桌面上绘制出来的点我在一个按钮中: CRect rt; rt.SetRect(m_pt.x - 200,m_pt.y - 200,m_pt.x + 200,m_pt.y + 200); InvalidateRect(rt,TRUE);m_pt是OnMouseMove中最后一个点的位置,这里将他扩大200个像素使用了 InvalidateRect(rt,TRUE);没有任何效果OnPaint中我没做处理不知道我这是哪错了,这个你能举例写一下整个InvalidteRect怎么写吗。。 InvalidateRect(rt,TRUE);应该是::InvalidateRect(GetDesktopWindow(),rt,TRUE);吧。而且你得确保你画的线的坐标在rt区域范围内。 不行。我都写成 CRect rt; rt.SetRect(m_pt.x - 1200,m_pt.y - 1200,m_pt.x + 1200,m_pt.y + 1200); ::InvalidateRect(GetDesktopWindow()->m_hWnd,rt,TRUE);了刷新不了 那就有可能是你的rt的范围有问题。rt的值你不能随便写,像m_pt.x - 1200这种肯定不行,还不如rt.left=0;rt.right=0。最好计算好rt的范围,不要随便写。 而且InvalidateRect后,不能有OnMouseMove消息,不然又会画另一条线。 rt.SetRect(0,0,1366,768); ::InvalidateRect(GetDesktopWindow()->m_hWnd,rt,TRUE);还是不行杯具啊杯具1366 768是我屏幕大小 哥们可以和你QQ聊么。。我干脆把DEMO工程发你 你看呢 求 Visual Studio 2010 安装包 可以发给我邮箱 [email protected] CAxWindow对象调CreateControl时为何为出错? OpenSCManger()调用的内核函数 请教各位专家,怎么将位图的数据部分存进一个数组中? 请高手帮忙解决一个问题! 自己创建了个activex,怎么让activex自动调整大小? 请问怎么用SendMessage函数向ListView控件发送消息 不同局域网内机器怎么通讯 哪位老大知道DBF的格式。 我要去哪才能找到语音素材库?急!!! 如何获得CTABCTRL中子对话框的句柄? 怎样编写可移动可变大小的控件
CWnd *pWnd;
CRect m_rt;// 填充桌面为蓝色(按钮1事件)
pWnd = GetDesktopWindow();
pWnd->GetWindowRect(m_rt); CWindowDC dc(GetDesktopWindow());
dc.FillRect(m_rt,&CBrush(RGB(0,0,255)));
ReleaseDC(&dc);// 使用InvalidateRect(按钮2事件)
InvalidateRect(m_rt,TRUE);// OnPaint中(在CDialog::OnPaint();上面增加的语句)
CWindowDC dc(GetDesktopWindow());
dc.FillRect(m_rt,&CBrush(RGB(0,0,255)));
ReleaseDC(&dc);我这样操作出来的结果还是没有刷新,如果被刷新成功的话,那么屏幕上的m_rt区域蓝色应该都被刷掉。
LZ到底是要做什么?把这个区域去掉?用SelectClipRgn吧
明白了。
沿着这条线的点,以每个点坐标为中心画一个很小的RECT(也可以适当隔几个点画这个RECT,这个RECT可以稍微大一点,这样隔开取的点就少。),然后InvalidteRect这些RECT(循环这个线上的点的RECT),这样就不是刷新整个屏幕,擦了线而且屏幕不会闪。
不用。InvalidteRect就是擦除你不需要的区域。
for(遍历这条线)
{
InvalidteRect(RECT/*沿着这条线的RECT*/, ...);
}
OnMouseMove:
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_pt);
dc.LineTo(point);
ReleaseDC(&dc);
m_pt = point;
这是桌面上绘制出来的点
我在一个按钮中:
CRect rt;
rt.SetRect(m_pt.x - 200,m_pt.y - 200,m_pt.x + 200,m_pt.y + 200);
InvalidateRect(rt,TRUE);
m_pt是OnMouseMove中最后一个点的位置,这里将他扩大200个像素使用了 InvalidateRect(rt,TRUE);
没有任何效果
OnPaint中我没做处理不知道我这是哪错了,这个你能举例写一下整个InvalidteRect怎么写吗。。
应该是
::InvalidateRect(GetDesktopWindow(),rt,TRUE);
吧。
而且你得确保你画的线的坐标在rt区域范围内。
rt.SetRect(m_pt.x - 1200,m_pt.y - 1200,m_pt.x + 1200,m_pt.y + 1200);
::InvalidateRect(GetDesktopWindow()->m_hWnd,rt,TRUE);了刷新不了
那就有可能是你的rt的范围有问题。rt的值你不能随便写,像m_pt.x - 1200这种肯定不行,还不如rt.left=0;rt.right=0。最好计算好rt的范围,不要随便写。
::InvalidateRect(GetDesktopWindow()->m_hWnd,rt,TRUE);还是不行杯具啊杯具
1366 768是我屏幕大小