浏览器控件的重绘问题

在有些情况下,窗口内嵌的浏览器控件不能及时重绘。例如,我们建立一个"消息提示窗",采用浏览器控件显示消息的内容。当我们采用AnimateWindow进行动画显示时,浏览器控件会显示一片空白。下面我们探讨浏览器控件的重绘问题。

目前创新互联已为上千多家的企业提供了网站建设、域名、虚拟主机、网站托管、服务器租用、企业网站设计、恩阳网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

重现场景。

 
 
 
  1. //生成一个窗口(略) 
  2. HWND hwnd=窗口handle. 
  3.  
  4. //内嵌浏览器控件。 
  5. ::AtlAxCreateControlEx(L“about:blank”,hwnd,NULL,NULL,(IUnknown **)&pUnkControl); 
  6.  
  7. ... 
  8.  
  9. //窗口动画。 
  10. //为了程序的兼容性,当AnimateWindow失败时,要调用传统的ShowWindow。 
  11. if(!::AnimateWindow(hwnd,200,AW_SLIDE | AW_VER_NEGATIVE)) 
  12.     ::ShowWindow(hwnd,SW_SHOW); 
  13. }

重绘的目标。取得“Internet Explorer_Server”:

 
 
 
  1. HWND __getWebBrowserHwnd(HWND hwndShell) 
  2.     // 
  3.     if(hwndShell==NULL) 
  4.         return NULL; 
  5.  
  6.     //loop 
  7.     TCHAR szClassName[MAX_PATH]; 
  8.     HWND hwnd=hwndShell; 
  9.     while(true) 
  10.     { 
  11.         // 
  12.         ::GetClassName(hwnd,szClassName,MAX_PATH); 
  13.         if(::_wcsicmp(L"Internet Explorer_Server",szClassName)==0) 
  14.         { 
  15.             return hwnd; 
  16.         } 
  17.          
  18.         // 
  19.         hwnd=::GetWindow(hwnd,GW_CHILD); 
  20.         if(hwnd==NULL) 
  21.             break; 
  22.     } 
  23.  
  24.     return NULL; 

重绘的时机。窗口动画将执行一段指定的时间。用户要看到的是最后的页面内容,因此不必在动画过程中启动重绘,而是 在动画完成之后进行。那么怎样才知道AnimateWindow结束了呢?幸运的是,AnimateWindow采用的是同步返回(与AJAX中流行的异 步调用思想是不同的。)。也就是说,当动画执行完毕后,AnimateWindow才返回。因此,重绘的时机是在AnimateWindow之后。

 
 
 
  1. //redraw the web page. 
  2. HWND hwnd=__getWebBrowserHwnd(hwndShell); 
  3.  
  4. // 
  5. if(hwnd!=NULL) 
  6.     ::InvalidateRect(hwnd,NULL,TRUE); 
  7.     ::UpdateWindow(hwnd); 

名称栏目:浏览器控件的重绘问题
链接地址:http://www.csdahua.cn/qtweb/news45/523595.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网