LRESULT CNodeWnd::OnTangramMsg(WPARAM wParam, LPARAM lParam) { if (wParam == 0 && lParam)//Create CLRCtrl Node { CString strCnnID = (LPCTSTR)lParam; if (strCnnID.Find(_T(","))!=-1&&theApp.m_pCloudAddinCLRProxy) { m_pWndNode->m_pDisp = theApp.m_pCloudAddinCLRProxy->TangramCreateObject(strCnnID.AllocSysString(), (long)::GetParent(m_hWnd), m_pWndNode); if (m_pWndNode->m_pDisp) { CString strName = theApp.m_pCloudAddinCLRProxy->m_strObjTypeName; CWndNode* pNode = m_pWndNode->m_pRootObj; CWndNode* pParent = m_pWndNode->m_pParentObj; if (pParent) { strName = pParent->m_strName + _T("_") + strName; } auto it = pNode->m_mapLayoutNodes.find(strName); if (it != pNode->m_mapLayoutNodes.end()) { BOOL bGetNew = false; int nIndex = 0; while (bGetNew == false) { CString strNewName = _T(""); strNewName.Format(_T("%s%d"), strName, nIndex); it = pNode->m_mapLayoutNodes.find(strNewName); if (it == pNode->m_mapLayoutNodes.end()) { strName = strNewName; break; } nIndex++; } } m_pWndNode->put_Attribute(CComBSTR(L"name"), strName.AllocSysString()); m_pWndNode->m_strName = strName; m_pWndNode->m_pRootObj->m_mapLayoutNodes[strName] = m_pWndNode; m_pWndNode->m_nViewType = CLRCtrl; CAxWindow m_Wnd; m_Wnd.Attach(m_hWnd); CComPtr<IUnknown> pUnk; m_Wnd.AttachControl(m_pWndNode->m_pDisp, &pUnk); CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pWndNode->m_pDisp); if (pIOleInPlaceActiveObject) m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach(); m_Wnd.Detach(); } } else { BOOL bWebCtrl = false; CString strURL = _T(""); strCnnID.MakeLower(); auto nPos = strCnnID.Find(_T("http:")); if (nPos == -1) nPos = strCnnID.Find(_T("https:")); if (m_pWndNode->m_pFrame) { CComBSTR bstr; m_pWndNode->get_Attribute(CComBSTR("InitInfo"), &bstr); CString str = _T(""); str += bstr; if (str != _T("") && m_pWndNode->m_pPage) { LRESULT hr = ::SendMessage(m_pWndNode->m_pPage->m_hWnd, WM_GETNODEINFO, (WPARAM)OLE2T(bstr), (LPARAM)::GetParent(m_hWnd)); if (hr) { CString strInfo = _T(""); CWindow m_wnd; m_wnd.Attach(::GetParent(m_hWnd)); m_wnd.GetWindowText(strInfo); strCnnID += strInfo; m_wnd.Detach(); } } } if (strCnnID.Find(_T("http://")) != -1 || strCnnID.Find(_T("https://")) != -1) { bWebCtrl = true; strURL = strCnnID; strCnnID = _T("shell.explorer.2"); } if (strCnnID.Find(_T("res://")) != -1 || ::PathFileExists(strCnnID)) { bWebCtrl = true; strURL = strCnnID; strCnnID = _T("shell.explorer.2"); } if (strCnnID.CompareNoCase(_T("about:blank")) == 0) { bWebCtrl = true; strURL = strCnnID; strCnnID = _T("shell.explorer.2"); } if (m_pWndNode->m_pDisp == NULL) { CComPtr<IDispatch> pDisp; HRESULT hr = pDisp.CoCreateInstance(CComBSTR(strCnnID)); if (hr == S_OK) { m_pWndNode->m_pDisp = pDisp.Detach(); } } if (m_pWndNode->m_pDisp) { m_pWndNode->m_pRootObj->m_mapLayoutNodes[m_pWndNode->m_strName] = m_pWndNode; m_pWndNode->m_nViewType = ActiveX; CAxWindow m_Wnd; m_Wnd.Attach(m_hWnd); CComPtr<IUnknown> pUnk; m_Wnd.AttachControl(m_pWndNode->m_pDisp, &pUnk); CComQIPtr<IWebBrowser2> pWebDisp(m_pWndNode->m_pDisp); if (pWebDisp) { bWebCtrl = true; m_pWndNode->m_strURL = strURL; if (m_pWndNode->m_strURL == _T("")) m_pWndNode->m_strURL = strCnnID; if (m_pWndNode->m_pFrame) { if (m_pWndNode->m_pPage) m_pWndNode->m_pPage->m_nWebViewCount++; m_pWndNode->m_pTangramNodeWBEvent = new CWndNodeWBEvent(m_pWndNode); } CComPtr<IAxWinAmbientDispatch> spHost; LRESULT hr = m_Wnd.QueryHost(&spHost); if (SUCCEEDED(hr)) { CComBSTR bstr; m_pWndNode->get_Attribute(CComBSTR("scrollbar"), &bstr); CString str = OLE2T(bstr); if (str == _T("1")) spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME);//DOCHOSTUIFLAG_DIALOG| else spHost->put_DocHostFlags(/*DOCHOSTUIFLAG_DIALOG|*/DOCHOSTUIFLAG_SCROLL_NO | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME); if (m_pWndNode->m_strURL != _T("")) { pWebDisp->Navigate2(&CComVariant(m_pWndNode->m_strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), NULL, NULL, NULL); m_pWndNode->m_bWebInit = true; } } } CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pWndNode->m_pDisp); if (pIOleInPlaceActiveObject) m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach(); m_Wnd.Detach(); } } return 0; } CTangramXmlParse* pNewNXmlode = (CTangramXmlParse*)wParam; if (pNewNXmlode == nullptr) { return 0; } CString str = (LPCTSTR)lParam; CString strID = pNewNXmlode->attr(_T("id"), _T("")); IWndNode* _pNode = nullptr; CWndNode* pOldNode = (CWndNode*)m_pWndNode; if (m_pWndNode->m_hHostWnd == 0) { RECT rc; ::GetClientRect(m_hWnd, &rc); m_pWndNode->m_hHostWnd = ::CreateWindowEx(NULL, L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, rc.right, rc.bottom, m_hWnd, NULL, AfxGetInstanceHandle(), NULL); m_pWndNode->m_hChildHostWnd = ::CreateWindowEx(NULL, L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, rc.right, rc.bottom, m_pWndNode->m_hHostWnd, NULL, AfxGetInstanceHandle(), NULL); IWndFrame* pFrame = nullptr; CString strName = pNewNXmlode->attr(_T("name"), _T(""))+_T("frame"); m_pWndNode->m_pPage->CreateFrame(CComVariant(0), CComVariant((long)pOldNode->m_hChildHostWnd), strName.AllocSysString(), &pFrame); IWndNode* pNode = nullptr; pFrame->Extend(CComBSTR(L""),str.AllocSysString(),&pNode); m_bEraseBkgnd = false; ((CWndNode*)pNode)->m_pRootObj = m_pWndNode->m_pRootObj; ((CWndNode*)pNode)->m_pParentObj = m_pWndNode->m_pParentObj; m_pWndNode->m_pRootObj->m_mapLayoutNodes[((CWndNode*)pNode)->m_strName] = (CWndNode*)pNode; CString strXml = ((CWndNode*)pNode)->m_pHostParse->xml(); CTangramXmlParse* pNew = ((CWndNode*)pNode)->m_pHostParse; CTangramXmlParse* pOld = pOldNode->m_pHostParse; CTangramXmlParse* pParent = m_pWndNode->m_pHostParse->m_pParentParse; CTangramXmlParse* pRet = nullptr; if (pParent) { pRet = pParent->ReplaceNode(pOld, pNew, _T("")); CString str = pRet->xml(); int nCount = pRet->GetCount(); ((CWndNode*)pNode)->m_pHostParse = pRet; m_pWndNode->m_pHostParse = pRet; CWndNode* pChildNode = nullptr; for (auto it2 : ((CWndNode*)pNode)->m_vChildNodes) { pChildNode = it2; pChildNode->m_pRootObj = m_pWndNode->m_pRootObj; CString strName = pChildNode->m_strName; for (int i = 0; i < nCount; i++) { CTangramXmlParse* child = pRet->GetChild(i); CString _strName = child->attr(_T("name"),_T("")); if (_strName.CompareNoCase(strName) == 0) { pChildNode->m_pHostParse = child; break; } } } m_pWndNode->m_vChildNodes.push_back(((CWndNode*)pNode)); } strXml = m_pWndNode->m_pRootObj->m_pTangramParse->xml(); theApp.m_pHostDesignUINode = m_pWndNode->m_pRootObj; if (theApp.m_pHostDesignUINode) { CTangramHtmlTreeWnd* pTreeCtrl = theApp.m_pDocDOMTree; pTreeCtrl->DeleteItem(theApp.m_pDocDOMTree->m_hFirstRoot); if (pTreeCtrl->m_pHostXmlParse) { delete pTreeCtrl->m_pHostXmlParse; } pTreeCtrl->m_pHostXmlParse = new CTangramXmlParse(); pTreeCtrl->m_pHostXmlParse->LoadXml(strXml); pTreeCtrl->m_hFirstRoot = pTreeCtrl->LoadXmlFromXmlParse(pTreeCtrl->m_pHostXmlParse); pTreeCtrl->ExpandAll(); } } return -1; }
//CNodeWnd message handlers BOOL CNodeWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { m_pWndNode = theApp.m_pWndNode; m_pWndNode -> m_nID = nID; m_pWndNode -> m_pHostWnd = this; if(m_pWndNode->m_strID.CompareNoCase(_T("HostView"))==0) { CWndFrame* pWnd = m_pWndNode->m_pFrame; pWnd->m_pBindingNode = m_pWndNode; m_pWndNode->m_pFrame->m_pWorkNode->m_pHostClientView = this; HWND hWnd = CreateWindow(L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, pParentWnd->m_hWnd, (HMENU)nID, AfxGetInstanceHandle(), NULL); BOOL bRet = SubclassWindow(hWnd); if(m_pWndNode->m_pParentObj&&m_pWndNode->m_pParentObj->m_nViewType==Splitter) ModifyStyleEx(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, 0); BSTR bstrVal = ::SysAllocString(L""); m_pWndNode->get_Attribute(CComBSTR(_T("mdiclient")), &bstrVal); CString strVal = OLE2T(bstrVal); if (strVal.CompareNoCase(_T("true")) == 0) { BOOL bEnableBK = false; LRESULT lRes = ::SendMessage(m_pWndNode->m_pFrame->m_hWnd,WM_TANGRAMMSG,0,1992);//Query Support BK WebPage bEnableBK = (lRes==0); if(bEnableBK) { BSTR bstrURL = ::SysAllocString(L""); m_pWndNode->get_Attribute(CComBSTR(_T("url")), &bstrURL); CString strURL = OLE2T(bstrURL); ::SysFreeString(bstrURL); if (strURL != _T("")) { if (strURL.Find(_T("//")) == -1 && ::PathFileExists(strURL) == false) { CString strPath = theApp.m_strAppPath + _T("TangramWebPage\\") + strURL; if (::PathFileExists(strPath)) strURL = strPath; } m_bBKWnd = true; if (pWnd->m_pBKWnd == nullptr) { pWnd->m_pBKWnd = new CBKWnd(); pWnd->m_pBKWnd->m_pWndNode = m_pWndNode; CComPtr<IDispatch> pDisp2; HRESULT hr = pDisp2.CoCreateInstance(CComBSTR(_T("shell.explorer.2"))); CAxWindow m_wnd; m_wnd.Attach(pWnd->m_hWnd); CComPtr<IUnknown> pUnk; m_wnd.AttachControl(pDisp2, &pUnk); theApp._addObject(this, pUnk.Detach()); pWnd->m_pBKWnd->SubclassWindow(::FindWindowEx(pWnd->m_hWnd, NULL, _T("Shell Embedding"), NULL)); theApp.m_pMDIClientBKWnd = pWnd->m_pBKWnd; m_pWndNode->m_pDisp = pDisp2.Detach(); CComQIPtr<IWebBrowser2> pWebDisp(m_pWndNode->m_pDisp); if (pWebDisp) { CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pWndNode->m_pDisp); if (pIOleInPlaceActiveObject) m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach(); CComPtr<IAxWinAmbientDispatch> spHost; hr = m_wnd.QueryHost(&spHost); if (SUCCEEDED(hr)) { hr = spHost->put_DocHostFlags(DOCHOSTUIFLAG_DIALOG | DOCHOSTUIFLAG_DISABLE_HELP_MENU| DOCHOSTUIFLAG_SCROLL_NO | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME); spHost->put_AllowContextMenu(false); } pWebDisp->Navigate2(&CComVariant(strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), nullptr, nullptr, nullptr); CWndPage* pPage = m_pWndNode->m_pFrame->m_pPage; if (pPage) pPage->m_nWebViewCount++; m_pWndNode->m_pTangramNodeWBEvent = new CWndNodeWBEvent(m_pWndNode); } m_wnd.Detach(); } } } } ::SysFreeString(bstrVal); return bRet ; } return theApp.Create(m_pWndNode,lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); }
HWND CTangramNode::CreateView(HWND hParentWnd, CString strTag) { BOOL bWebCtrl = false; CString strURL = _T(""); CString strID = strTag; auto hWnd = ::CreateWindowEx(NULL,L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 0, 0, hParentWnd, NULL, AfxGetInstanceHandle(), NULL); //if (::IsWindow(this->m_pHostWnd->m_hWnd) == false) // = m_pHostWnd->SubclassWindow(hWnd); CComBSTR bstr2; get_Attribute(CComBSTR("Name"), &bstr2); CString strName = OLE2T(bstr2); switch (m_nViewType) { case ActiveX: { strID.MakeLower(); auto nPos = strID.Find(_T("http:")); if (nPos == -1) nPos = strID.Find(_T("https:")); if (m_pFrame) { CComBSTR bstr; get_Attribute(CComBSTR("InitInfo"), &bstr); CString str = _T(""); str += bstr; if (str != _T("") && m_pTangram) { LRESULT hr = ::SendMessage(m_pTangram->m_hWnd, WM_GETNODEINFO, (WPARAM)OLE2T(bstr), (LPARAM)hParentWnd); if (hr) { CString strInfo = _T(""); CWindow m_wnd; m_wnd.Attach(hParentWnd); m_wnd.GetWindowText(strInfo); strID += strInfo; m_wnd.Detach(); } } } if (strID.Find(_T("http://")) != -1 || strID.Find(_T("https://")) != -1) { bWebCtrl = true; strURL = strID; strID = _T("shell.explorer.2"); } if (strID.Find(_T("res://")) != -1 || ::PathFileExists(strID)) { bWebCtrl = true; strURL = strID; strID = _T("shell.explorer.2"); } if (strID.CompareNoCase(_T("about:blank")) ==0 ) { bWebCtrl = true; strURL = strID; strID = _T("shell.explorer.2"); } if (m_pDisp == NULL) { CComPtr<IDispatch> pDisp; HRESULT hr = pDisp.CoCreateInstance(CComBSTR(strID)); if (hr == S_OK) { m_pDisp = pDisp.Detach(); //CAxWindow m_Wnd; //m_Wnd.Attach(hWnd); //CComPtr<IUnknown> pUnk; //m_Wnd.AttachControl(m_pDisp, &pUnk); //m_Wnd.Detach(); } } } break; case CLRCtrl: { if (theApp.m_pTangramCLRProxy) m_pDisp = theApp.m_pTangramCLRProxy->TangramCreateObject(strTag.AllocSysString(), (LONGLONG)hParentWnd, this); } break; } if (m_pDisp) { CAxWindow m_Wnd; m_Wnd.Attach(hWnd); CComPtr<IUnknown> pUnk; m_Wnd.AttachControl(m_pDisp, &pUnk); if (m_nViewType == ActiveX) { CComQIPtr<IWebBrowser2> pWebDisp(m_pDisp); if (pWebDisp) { bWebCtrl = true; m_strURL = strURL; if (m_strURL == _T("")) m_strURL = strID; if (m_pFrame) { if (m_pTangram) m_pTangram->m_nWebViewCount++; m_pTangramNodeWBEvent = new CTangramNodeWBEvent(this); } CComPtr<IAxWinAmbientDispatch> spHost; LRESULT hr = m_Wnd.QueryHost(&spHost); if (SUCCEEDED(hr)) { CComBSTR bstr; get_Attribute(CComBSTR("scrollbar"), &bstr); CString str = OLE2T(bstr); if (str == _T("1")) spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME);//DOCHOSTUIFLAG_DIALOG| else spHost->put_DocHostFlags(/*DOCHOSTUIFLAG_DIALOG|*/DOCHOSTUIFLAG_SCROLL_NO | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME); if (m_strURL != _T("")) { pWebDisp->Navigate2(&CComVariant(m_strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), NULL, NULL, NULL); m_bWebInit = true; } } } } CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pDisp); if (pIOleInPlaceActiveObject) ((CTangramWnd*)m_pHostWnd)->m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach(); m_Wnd.Detach(); } return hWnd; }