LiFan
2025-02-13 03ef0b51103c735077c784c7df81ae2bcc1599ab
jrj/xframe/wobject/xwin.hpp
@@ -6,10 +6,23 @@
#include "win32/win.hpp"
#include "wobject/xnode.hpp"
#include "wobject/xurl.hpp"
#include "wobject/xpage.hpp"
#include "wobject/xnode.hpp"
using kwin=Hxsoft::XFrame::IXFWin;
using kcontrol = Hxsoft::XFrame::IXFControl;
using knode = Hxsoft::XFrame::IXNode;
#define export __declspec(dllexport)
#define DeclWinObject_(ty,pty) class __declspec(dllexport) ty :  public pty
#define CreateWinObject_(ty,pty) \
public:\
   ty(void* impl,HWND hWnd):pty(impl,hWnd){}\
public:\
   static ty * CreateInstance(void* impl,void* hWnd)\
   {\
      return new ty(impl,(HWND)hWnd);\
   }
class xwin: public xview
{
@@ -31,6 +44,8 @@
   }
public:
   xwin(void * impl, HWND hWnd):xview(impl,hWnd){}
   xwin(kwin* kw) :xview(kw ? kw : nullptr, kw ? kw->GetHWND() : 0) {}
   const xwin& operator =(kwin* kw) { this->SetNativePtr(kw ? kw : nullptr); this->SetHandle(kw ? kw->GetHWND() : 0); return *this; }
public:
   kwin* getKWin()
   {
@@ -69,16 +84,16 @@
   xwin* OpenWindow(string url)
   {
      int WS_OVERLAPPEDWINDOW = 0x00cf0000 ;
      kwin* w = kwin::OpenWindow(GetServerUrl(),url,getKWin(),0/*param*/,0/*CmdWind*/,0,WS_OVERLAPPEDWINDOW,0);
      int WS_OVERLAPPEDWINDOW_ = 0x00cf0000 ;
      kwin* w = kwin::OpenWindow(GetServerUrl(),url,getKWin(),0/*param*/,0/*CmdWind*/,0,WS_OVERLAPPEDWINDOW_,0);
      if(!w) return 0; //response
      return (xwin*)GetPropW(w->GetHWND(),L"AttachObject");
   }
   
   xwin* OpenWindow(string url,LPARAM p)
   {
      int WS_OVERLAPPEDWINDOW = 0x00cf0000;
      kwin* w= kwin::OpenWindow(GetServerUrl(),url,getKWin(),p,0/*CmdWind*/,0/*dwStyleEx*/,WS_OVERLAPPEDWINDOW,0);
      int WS_OVERLAPPEDWINDOW_ = 0x00cf0000;
      kwin* w= kwin::OpenWindow(GetServerUrl(),url,getKWin(),p,0/*CmdWind*/,0/*dwStyleEx*/,WS_OVERLAPPEDWINDOW_,0);
      if(!w) return 0; //response
      return (xwin*)GetPropW(w->GetHWND(),L"AttachObject");
   }
@@ -112,6 +127,16 @@
      return xnode(getKWin()->SetAgentNodeContent((knode*)node.getNativePointer(), (knode*)val.getNativePointer()));
   }
   xnode GetXNode()
   {
      return xnode(getKWin()->GetXNode());
   }
   Hxsoft::XFrame::IXPage* GetXPage()
   {
      return getKWin()->GetXPage();
   }
   LPARAM GetWinParam()
   {
      return (LPARAM)getKWin()->GetParam();
@@ -120,6 +145,12 @@
   {
      return getKWin()->SetParam((void*)pParam);
   }
   xstring GetParamString()
   {
      if (!GetWinParam())return xstring();
      return xstring(GetWinParam(), true);
   }
   LPARAM GetFrameParam()
   {
      return (LPARAM)getKWin()->GetFrameParam();
@@ -169,6 +200,41 @@
      return -1;
   }
   int openUrl(xstring aurl, LPARAM para)
   {
      KXMLDOMDocument x;
      xurl::get(GetServerUrl(), aurl, L"", x);
      KXMLDOMNode n = x.selectSingleNode(L"//resource/@src");
      if (n)
      {
         string xq = n.text();
         OpenWindow(xq, (LPARAM)para);
         return 1;
      }
      else
      {
         n = x.selectSingleNode(L"//resource[@vface!='' and @view!='']");
         if (n)
         {
            xstring vface = n.selectSingleNode(L"@vface").text();
            xstring view = n.selectSingleNode(L"@view").text();
            xstring config = n.selectSingleNode(L"@config").text();
            if (vface == L"." || vface == L"")
            {
               string v = n.selectSingleNode(L"@url").text();
               xstring burl = xstring(aurl).mid(0, xstring(aurl).find(v, 0));
               return openUrl(burl + view, para);
            }
            else
               return openUrl(vface + L"/" + view, para);
         }
      }
      return -1;
   }
   int CloseWindow()
   {
      return getKWin()->CloseWindow();
@@ -195,4 +261,18 @@
   {
      return getKWin()->SwitchLayer((LPTSTR)pStrLayerSheet, (LPTSTR)pStrLayerFrame);
   }
   xpage GetChildXPage(string name)
   {
      xnode tnode = GetXNode().GetNodeByName(name);
      if (!tnode) return 0;
      return tnode.GetXPage();
   }
   kwin* GetChildWin(string name)
   {
      xpage tpage = GetChildXPage(name);
      if (!tpage) return nullptr;
      return tpage.GetWin();
   }
};