61阅读

屏幕闪烁解决办法-Win7/Win8下摄像头使用过程会有波纹闪烁现象的解决方法

发布时间:2017-10-31 所属栏目:屏幕闪烁解决办法

一 : Win7/Win8下摄像头使用过程会有波纹闪烁现象的解决方法

  我们有时在Win8操作系统下,相机应用、QQ视频等,使用过程会有波纹闪烁的现象。 以下是几种情况下的解决方法:(同样适用于Win7操作系统。)

  方法一:

  1. Win+Q调出搜索应用界面,找到相机;

Win8/Win7下摄像头显示有波纹解决方法

  2. 选择屏幕下方的摄像头选项,选择“更多”;

  3. 更多选项里闪烁的频率的默认为60HZ,调节为50HZ之后波纹消失。

  方法二:

  1. 若已安装QQ,可在QQ视频设置里进行调节,聊天窗口打开“视频设置”;

  2. 打开“画质调节”;

  3. “电力线频率(防闪烁)(P)”,默认也是60HZ,修改为50HZ即可。

  方法三:

  1. ThinkPad笔记本若系统下安装了ThinkVantage Communications Utility应用程序,可在控制面板中打开“Lenovo-Web会议”;

  2. “摄像头设置”选项下滑动条下拉到最下面找到“高级摄像头设置”;

  3. 界面和QQ视频设置下的画质调节相同,将“电力线频率(防闪烁)”从60HZ改为50HZ。

二 : 窗口和控件闪烁解决方案

对于MFC程序员来说做UI开发是痛苦的事情,不过大多数情况下我们都需要做这件事情,因为MFC自带的控件实在是太简陋了。这时候我们多半会涉及到自绘控件,随之而来的很可能就是窗口和控件的闪烁问题。这篇文章希望对MFC的窗口和控件闪烁问题做一个尽量全面的总结。

一、闪烁的原因

引起闪烁的原因很多,以至于网上有n多种解决闪烁问题的方法;如果你按照某一种方法做了仍然没有解决你的问题,请不要认定这个方法有问题,而是你没有对上号。如果你对这个解释不满意的话,我们就来深究一下到底是什么引起了闪烁。从原理上讲,闪烁是因为屏幕上连续的两次或多次输出画面差别比较大引起的,这是最根本的原因。因此如果窗口绘制差别不大,即使刷新再频繁,也不会引起闪烁。但是差别较大的画面输出一定会引起闪烁吗?还有一个因素要考虑进来,就是屏幕的刷新频率。根据显卡和显示器的不同,屏幕的刷新周期是不一样的,虽然这个参数的差别对界面开发的影响几乎可以忽略,但是如果你真的从思想上理解了这一点,你就会立即明白为什么双缓冲技术能够帮助我们解决一部分闪烁问题。

二、再谈闪烁的原因

虽然第一部分的描述对我们有一些启发,但我们还是应该更深入一些!哪些情况下会导致我们的窗口或控件输出连续的差别较大的绘制界面呢?

1、绘制界面太复杂,一个刷新周期内绘制不完,每次都输出一部分绘制结果,导致几次刷新闪烁。

我们的绘制过程都是通过很多个绘制语句组成的,如果这些语句加起来的时间大于一个刷新周期,那么就很可能引起闪烁。通常的解决办法是去掉中间过程的刷新,直到最后整体绘制完毕再一次性刷新。是不是似曾相识,这就是双缓冲技术的原理!但是有些情况是双缓冲也无能为力的,后面再讲。

2、绘制过程很简单,但是需要频繁刷新。

这种情况下我们首先需要弄清楚频繁刷新的原因是什么,不同的原因对应不同的解决办法。但是归根结底,我们还是为了减少刷新的次数或者尽量去掉中间输出差别较大的绘制输出。

3、刷新过程。

对于窗口或控件的界面显示,windows系统有一套绘制和刷新的规则,绘制或刷新的时机选择也是影响闪烁的重要因素。如果再与上面两条结合起来,某些情况下引起闪烁的原因确实非常复杂。只有我们分析出问题所在,才能用正确的方法解决之。

三、几种消除闪烁的解决方案

1、尽量减少重复绘制

MFC的窗口和控件刷新有一套很复杂的规则,如果我们能深入理解,正确应用的话就能避免一部分闪烁。比如尽量用InvalidateRect()函数代替Invalidate()函数,InvalidateRect()函数只刷新界面上指定的区域,如果我们的界面上只有一小部分需要频繁刷新,那么用这个函数代替Invalidate()的话,解决闪烁问题的效果是非常明显的。这个函数已经封装到MFC的CWnd类中(也有API函数)。

voidInvalidateRect(LPCRECT lpRect, BOOL bErase = TRUE);

其中,lpRect指向一个方形区域,该区域将被添加到需要更新的区域列表中,bErase指定刷新时是否更新区域背景。

如果我们需要刷新的区域是不规则的,比如是几个区域的组合,或者是某区域中去掉一部分,这时候用InvalidateRect()不能满足我们的需求,我们可以用InvalidateRgn()函数。

voidInvalidateRgn (CRgn* pRgn, BOOL bErase = TRUE);

其中,pRgn指向需要刷新的区域。下面是一段示例代码:

CrectrectClient;

CRgnrgn1, rgn2;

GetClientRect(rectClient);

rgn1.CreateRectRgnIndirect(rectClient);

rgn2.CreateRectRgnIndirect(m_rectButton);

rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);

InvalidateRgn(&rgn1, FALSE);

有的时候我们的窗口上有很多控件,如果是由我们负责控件刷新(比如窗口设置了WS_CLIPCHILDREN风格),我们最好判断不同情况下确实需要刷新的控件,而不是简单的将所有控件全部刷新一遍,以此将闪烁的影响减小到最小。

2、正确选择窗口重绘时机

Windows有很多刷新和重绘的函数,但是他们的特性和运行方式不尽相同,我们需要了解调用这些函数的注意事项,否则很可能因为实际情况跟我们的预期不同而引起闪烁。

Windows系统是通过WM_PAINT消息来通知界面重绘的,该消息一般由系统自动产生,比如当窗口被创建、改变大小、最大化、移动、覆盖等等,另外当UpdateWindow等函数被调用时也会产生WM_PAINT消息。

当窗口重绘时,并不一定整个窗口区域都需要刷新,而只是需要更新的那一部分,这部分区域叫做“无效区域”。系统在发现消息队列空闲时会检查无效区域,如果存在就会发送WM_PAINT消息进行刷新。

Invalidate()、InvalidateRect()、InvalidateRgn()这些函数都只是产生无效区域,而并没有发送WM_PAINT消息,也就是说我们调用这些Invalidate()函数时,并不一定会使窗口立即刷新,而是要等到下次WM_PAINT消息进入到消息队列时才行。如果要使重绘立即执行,可以调用UpdateWindow()函数或者RedrawWindow()函数强制刷新。

Windows的窗口重绘时,会首先判断是否需要刷新背景,如果需要则首先刷新窗口背景,然后进入OnPaint()函数进行窗口内容的绘制。这个过程中如果操作不当,也有可能引起闪烁。当我们遇到闪烁问题,可以从以上窗口绘制机制中查找是否某些步骤的操作引起了闪烁。比如我们在对一个CListCtrl控件进行频繁操作时(比如添加多个项或者修改内容),可以先调用SetRedraw(FALSE),在操作全部完成后,再调用SetRedraw(TURE)完成一次性刷新。

3、控制窗口背景刷新

Windows窗口背景刷新默认情况下是系统帮你完成的,如果我们的窗口绘制内容和背景差别比较大,或者在刷新背景和刷新窗口绘制之间有一个明显的时间间隔,就有可能引起闪烁。

这个时候我们可能要禁止系统默认的背景绘制,而在窗口绘制函数中自行处理背景。这时只要重载OnEraseBkgnd()函数,并直接返回TRUE就可以了,代码如下:

BOOLCMyWnd::OnEraseBkgnd(CDC* pDC)

{
  returnTRUE;
  //returnCWnd::OnEraseBkgnd(pDC);//注释掉默认语句
}

4、双缓冲

也许你已经听说过双缓冲这种方法了,的确,多数情况下双缓冲能很好的解决我们的窗口闪烁问题,尤其是涉及到窗口自绘的时候。双缓冲的基本原理是首先将复杂的绘制结果输出到内存DC上,然后再一次性输出到真正的窗口DC,这样就避免了由于绘制时间占用多个刷新周期,而导致一次绘制引起短时间多次输出产生闪烁。双缓冲方法结合上一个方法,可以解决大部分自绘窗口的闪烁问题。具体的双缓冲示例代码如下:

voidCMyWnd::OnPaint()

{

CPaintDCdc(this);

CRectrectClient;

GetClientRect(&rectClient);

CDCdcMem;

CBitmapbmpMem;

dcMem.CreateCompatibleDC(&dc);

bmpMem.CreateCompatibleBitmap(&dc,rectClient.Width(),rectClient.Height());

dcMem.SelectObject(&bmp);

//此处将绘制内容输出到dcMem上

//dcMem.FillRect(rectClient,&brush);

dc.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMem,0,0,SRCCOPY);

bmpMem.DeleteObject();

dcMem.DeleteDC();

  }

5、合理设置WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格

当我们的窗口界面有多层窗口组成时(比如包含多个控件的对话框),用到自绘窗口可能会经常碰到闪烁问题。因为多层窗口会涉及到很多遮挡,重绘时一般涉及到主窗口和子窗口等多个窗口,而这些窗口的刷新可能不会在一个刷新周期内完成,从而引起闪烁。这时我们可以通过设置WS_CLIPCHILDREN和WS_CLIPSIBLINGS这两个窗口风格来控制刷新行为。

Clip是裁剪的意思,两个属性的具体含义如下:

带有WS_CLIPCHILDREN风格表示裁剪掉子窗口的区域,即当该窗口重绘时,它的子窗口区域不刷新,而留给子窗口自己去刷新;

带有WS_CLIPSIBLINGS风格(只用于子窗口)表示裁剪掉兄弟窗口的区域,即当该窗口重绘时,与兄弟窗口重叠的(www.61k.com)区域将不会被刷新。

根据这些窗口行为,我们就能优化我们的界面刷新,控制一些窗口的刷新时机,或者减少重叠区域的重复刷新。比如当对话框窗口放置了大量控件时,我们可以给对话框加上WS_CLIPCHILDREN风格来阻止一些不必要的刷新。

6、多层次窗口调整大小

如果窗口包含很多子窗口,当我们调整窗口大小时,可能要同时调整子窗口的位置和大小。此时若使用MoveWindow()或SetWindowPos()等函数进行调整,由于这些函数会等窗口刷新完才返回,因此当有大量子窗口时,这个过程肯定会引起闪烁。

这时我们可以应用BeginDeferWindowPos(),DeferWindowPos()和EndDeferWindowPos()三个函数解决。首先调用BeginDeferWindowPos(),设定需要调整的窗口个数;然后用DeferWindowPos()移动窗口(并非立即移动窗口);最后调用EndDeferWindowPos()一次性完成所有窗口的调整。

7、拖动和调整大小时的虚线框

当以上方法无效或者实现起来过于复杂,有没有更统一更简洁的方法呢?可能你曾经注意到Windows操作系统有这样一种视觉效果(右击我的电脑->属性->高级->设置->视觉效果->自定义,去掉“拖拉时显示窗口内容”选项),当你拖动和调整窗口大小时,并不是即时显示窗口内容,而是出现一个虚线框,当调整结束时才一次性绘制最终界面。这时一个非常好的防止闪烁的方法,我们来看看怎么实现这种效果。

比较复杂的方法是自己画虚线框,响应WM_MOVING消息画虚线框,响应WM_MOVE消息绘制窗口内容,不过这个方法的难度可想而知,具体内容可以查看这个讨论帖。

有没有简单的方法呢?调用SystemParametersInfo这个API函数可以改变系统“拖拉时显示窗口内容”项的设置,但是如果我们设置以后,系统其他窗口的行为也将被改变。其实我们只要判断什么时候需要绘制虚线框,此时调用SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,FALSE, NULL,SPIF_SENDWININICHANGE),然后在拖动完毕需要绘制的时候调用SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NULL,SPIF_SENDWININICHANGE)恢复设置就可以了。当然如果希望完全不影响系统原来的设置,我们只要每次都先查询一下系统原设置,然后恢复设置就可以了。

具体处理过程是在CDialog的OnNcLButtonDown消息响应函数中,当用户点击对话框的非客户区时该函数会被调用,而我们移动窗口或者调整窗口大小都是要点击非客户区(标题栏或边框)触发该消息。拖动过程中的处理是在CDialog::OnNcLButtonDown(nHitTest,point)中完成的,因此,我们只要按如下代码实现即可:

voidCMyDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{

// 1,查询当前系统“拖动显示窗口内容”设置

SystemParametersInfo(SPI_GETDRAGFULLWINDOWS,0, &m_bDragFullWindow, NULL);

//2,如果需要修改设置,则在每次进入CDialog::OnNcLButtonDown默认处理之前修改

if(m_bDragFullWindow)
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, FALSE, NULL,NULL);


// 3,默认处理,系统会自动绘制虚框

CDialog::OnNcLButtonDown(nHitTest, point);

// 4,默认处理完毕后,还原系统设置

if(m_bDragFullWindow)
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, TRUE, NULL, NULL);

}

三 : 电脑屏幕闪烁怎么办 原因及解决办法

引起电脑屏幕抖动的原因有很多,但是遇到了这种情况我们又该如何是好呢,没关系下面小编就把电脑屏幕抖动的原因告诉大家希望能对您有所帮助。(www.61k.com]

电脑屏幕闪烁怎么办之原因

液晶屏闪 电脑屏幕闪烁怎么办 原因及解决办法
  电脑屏幕闪烁最常见的原因有:通常是因为接触不良和信号干扰;其次电脑屏幕闪烁的原因也有可能是因为屏幕刷新频率太低和显卡驱动;再次是因为劣质电源所导致;最后的一个问题一般都是因为电脑硬件本身的问题。

电脑屏幕闪烁怎么办之人体危害

液晶屏闪 电脑屏幕闪烁怎么办 原因及解决办法
  电脑屏幕下方闪烁、黑屏、电脑屏幕抖动,除了会让我们的眼睛感觉很疲劳,时间长了也会给使用者带来眼疾。如果不及时解决会对你的系统造成损坏,因为可能是系统本身隐藏的问题反映在屏幕抖动的现象上。其实有很多原因可以导致屏幕出现抖动的现象,实际上解决起来也不是那么困难。

电脑屏幕闪烁怎么办之解决方法

液晶屏闪 电脑屏幕闪烁怎么办 原因及解决办法
  第一、在知道是接触不良引起的电脑屏幕闪烁之后,我们要先看看主机和显示器的电源线有没有接稳,如果比较松就会出现这种闪屏。

  第二、如果是在信号干扰的环境下我们要先看看有没有防干扰的那个黑色凸起物,这个东西也会对屏幕也会有有干扰,最后还要检查附近是否有干扰,如大功率音响、电源变压器等,显示器很容易受到强电场或强磁场的干扰,某些时候屏幕抖动是由显示器附近的磁场或电场引起的。

  第三、因显示器、显卡等硬件问题导致的电脑屏幕闪烁,有时由于使用的显示器年岁已高,也会出现抖动现象,为了检验显示器内部的电子元件是否老化,可将故障的显示器连接到别人的计算机上进行测试,如果故障仍然消失,说明显示器已坏,需要修理。

结语:以上几点就是电脑屏幕闪烁的原因以及怎么解决处理的一些方法,当大家日常生活遇到以上电脑屏幕闪烁的一般问题,可以自己先解决下,如果是硬件出现问题,可以找专业人士维修,希望能您有所帮助。bsp;背光键盘 |
|ipad mini价格 |主板温度过高怎么办|电脑没声音怎么办|三星平板电脑 |微信怎么用|

四 : iphone6plus屏幕闪烁灰条是怎么回事 苹果6plus屏幕闪烁灰条解决办法

iphone6plus屏幕闪烁灰条这种情况相信很多用户都出现这个问题,不知道怎么解决,因此就让小编给大家讲讲解决办法吧,想知道的一起来看看吧。

苹果6plus屏幕闪烁灰条解决办法

iPhone6这一代产品给用户带来了不少麻烦,起初新设备上市的时候,弯折门让很多用户不得不对设备多加以注意,后来又有一小部分iPhone6Plus设备的iSight摄像头中存在一个可能因故障而导致照片模糊不清的组件,好在出现这些问题之后苹果公司都及时采取行动,要么为用户更换全新的设备,要么免费更换iSight摄像头。

不过iPhone6系列产品今年又出现了新的问题,这个问题在今年早些时候威锋网已经进行过集中报道,具体就是 iPhone 6 Plus 屏幕出现闪烁灰条的问题。

iPhone 6 和 6 Plus 中,Touch IC 芯片是通过一系列极小的焊锡球连接到逻辑板的。随着时间的推移,手机在使用过程中被稍微弯折,这些焊锡球可能就会出现裂缝,连接不到逻辑板。

所以一开始你可能会发现有时候屏幕不响应,不过强制重启之后可能就好了。但是裂缝变大之后,芯片就更难通过焊锡球连接到逻辑板,触摸不响应的问题就会更加频繁地出现。

如果这时候手机再被摔一下,两者的连接就完全断开,接收不到信号,闪烁的问题更加严重,最后完全用不了。

当时虽然很多用户都反映了这个问题,可是苹果方面并没有做出任何回复,不过今天在苹果官网的支持页面中,我们发现了一个新增的“适用于 iPhone 6 Plus 的 Multi-Touch 维修计划”(点此查看)。

苹果在该计划描述中指出,部分 iPhone 6 Plus 设备在多次掉落到坚硬表面后若再进一步受压,可能会出现显示屏闪烁或 Multi-Touch 问题。

如果您的 iPhone 6 Plus 出现上述症状,但能正常使用且屏幕未破裂或破损,那么苹果或苹果授权服务提供商将按照制造商建议的维修价格 1,100 元人民币来维修您的设备。苹果授权服务提供商的定价可能有所差异。

苹果将联系可能已通过苹果或苹果授权服务提供商支付此问题相关维修服务费的客户,以安排补偿事宜。如果我们尚未联系您,但您确信自己已支付与此问题相关的维修费用,请联系苹果。

至于维修流程,请携带您的 iPhone 6 Plus 前往参加本计划的 Apple 授权服务提供商处。在提供任何维修之前,我们将对您的 iPhone 进行检查,以验证其符合此计划的条件并可正常使用。

本计划仅适用于 iPhone 6 Plus。另外无线运营商合作伙伴不参加此计划。苹果提醒你在 iPhone 6 Plus 执行该维修流程之前,请先将数据备份到 itunes 或 iCloud。

苹果可能会将维修区域限制为原购买国家/地区。受到影响的 iPhone 6 Plus 设备自首次零售日起的 5 年内均可参加这项全球计划。

在这个问题困扰用户这么久之后,苹果公司终于发声,这应该能让很多受影响的 iPhone 6 Plus 的用户看到了希望。

国内受这个问题影响的 iPhone 6 Plus 用户也不少,如果此前你为了解决问题而对设备进行维修,那么请耐心等待或许苹果会进行相关差价补偿,而如果你还没有维修你的设备的话,那么你可以通过苹果提供的几种方式尽快预约维修吧。

本文标题:屏幕闪烁解决办法-Win7/Win8下摄像头使用过程会有波纹闪烁现象的解决方法
本文地址: http://www.61k.com/1068266.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1