怎么在layeredwindow上半透明显示WebBrowser控件?创建了一个layered window然后调用UpdateLayeredWindow函数可以进行alpha混合半透明显示图片、flash等元素,但是不知道怎么半透明显示WebBrowser控件;试过用显示flash的方式,行不通。分析了一下原因:flash显示方式:网上抄了一个OleContainer模板,
BOOL iGdiTexture::__IsPaintMsg(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult){if (!m_device->IsLayeredWindow() [解决办法] !m_msgHooks.HasMessage(uMsg))return FALSE;HDC hdc = m_alpha ? getDC() : getTexDC();lResult = ::CallWindowProcW(m_oldProc, hWnd, uMsg, wParam, lParam);if (m_renderType==5 && m_oleObject) // Ole{// 浏览器控件的典型样式://<object progid="Shell.Explorer"浏览器控件的PROGID//bind-class="Internet Explorer_Server"改变到HOOK这个类名的窗口//bind-type="5"绑定方式//bind-messages="0x0118 timer"HOOK这些消息//style="width:100%;height:180;"//location="www.baidu.com"初始化打开的网址//title="WebBrowser">haha</object>CComQIPtr<IViewObject> vo = m_oleObject;if (vo.p){RECTL rc = {0,0,(LONG)m_width,(LONG)m_height};HRESULT hr = vo.p->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdc, (RECTL*) &rc, NULL, NULL, NULL); }}else{switch (m_renderType){case 0: // WM_PAINT::CallWindowProcW(m_oldProc, hWnd, WM_PAINT, (WPARAM)hdc, lParam);break;case 1: // WM_PRINT::CallWindowProcW(m_oldProc, hWnd, WM_PRINT, (WPARAM)hdc, (LPARAM)(PRF_CHECKVISIBLE[解决办法]PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));break;case 2: // WM_PRINTCLIENT::CallWindowProcW(m_oldProc, hWnd, WM_PRINTCLIENT, (WPARAM)hdc, (LPARAM)(PRF_CHECKVISIBLE[解决办法]PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));break;default:::CallWindowProcW(m_oldProc, hWnd, WM_PAINT, (WPARAM)hdc, lParam);}//::SendMessage(m_pWin->m_hWnd, WM_PAINT, (WPARAM)hdc, 0);//::SendMessage(hWnd, WM_PRINT, (WPARAM)hdc, (LPARAM)(PRF_CHECKVISIBLE[解决办法]PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));//::SendMessage(m_hWnd, WM_PRINTCLIENT, (WPARAM)hdc, (LPARAM)(/*PRF_CHECKVISIBLE[解决办法]*/PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));}if (m_alpha)releaseDC(hdc);elsereleaseTexDC(hdc);m_dirty = FALSE;m_device->render();return TRUE;}
}}else{switch (m_renderType){case 0: // WM_PAINT::CallWindowProcW(m_oldProc, hWnd, WM_PAINT, (WPARAM)hdc, lParam);break;case 1: // WM_PRINT::CallWindowProcW(m_oldProc, hWnd, WM_PRINT, (WPARAM)hdc, (LPARAM)(PRF_CHECKVISIBLE[解决办法]PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));break;case 2: // WM_PRINTCLIENT::CallWindowProcW(m_oldProc, hWnd, WM_PRINTCLIENT, (WPARAM)hdc, (LPARAM)(PRF_CHECKVISIBLE[解决办法]PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));break;default:::CallWindowProcW(m_oldProc, hWnd, WM_PAINT, (WPARAM)hdc, lParam);}//::SendMessage(m_pWin->m_hWnd, WM_PAINT, (WPARAM)hdc, 0);//::SendMessage(hWnd, WM_PRINT, (WPARAM)hdc, (LPARAM)(PRF_CHECKVISIBLE[解决办法]PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));//::SendMessage(m_hWnd, WM_PRINTCLIENT, (WPARAM)hdc, (LPARAM)(/*PRF_CHECKVISIBLE[解决办法]*/PRF_NONCLIENT[解决办法]PRF_CLIENT[解决办法]PRF_ERASEBKGND[解决办法]PRF_CHILDREN[解决办法]PRF_OWNED));}if (m_alpha)releaseDC(hdc);elsereleaseTexDC(hdc);m_dirty = FALSE;m_device->render();return TRUE;}