[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)