ブラウザコントロールの再描画の問題
ウィンドウに埋め込まれたブラウザコントロールがタイムリーに再描画できない場合があります.たとえば、ブラウザコントロールを使用してメッセージの内容を表示するメッセージプロンプトウィンドウを作成します.アニメーション表示にAnimateWindowを使用すると、ブラウザコントロールに空白が表示されます.次に、ブラウザコントロールの再描画について説明します.
シーンを再現します.
シーンを再現します.
//生成一个窗口(略)
HWND hwnd=窗口handle.
//内嵌浏览器控件。
::AtlAxCreateControlEx(L“about:blank”,hwnd,NULL,NULL,(IUnknown **)&pUnkControl);
...
//窗口动画。
//为了程序的兼容性,当AnimateWindow失败时,要调用传统的ShowWindow。
if(!::AnimateWindow(hwnd,200,AW_SLIDE | AW_VER_NEGATIVE))
{
::ShowWindow(hwnd,SW_SHOW);
}
重绘的目标。取得“Internet Explorer_Server”:
HWND __getWebBrowserHwnd(HWND hwndShell) { // if(hwndShell==NULL) return NULL; //loop TCHAR szClassName[MAX_PATH]; HWND hwnd=hwndShell; while(true) { // ::GetClassName(hwnd,szClassName,MAX_PATH); if(::_wcsicmp(L"Internet Explorer_Server",szClassName)==0) { return hwnd; } // hwnd=::GetWindow(hwnd,GW_CHILD); if(hwnd==NULL) break; } return NULL; }
やり直しのタイミング.ウィンドウアニメーションは、指定した時間だけ実行されます.ユーザが表示するのは最後のページの内容なので、アニメーション中に再描画を開始する必要はなく、アニメーションが完了した後に行います.では、アニメイトウィンドが終わったことをどうやって知るのでしょうか.幸いなことに、AnimateWindowは同期リターンを採用している(AJAXで流行している非同期呼び出し思想とは異なる).つまり、アニメーションの実行が完了すると、AnimateWindowが戻ります.そのため、再描画のタイミングはAnimateWindowの後です.//redraw the web page. HWND hwnd=__getWebBrowserHwnd(hwndShell); // if(hwnd!=NULL) { ::InvalidateRect(hwnd,NULL,TRUE); ::UpdateWindow(hwnd); }
テキストリンク:http://blog.csdn.net/pimshell/article/details/1611199