日期:2014-05-17  浏览次数:21245 次

[IE编程]如何消除Webbrowser控件切换时的闪烁?
环境:VS2005 C# XP

小弟以webbrowser控件为基础做一个多页面网页流览器,页面切换时会有相对明显的闪烁。经goole,网上找到这么一篇资料:

Web Browser控件和CHtmlView有什么具体应用我也不废话了,咱们开门见山吧。

通常使用上述两个东西的时候会发现切换的时候有很严重的闪烁。

仔细观察你会发现,比方在ChtmlView中,窗口的绘画过程是:先画View的背景,然后在上层画控件(即网页)

解决办法很简单,禁止View进行那无用的导致闪烁的绘制背景过程。

具体做法 :

在派生类里处理WM_ERASEBKGND消息

BOOL CMyHtmlView::OnEraseBkgnd(CDC* pDC) 
{
 return TRUE; 
// return CHtmlView::OnEraseBkgnd(pDC);
}

通过上面的改动以后,你会发现VIEW会跟腾讯的QQ浏览器一样无闪烁:)

Web Browser控件的相应做法类似,不再详述

于是在Webbrowser控件里重写WndProc方法,截获该消息,但没有效果。重写OnPaintBackground,让它啥也不干,照样没效果。忽然想到Webbrowser不过是对底层axwebbrowser控件的封装,于是改用底层的axwebbrowser,还是重写WndProc和OnPaintBackground,结果令人大失所望,页面切换时闪烁依旧。

请问有什么好的办法吗?
------最佳解决方案--------------------
C C++ VC MFC 群1
------其他解决方案--------------------
关注,接分
------其他解决方案--------------------
支持这篇文章
------其他解决方案--------------------
没看懂哦,我做的时候没这个问题
------其他解决方案--------------------
路过过不去
------其他解决方案--------------------
自己顶一下
------其他解决方案--------------------
再up
------其他解决方案--------------------
该问题可以这样概括:

双缓冲有效解决了自定义控件闪烁问题,但对于一些系统控件而且不能设置双缓冲的控件比如Webbrowser,如何防止其闪烁呢?

难道我得回归VC了?
------其他解决方案--------------------
用webbrowser控件做多标签式的浏览器,当点击标签切换不同页面时会有闪烁---当页面以黑色为背景时尤其明显
------其他解决方案--------------------
解决方法如下:

从WebBrowser派生一个新类


构造函数中添加DocumentCompleted事件响应

相关代码:


        [DllImport("user32.dll")]
        protected static extern int GetWindowLong(int hwindow, int unindex);
        [DllImport("user32.dll")]
        protected static extern int CallWindowProc(int lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam);
        [DllImport("user32.dll")]
        protected static extern int SetWindowLong(int hwindow, int unindex, CallWindowProcDelegate lnewvalue);


        public static int oldWindow = 0; 
        public const int GWL_WNDPROC = -4;
        public delegate int CallWindowProcDelegate(int Wnd, int Msg, int WParam, int LParam);
        public  CallWindowProcDelegate MyCallWindowProc; 

    bool add = false;

        void ExtendWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if(add)