正在向wxWebViewHandler注册协议

Registering a protocol with wxWebViewHandler

本文关键字:注册 协议 wxWebViewHandler      更新时间:2023-10-16

我目前正在尝试实现一个过度使用wxWebView的应用程序。我使用静态页面以及存储/缓存在用户电脑上的动态页面。对于应用程序,我希望使用两种方案/协议:

static://profile://

目标是让他们处理本地内容,但更容易处理这些内容。例如静态站点的翻译代码:

wxString Mainframe::GetStaticContent(wxString file)
{
    // Choose based on language
    wxString language = wxGetApp().GetSelectedLanguage();
    // Construct Filename
    wxFileName fname(wxGetApp().GetAppPath() + wxString("/static/") + language + wxString("/") + file + wxString(".html"));
    // Return full path, which is corrected by wxWidgets
    return fname.GetFullPath();
}

使用这个的url看起来是这样的:

static://start

现在我有一个从wxWebViewHandler派生的类来实现这一点:

class WebViewHandlerStatic : public wxWebViewHandler
{
public:
    WebViewHandlerStatic(const wxString& protocol, Mainframe* parent)
        : wxWebViewHandler(protocol), m_parent(parent)
    {
        m_fs = new wxFileSystem();
    }
    virtual WebViewHandlerStatic::~WebViewHandlerStatic()
    {
        wxDELETE(m_fs);
    }
    virtual wxFSFile* GetFile (const wxString &uri)
    {
        wxString content = uri.substr(9, uri.length()).BeforeLast('/');
        wxString path = m_parent->GetStaticContent(content);
        if ( wxFileName::FileExists(path) && wxFileSystem::HasHandlerForPath(path) )
        {           
            //path = wxFileSystem::FileNameToURL(path);
            return m_fs->OpenFile(path);
        }
        else
            return NULL;
    }   
private:
    Mainframe* m_parent;
    wxFileSystem* m_fs;
};

然而,问题是如果我点击链接static://about或者任何其他协议,都不会发生任何事情。我尝试了使用和不使用FilenameToURL()。我还签入了调试器,路径在构造后是有效的。但是页面没有改变。

有人对此有任何见解吗?

编辑:

临时解决方案:

class WebViewHandlerStatic : public wxWebViewHandler
{
public:
    WebViewHandlerStatic(const wxString& protocol, Mainframe* parent)
        : wxWebViewHandler(protocol), m_parent(parent)
    {
        //m_fs = new wxFileSystem();
    }
    virtual WebViewHandlerStatic::~WebViewHandlerStatic()
    {
        //wxDELETE(m_fs);
    }
    virtual wxFSFile* GetFile (const wxString &uri)
    {
        wxString content = uri.substr(9, uri.length()).BeforeLast('/');
        wxFileName path = m_parent->GetStaticContent(content);
        wxString url = path.GetFullPath();
        if ( wxFileSystem::HasHandlerForPath(url) )
        {
            m_parent->LoadURL(url);
                    // The content of url is in this state: "d:SourcewxSteamStatsbinstaticen_GBabout.html" (Copied from debugger)
        }
        return NULL;
    }   
private:
    Mainframe* m_parent;
    wxFileSystem* m_fs;
};

这毫无例外地完美无瑕。所以我真的不知道为什么这里需要wxFileSystem,也不知道它在里面是如何工作的。我看了组件的代码,但我不熟悉IE的API。对我来说,实际的文档似乎从未提供给IE。或者我必须将源代码"馈送"到控件的某个位置吗?我在wxArchiveWebHandler的源代码或示例中找不到类似的内容。

我刚刚使用下面的类对此进行了测试,该类对您的类进行了一些小的更改。

class WebViewHandlerStatic : public wxWebViewHandler
{
public:
    WebViewHandlerStatic(const wxString& protocol) : wxWebViewHandler(protocol)
    {
        m_fs = new wxFileSystem();
    }
    virtual WebViewHandlerStatic::~WebViewHandlerStatic()
    {
        wxDELETE(m_fs);
    }
    virtual wxFSFile* GetFile (const wxString &uri)
    {
        wxFileName path = "C:/Users/Steven/Desktop/doc.htm";
        wxString url = wxFileSystem::FileNameToURL(path);
        if (wxFileSystem::HasHandlerForPath(url))        
            return m_fs->OpenFile(url);
        else
            return NULL;
    }   
private:
    wxFileSystem* m_fs;
};

然后我按照样本中的另一个例子注册了它,它运行得很好。主要的区别在于,我使用wxFileSystem::FileNameToURL,因为wxFileSystem需要一个URI,而不是文件路径。我怀疑,当您取消注释对它的调用时,当您传递wxString而不是wxFileName时,会发生一些不可靠的隐式转换。尝试从Mainframe::GetStaticContent返回fname,然后调用FileNameToURL,希望它能起作用。