扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:李汉鹏 来源:VCKBASE 2007年10月19日
关键字:
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND($80020003).这是由于CHtmlView在处理WM_SIZE消息时的一点小问题引起的,采用如下代码处理WM_SIZE消息就不会有此警告了
void CLhpHtmlView::OnSize(UINT nType, int cx, int cy) 
{ 
 CFormView::OnSize(nType, cx, cy); 
 if (::IsWindow(m_wndBrowser.m_hWnd))  
 {  
  CRect rect;  
  GetClientRect(rect);  
  // 就这一句与CHtmlView的不同 
  ::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE); 
  m_wndBrowser.SetWindowPos(NULL,  
                            rect.left,  
                            rect.top,  
                            rect.Width(),  
                            rect.Height(),  
                            SWP_NOACTIVATE | SWP_NOZORDER);  
 }  
} 
HRESULT CLhpHtmlView::OnGetDropTarget(LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget ) 
{ 
 m_DropTarget.SetIEDropTarget(pDropTarget); 
 LPDROPTARGET pMyDropTarget; 
 pMyDropTarget = (LPDROPTARGET)m_DropTarget.GetInterface(&IID_IDropTarget); 
 if(pMyDropTarget) 
 { 
  *ppDropTarget = pMyDropTarget; 
  pMyDropTarget->AddRef(); 
  return S_OK; 
 } 
 return S_FALSE; 
} 
  m_DropTarget即为自定义的处理拖放的对象。这样就能通过在从CLhpHtmlView派生的类中重载OnDragEnter、OnDragOver、 OnDrop、OnDragLeave虚函数来处理拖放了。在这里顺带讲一下视图是怎样处理拖放的。 要使视图处理拖放,首先在视图里添加一个COleDropTarget(或派生类)成员变量,如CLhpHtmlView中的“CMyOleDropTarget m_DropTarget;”,再在 视图创建时调用COleDropTarget对象的Register,即把视图与COleDropTarget对象关联起来,如CLhpHtmlView中的“m_DropTarget.Register(this);”,再对拖放 触发的事件进行相应的处理, OnDragEnter 把某对象拖入到视图时触发,在此检测拖入的对象是不是视图想接受的对象,如是返回“DROPEFFECT_MOVE”表示接受此对象,如 if(pDataObject->IsDataAvailable(CF_HDROP))// 被拖对象是文件吗? return DROPEFFECT_MOVE;OnDragOver 被拖对象在视图上移动,同OnDragEnter一样检测拖入对象,如果要接受此对象返回“DROPEFFECT_MOVE”。 OnDrop 拖着被拖对象在视图上放开鼠标,在这里对拖入对象做出处理; OnDragLeave 拖着被拖对象离开视图。 C++的代码写好了,但事情还没完,还必须在网页里用脚本对拖放事件进行处理, 即页面里哪个元素要接受拖放对象哪个元素就要处理ondragenter、ondragover、ondrop,代码其实很简单,让事件的返回值为false即可,这样 C++的代码才有机会处理拖放事件,代码如下:
...... <td ondragenter="event.returnValue = false" ondragover="event.returnValue = false" \ ondrop="event.returnValue = false"> ......如果要使整个视图都接受拖放,则在Body元素中处理此三个事件。 注意:别忘了让工程对OLE的支持即在初始化应用程序时调用AfxOleInit()。
  ...... 更多详情请参考MSDN的DOCHOSTUIFLAG帮助。
  怎样修改“宿主信息标记”?
  在CDocHostSite中实现IDocHostUIHandler, 在GetHostInfo方法中调用浏览器的OnGetHostInfo虚函数,在虚函数OnGetHostInfo中便可指定“宿主信息标记”,如: 
HRESULT CLhpHtmlView::OnGetHostInfo(DOCHOSTUIINFO * pInfo) 
{ 
 pInfo->cbSize = sizeof(DOCHOSTUIINFO); 
 pInfo->dwFlags = DOCHOSTUIFLAG_DIALOG |  
                     DOCHOSTUIFLAG_THEME  |  
                     DOCHOSTUIFLAG_NO3DBORDER |  
                     DOCHOSTUIFLAG_SCROLL_NO; 
 pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT; 
 return S_OK; 
} 
document.onselectstart=new Function(’’return false’’);
<body onselectstart="return false">。其它
BOOL PutElementHtml(CString ElemID,CString Html);
取表单元素的值:
BOOL GetElementValue(CString ElemID,CString& Value);
BOOL PutElementValue(CString ElemID,CString Value);
void ElementSetFocus(CString EleName);
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。