webbrowser控件闪屏如何解决。

老子天下 2017-06-01 09:10:24
最近做一个项目,用MFC建一个对话框工程,对话框上就一个web browser控件,每次调用m_webBrowser.Navigate(csServerPageUrl,NULL,NULL,NULL,NULL);方法来打开网页。
现在的问题是,在每次调用Navigate()时屏幕会有一点闪烁的感觉,好像这是因为加载过程中webbrowser控件背景是白色造成的。
看到网上的解决方案,说的重载OnEraseBkgnd()函数,自己写了一个钩子,拦截WM_ERASEBKGND消息,依然闪烁,后来用SPY++跟踪发现,webbrowser一直都没有这个消息。

请教一下,谁遇到过这种问题。

不要贴在网上搜索的防止窗口和控件闪烁的问题了,我都试过了,请真正遇到这个问题解决了的朋友来解答一下,谢谢。
...全文
978 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39275558 2017-06-22
  • 打赏
  • 举报
回复
楼上的能把代码贴出来吗,我现在需要解决这个问题
向立天 2017-06-02
  • 打赏
  • 举报
回复
子类华这个控件把OnEraseBkgnd重写试试
老子天下 2017-06-02
  • 打赏
  • 举报
回复
顶上去让更多人看到
老子天下 2017-06-02
  • 打赏
  • 举报
回复
自己解决了,解决方法如下: 开始程序时添加代码 //解决控件闪的问题 hHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,NULL,GetCurrentThreadId()); //安装钩子 退出程序时添加代码 //解决IE控件闪的问题 UnhookWindowsHookEx(hHook); //卸载钩子 程序中添加代码 ///////////////////////////////解决IE控件闪的问题/////////////////////////////////// LONG prevProc1=NULL; HHOOK hHook=NULL; LRESULT CALLBACK MyWndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if(WM_ERASEBKGND==message) //拦截背景擦出消息 return true; if(WM_PAINT==message) //拦截背景擦出消息 return true; return CallWindowProc((WNDPROC)prevProc1,hWnd, message, wParam, lParam); } //对IE控件子类化 LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { if(HC_ACTION==nCode) { PCWPSTRUCT pInfo=(PCWPSTRUCT)lParam; if(WM_CREATE==pInfo->message) { char className[101]={0}; GetClassNameA(pInfo->hwnd,className,100); if(0==strcmp(className,"Internet Explorer_Server")) { prevProc1=GetWindowLong(pInfo->hwnd,GWL_WNDPROC); SetWindowLong(pInfo->hwnd,GWL_WNDPROC,(LONG)MyWndProc1); } } } return CallNextHookEx(hHook,nCode,wParam,lParam); } ///////////////////////////////解决IE控件闪的问题///////////////////////////////////
老子天下 2017-06-02
  • 打赏
  • 举报
回复
引用 10 楼 xianglitian 的回复:
子类华这个控件把OnEraseBkgnd重写试试
重写了,没有效果,而且我用SPY++跟踪过,webbrowser从来没有促发过这个消息。
老子天下 2017-06-01
  • 打赏
  • 举报
回复
引用 4 楼 zsl_008 的回复:
[quote=引用 2 楼 worldy 的回复:] 在m_webBrowser的父窗口,创建时,指定WS_CLIPCHILD及WS_CLIPSLIBING风格
WS_CLIPCHILDREN和WS_CLIPSIBLINGS好像是这种两种风格,你说的风格不存在[/quote]
引用 4 楼 zsl_008 的回复:
[quote=引用 2 楼 worldy 的回复:] 在m_webBrowser的父窗口,创建时,指定WS_CLIPCHILD及WS_CLIPSLIBING风格
WS_CLIPCHILDREN和WS_CLIPSIBLINGS好像是这种两种风格,你说的风格不存在[/quote] 试验了一下,还是不行。 好像并不是因为重绘造成的闪烁,而是因为webbrowser控件,加载内容完成之前,由于webbrowser加载的时候背景是白色,而且加载的页面不是白色,所以在加载和加载成功时切换时产生的闪烁现象。
老子天下 2017-06-01
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
在m_webBrowser的父窗口,创建时,指定WS_CLIPCHILD及WS_CLIPSLIBING风格
WS_CLIPCHILDREN和WS_CLIPSIBLINGS好像是这种两种风格,你说的风格不存在
老子天下 2017-06-01
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
在m_webBrowser的父窗口,创建时,指定WS_CLIPCHILD及WS_CLIPSLIBING风格
楼上的,能说清楚一些吗?另外这种解决是什么原理?
worldy 2017-06-01
  • 打赏
  • 举报
回复
在m_webBrowser的父窗口,创建时,指定WS_CLIPCHILD及WS_CLIPSLIBING风格
赵4老师 2017-06-01
  • 打赏
  • 举报
回复
CreateDesktop ?
老子天下 2017-06-01
  • 打赏
  • 举报
回复
引用
Windows Phone 7开发技巧【1】——修改Webbrowser控件背景颜色和防止加载过程中的闪烁 三、防止WebBrowser控件加载过程中的闪烁 大致分析一下发生闪烁产生的原因。WebBrowser控件自身的背景颜色是白色,加载咱们的html后,背景被修改为黑色。那么在WebBrowser控件显示以后,加载html完成之前,WebBrowser控件将呈现白色。这段时间比较短暂,但还是被我们灵敏的眼睛捕捉到了。原因清晰了,我们来考虑解决的方法:我们想要的是加载html完成后的WebBrowser,之前他是什么样子,我们不care,既然不care,干脆隐藏掉好了,相比各位又猜出十之八九了。 Xaml <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <phone:WebBrowser Name="webBrowser" Margin="12,0,0,0" Opacity="0" LoadCompleted="WebBrowser_LoadCompleted"/> </Grid> 设置WebBrowser控件的Opacity属性为0,将其默认隐藏。处理LoadCompleted事件。 代码 private void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e) { webBrowser.Opacity = 1; } 响应LoadCompleted事件,WebBrowser控件加载完毕后,才将其显示出来。运行,效果不错,整个世界清静了。
网上找到这个东西,是windows phone 7的解决办法,原因是一样的,不过vc 2010 下的webbrowser控件应该怎么办呢?
老子天下 2017-06-01
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
打错了,就是WS_CLIPSLIBING, 那你换个网页试试,是不是也晃
不是网页的问题,都试过了,是因为webbrowser控件,它本身是白色背景,加载了网页之后,要先显示一下白色背景,再显示网页,所以看来就有白色一闪的情况。
worldy 2017-06-01
  • 打赏
  • 举报
回复
打错了,就是WS_CLIPSLIBING, 那你换个网页试试,是不是也晃

3,055

社区成员

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

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