我目前正在尝试实现一个过度使用wxWebView的应用程序。我使用静态页面以及在用户PC上存储/缓存的动态页面。对于该应用程序,我希望使用两种方案/协议:
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();
}
使用它的网址看起来像这样:
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:\Source\wxSteamStats\bin\static\en_GB\about.html" (Copied from debugger)
}
return NULL;
}
private:
Mainframe* m_parent;
wxFileSystem* m_fs;
};
这完美无缺,没有任何例外。所以我不确定为什么在这里需要wxFileSystem或者它是如何工作的。我查看了组件的代码,但我不熟悉IE的API。对我来说,看起来实际的文件从未给IE。或者我是否必须将源“馈送”到控件的某个地方?我无法在wxArchiveWebHandler或示例的源代码中发现类似的内容。
答案 0 :(得分:1)
我刚刚通过使用以下类对此进行了测试,该类对您进行了一些小的更改。
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。尝试从fname
返回Mainframe::GetStaticContent
,然后在其上调用FileNameToURL
,并希望它能正常工作。