100分求助,CHtmlView NewWindow3打开网页偶尔会出现空白

五月蝇 2013-08-27 09:41:00
CHtmlView 的NewWindow3打卡页面偶会会出现空白,什么内容也没有,也不报错。还有时会出现页面内容不刷新,先用IE打开该页面后(IE下显示正常),在用NewWindow3打开就正常显示了。在线等答案。谢谢了!
...全文
242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
resite 2013-11-06
  • 打赏
  • 举报
回复
BOOL CHtmWChildFrm::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= WS_CLIPCHILDREN; if( !CMDIChildWnd::PreCreateWindow(cs) ) return FALSE; return TRUE; } BOOL CHtmWChildFrm::OnEraseBkgnd(CDC* pDC) { return TRUE; // return CMDIChildWnd::OnEraseBkgnd(pDC); }
resite 2013-11-06
  • 打赏
  • 举报
回复
分两种情况处理: 1)当单或多文档视图从CHtmlView派生, 需要重写对应视图的ON_WM_ERASEBKGND()消息 BOOL CXXXView::OnEraseBkgnd(CDC* pDC) { return TRUE; // return CHtmlView::OnEraseBkgnd(pDC); } 2)当CHtmlView显示在"对话框"上时,这个问题通常出现在WM_SIZE消息发生的时候, //假设你写的CHtmlView的派生类对象成员变量为m_HtmlCtrlEx,从CStatic对象IDC_STATIC1HtmlView创建,如m_HtmlCtrlEx.CreateFromStatic(IDC_STATIC1HtmlView, this,FALSE, WM_APP_HTML, TRUE); //处理WM_SIZE消息时, 在OnSize函数末尾, 补充子窗口更新的行 CWnd* pWnd = GetDlgItem(IDC_STATIC1HtmlView); //此行为pWnd->SetWindowPos(...调用, 改变网页窗口大小或位置 m_HtmlCtrlEx.UpdateWindow(); //需要补充这行代码以避免偶尔显示空白问题. //以下补充头文件定义, 以对上述问题补充 #if !defined(AFX_HTMLCTRLEX_H__9285D48B_787C_4E47_8FA4_E0B020410221__INCLUDED_) #define AFX_HTMLCTRLEX_H__9285D48B_787C_4E47_8FA4_E0B020410221__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // HtmlCtrlEx.h : header file // ///////////////////////////////////////////////////////////////////////////// // CHtmlCtrlEx html view #ifndef __AFXEXT_H__ #include <afxext.h> #endif #include <afxhtml.h> #define WM_APP_HTML 4000 //对不合格的报告处理更新消息! class CWndIE : public CWnd { BOOL m_bDefault; public: CWndIE(); ~CWndIE(); void SetDefault(BOOL bDefault=FALSE) { m_bDefault = bDefault; } afx_msg void OnContextMenu(CWnd* pWnd, CPoint pos); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point); /////////////////////////////////////////////////////////////////////////////// public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CWndIE) public: virtual BOOL PreTranslateMessage(MSG* pMsg); //}}AFX_VIRTUAL /////////////////////////////////////////////////////////////////////////////// DECLARE_MESSAGE_MAP(); DECLARE_DYNAMIC(CWndIE) }; ///////////////////////////////////////////////////////////////////////////// class CHtmlCtrlEx : public CHtmlView { protected: CWndIE m_WndIE; //最终浏览器窗口对象; BOOL m_bForDlg; UINT m_nMsgOfU; CWnd* m_pMsgWnd; public://&protected: CHtmlCtrlEx(); // protected constructor used by dynamic creation DECLARE_DYNCREATE(CHtmlCtrlEx) CWnd* GetpWndIE() { return &m_WndIE; } //视图中才可能需要但须调用;//第1,3参数缺省为:TRUE(视图中) void SetDefault(BOOL bDefault=FALSE, UINT nMsgOfU=0, BOOL bForDlg=FALSE) { m_WndIE.SetDefault(bDefault); m_nMsgOfU = nMsgOfU; m_bForDlg = bForDlg; } void SetMsgWnd(CWnd* pMsgWnd) { m_pMsgWnd = pMsgWnd; } //[注]win7下白屏解决方案:在其顶层父窗口的PreCreateWindow函数中添加行-> cs.style |= WS_CLIPCHILDREN; OnEraseBkgnd直接返回TRUE; //下面这个函数为对话框使用;//第1,3参数缺省为FALSE(视图中) BOOL CreateFromStatic(UINT nID, CWnd* pMsgWnd, BOOL bDefault= TRUE, UINT nMsgOfU=0, BOOL bForDlg= TRUE); HWND GetBrowserWindow(); // Normally, CHtmlView destroys itself in PostNcDestroy, // but we don't want to do that for a control since a control // is usually implemented as a stack object in a dialog. // virtual void PostNcDestroy(); // overrides to bypass MFC doc/view frame dependencies // html Data public: //{{AFX_DATA(CHtmlCtrlEx) // NOTE: the ClassWizard will add data members here //}}AFX_DATA // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CHtmlCtrlEx) public: virtual void OnNavigateComplete2(LPCTSTR strURL); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation public://&protected: virtual ~CHtmlCtrlEx(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif // Generated message map functions //{{AFX_MSG(CHtmlCtrlEx) afx_msg void OnDestroy(); afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_HTMLCTRLEX_H__9285D48B_787C_4E47_8FA4_E0B020410221__INCLUDED_) //以下是cpp // HtmlCtrlEx.cpp : implementation file // #include "stdafx.h" #include "HtmlCtrlEx.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWndIE IMPLEMENT_DYNAMIC(CWndIE, CWnd) BEGIN_MESSAGE_MAP(CWndIE, CWnd) ON_WM_CONTEXTMENU() // ON_WM_RBUTTONDOWN() // ON_WM_RBUTTONDBLCLK() END_MESSAGE_MAP() CWndIE::CWndIE() { m_bDefault = FALSE; } CWndIE::~CWndIE() { } void CWndIE::OnRButtonDown(UINT nFlags, CPoint point) { //对浏览器窗口屏蔽鼠标 右 键; if(m_bDefault) CWnd::OnRButtonDown(nFlags, point); } void CWndIE::OnRButtonDblClk(UINT nFlags, CPoint point) { //对浏览器窗口屏蔽鼠标 右 键; if(m_bDefault) CWnd::OnRButtonDblClk(nFlags, point); } void CWndIE::OnContextMenu(CWnd* pWnd, CPoint pos) { //对浏览器窗口屏蔽上下文菜单; if(m_bDefault) CWnd::OnContextMenu(pWnd, pos); } BOOL CWndIE::PreTranslateMessage(MSG* pMsg) { static bool bCtrlDown = false, bLBtnDown = false; // static long nSeq = 0; if(!m_bDefault) { WPARAM wp = pMsg->wParam; UINT ms = pMsg->message;// HWND hw = pMsg->hwnd; // TRACE("(%ld)[nSeq]; ", ++nSeq); TRACE("%ld,%ms,%hw[wp,ms,ms];\n", wp,ms,hw); // 允许用户选中内容,虽然不能拷贝但是可以做定位用! // if(ms==WM_LBUTTONDOWN) // bLBtnDown = true; // if(ms==WM_LBUTTONUP ) // bLBtnDown =false; // if(bLBtnDown && ms==WM_MOUSEMOVE ) // return TRUE; if(wp==17) //Ctrl键:按下或弹起; { if(ms==WM_KEYDOWN)bCtrlDown = true; else if(ms==WM_KEYUP )bCtrlDown =false; return TRUE; } if(bCtrlDown && ms==WM_KEYDOWN ) { if(wp=='A'||wp=='C'||wp=='P') //全选,拷贝和打印屏蔽. return TRUE; } } return CWnd::PreTranslateMessage(pMsg); } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CHtmlCtrlEx IMPLEMENT_DYNCREATE(CHtmlCtrlEx, CHtmlView) CHtmlCtrlEx::CHtmlCtrlEx() { //{{AFX_DATA_INIT(CHtmlCtrlEx) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bForDlg = FALSE; m_nMsgOfU = 0; m_pMsgWnd = NULL; //注: WS_EX_CLIENTEDGE属性要导致一个异常! } CHtmlCtrlEx::~CHtmlCtrlEx() { } void CHtmlCtrlEx::DoDataExchange(CDataExchange* pDX) { CHtmlView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CHtmlCtrlEx) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CHtmlCtrlEx, CHtmlView) //{{AFX_MSG_MAP(CHtmlCtrlEx) ON_WM_DESTROY() ON_WM_MOUSEACTIVATE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHtmlCtrlEx diagnostics #ifdef _DEBUG void CHtmlCtrlEx::AssertValid() const { CHtmlView::AssertValid(); } void CHtmlCtrlEx::Dump(CDumpContext& dc) const { CHtmlView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CHtmlCtrlEx message handlers ////////////////// // Create control in same position as an existing static control with // the same ID (could be any kind of control, really) // BOOL CHtmlCtrlEx::CreateFromStatic(UINT nID, CWnd* pMsgWnd, BOOL bDefault, UINT nMsgOfU, BOOL bForDlg) { m_pMsgWnd = pMsgWnd; SetDefault(bDefault, nMsgOfU, bForDlg); //需要设置默认参数 //为对话框使用!在消息处理上将会屏蔽很多默认处理 CStatic wndStatic; if(!wndStatic.SubclassDlgItem(nID, pMsgWnd)) return FALSE; // Get static control rect, convert to parent's client coords. CRect rc; wndStatic.GetWindowRect(&rc); pMsgWnd->ScreenToClient(&rc); wndStatic.DestroyWindow(); // create HTML control (CHtmlView) return Create( NULL, // class name NULL, // title (WS_CHILD | WS_VISIBLE ), // style rc, // rectangle pMsgWnd, // parent nID, // control ID NULL); // frame/doc context not used } //////////////// // Override to avoid CView stuff that assumes a frame. // void CHtmlCtrlEx::OnDestroy() { // This is probably unecessary since ~CHtmlView does it, but // safer to mimic CHtmlView::OnDestroy. if( m_bForDlg ) { if(m_pBrowserApp) { m_pBrowserApp->Release(); m_pBrowserApp = NULL; } CWnd::OnDestroy(); // bypass CView doc/frame stuff return; } CHtmlView::OnDestroy(); } //////////////// // Override to avoid CView stuff that assumes a frame. // int CHtmlCtrlEx::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg) { // bypass CView doc/frame stuff if( m_bForDlg ) { return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg); } return CHtmlView::OnMouseActivate(pDesktopWnd, nHitTest, msg); } HWND CHtmlCtrlEx::GetBrowserWindow() { HWND hwnd = m_hWnd; while(TRUE) { HWND hwndChild = ::GetWindow(hwnd, GW_CHILD); TRACE("hwndChild = %p\n",hwndChild); if (hwndChild==NULL) return hwnd; hwnd = hwndChild; } return NULL; #ifdef NEVER CComQIPtr<IOleWindow> spOleWin; HWND hwnd; ASSERT(m_pBrowserApp); HRESULT hr = m_pBrowserApp->QueryInterface(IID_IOleWindow,(void**)&spOleWin); if(SUCCEEDED(hr)) { hr = spOleWin->GetWindow(&hwnd); if(SUCCEEDED(hr)) return hwnd; } return NULL; #endif } void CHtmlCtrlEx::OnNavigateComplete2(LPCTSTR strURL) { //先获取浏览器窗口,然后将该窗口子类化:(可以按常规的窗口初始化或按禁用上下文菜单初始化) //IE的HWND可修改,如果多次使用,须对HWND进行反子类化(unsubclass)和重子类化(resubclass)处理。 HWND hwnd = GetBrowserWindow(); if(!m_WndIE.m_hWnd ) { TRACE("Subclass m_WndIE = %p\n",hwnd); m_WndIE.SubclassWindow(hwnd); } } void CHtmlCtrlEx::PostNcDestroy() { if( m_bForDlg ) { return; //对于对话框,会导致销毁出错! } CHtmlView::PostNcDestroy(); }
五月蝇 2013-08-27
  • 打赏
  • 举报
回复
第二个现象更是怪,我的程序是为一个BS项目做的专用浏览器,弹出窗口中显示的是个web列表,应该有两条记录,可以在我的程序中只显示1条,使用ie访问web,打开该页就是2条,关了ie再用我的程序查看,变成2条记录,正常了。根本没有头绪~~
五月蝇 2013-08-27
  • 打赏
  • 举报
回复
调试时是成功的。Release版本在个别电脑上偶尔出现,不知道原因根本无从下手。程序实际已经投入使用一年多了,最近有人想我反应这个现象。
fishion 2013-08-27
  • 打赏
  • 举报
回复
引用 2 楼 hellfire50 的回复:
我就是通过NewWindow3来控制弹出窗口用自己的程序来显示的。大部分情况都正常,只是偶尔就会出现弹出的窗口中一片空白的情况。
能判断DocumentComplete成功么
五月蝇 2013-08-27
  • 打赏
  • 举报
回复
我就是通过NewWindow3来控制弹出窗口用自己的程序来显示的。大部分情况都正常,只是偶尔就会出现弹出的窗口中一片空白的情况。
fishion 2013-08-27
  • 打赏
  • 举报
回复
NewWindow3是事件来的,不是用来调用的,只是你可以利用里面的IDispatch **ppDisp和BSTR bstrUrl 来用指定的webbrowser控件打开指定的网页而已
fishion 2013-08-27
  • 打赏
  • 举报
回复
webbrowser控件本来就不能完全等同IE来使用的,webbrowser控件没有IE那么完善,如果你用webbrowser控件做这方面的开发多了,你就会发现会有更多的奇怪问题了
五月蝇 2013-08-27
  • 打赏
  • 举报
回复
版主大人都出现了!难道没有人遇到过相同的问题么?难道是我的程序写的太奇葩了~~
oyljerry 2013-08-27
  • 打赏
  • 举报
回复
一些奇怪现象可能可以归结为webbrowser控件的bug或设置等。看是不是webbrowser有什么设置可以修改修改

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧