admin 发表于 2012-7-3 17:00:03

[帮助]关于IE控件闪烁解决方案

标准系统控件闪烁主要原因,是因为每次重绘时需要绘制两次,第一次擦出背景绘制,第二次绘制内容,两次绘制颜色不一样,导致用户看见控件闪烁!

解决办法就是拦截系统控件背景擦出消息WM_ERASEBKGND,不让它擦出背景,这样就不会闪烁!

IE控件比较特殊,所以处理起来也比较麻烦,下面是对IE控件的特殊处理.
LONG prevProc1=NULL;
HHOOK hHook=NULL;
LRESULT CALLBACK MyWndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
      if(WM_ERASEBKGND==message) //拦截背景擦出消息
                return 0;

      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={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);
}
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
      XInitXCGUI(); //初始化界面库
      //.... 您的代码
      hHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,NULL,GetCurrentThreadId()); //安装钩子

      XRunXCGUI(); //运行

      UnhookWindowsHookEx(hHook); //卸载钩子
}



黑色太阳 发表于 2012-7-3 20:00:04

这个非常好!
页: [1]
查看完整版本: [帮助]关于IE控件闪烁解决方案