在问这个问题之前,我确实经常搜索。对不起,如果这是一个简单的问题。
在我的wxWidgets应用中,我想从菜单选项中新建wxHtmlWindow
。 (我已经正确显示了我的主应用程序窗口。)
我设置了EVENT_TABLE
:
EVT_MENU(wxID_HELP, MyFrame::OnHelp)
然后是Function(我在私有类中得到一个指针html_help):
void MyFrame::OnHelp(wxCommandEvent& event)
// Callback for the Help menu item
{
cout << "Enter OnHelp" << endl;
wxWindow* help_win = new wxWindow(NULL, -1, wxDefaultPosition, wxSize(400, 600));
cout << "New window" << endl;
help_win->Show(true);
cout << "Show" << endl;
html_help = new wxHtmlWindow(help_win, -1);
cout << "After new" << endl;
wxString m_Name = wxT("help.html");
//SetTopWindow(html_help);
bool hel = html_help->LoadPage(m_Name);
cout << "After Loadpage" << endl;
}
对不起来了。该程序在新的htmlwindow之后抛出分段错误。
我第一次尝试的只是新的wxHtmlWindow(NULL)
而没有其他wxWindows,但似乎无效,->LoadPage
有段错误。然后我尝试new wxHtmlWindow(this)
,htmlwindow
在当前窗口显示,而不是我想要的。
您可能只是忽略所有代码,并告诉我如何创建一个wxHtmlWindow(可能在新框架中?或者不是)并且可以实际执行LoadPage工作。
非常感谢!
BTW,我正在使用2.812 wxWidgets,使用C ++。
答案 0 :(得分:1)
wxWindow
是所有其他小部件的基类,在极少数情况下您需要并可以直接使用它。
对于您的情况,您需要一个顶级窗口(wxFrame
或wxDialog
)作为wxHtmlWindow
的父级。而且,顺便说一下,只有顶级窗口可以有NULL
个父级。
要加载html,您可能会使用html_help->LoadFile(wxFileName("help.html"))
做得更好。两个函数的文档都在线。
答案 1 :(得分:0)
我在Windows的纸牌游戏程序中使用了以下内容。
不知道这段代码的可移植性或一般性。
该程序处于原型示范状态,因此该代码也不是很干净或一般化,只是我需要的。
#pragma once
// Copyright © 2014 Alf P. Steinbach.
// DEBUG:
#include <thisApp/cppx/trace_stream.h>
#include <wx/msgdlg.h>
//#include <thisApp/ie/css3_support.h> // ie::Css3_support
#include <thisApp/wxx/underscore_macro.h> // _
#include <wx/filesys.h> // wxFileSystem
#include <wx/fs_mem.h> // wxMemoryFSHandler
#include <wx/dialog.h> // wxDialog
#include <wx/sizer.h> // wxBoxSizer
//#include <wx/html/htmlwin.h> // wxHtmlWindow
#include <wx/webview.h> // wxWebView, wxWebViewEvent
#include <wx/webviewfshandler.h> // wxWebViewFSHandler
#include <wx/statline.h> // wxStaticLine
#include <wx/button.h> // wxButton
#include <wx/utils.h> // wxMilliSleep, wxLaunchDefaultBrowser
#include <thisApp/wxx/Named_bitmap.h>
namespace wxx {
using cppx::trace_stream;
using std::endl;
class Html_dialog
: public wxDialog
{
public:
struct Args
{
wxWindow* parent = nullptr;
wxWindowID id = wxID_ANY;
wxString title = "";
wxPoint pos = wxDefaultPosition;
wxSize size = wxDefaultSize;
long style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER;
wxString name = wxDialogNameStr;
Args() {}
};
Html_dialog( Args const& args = Args() )
: wxDialog(
args.parent, args.id, args.title, args.pos,
args.size, args.style, args.name
)
{}
};
inline
void show_dialog(
wxWindow* const parent,
wxString const& title,
wxString const& html,
wxSize const& size = wxSize(380, 160),
Named_bitmap const* const p_first_bitmap = nullptr,
int const n_bitmaps = 0
)
{
wxFileSystem::AddHandler( new wxMemoryFSHandler );
for( auto p = p_first_bitmap; p != p_first_bitmap + n_bitmaps; ++p )
{
wxMemoryFSHandler::AddFile( p->filename, p->bitmap, wxBITMAP_TYPE_PNG );
}
static char const* const utf8_bom = "\xEF\xBB\xBF";
char const* const html_cstr = (
html.StartsWith( utf8_bom )? html.c_str() + 3 : html.c_str()
);
trace_stream << "------------------------------------" << endl;
trace_stream << html_cstr << endl;
trace_stream << "------------------------------------" << endl;
wxMemoryFSHandler::AddFile( "dialog.htm", html_cstr );
//wxMemoryFSHandler::AddFile( "dialog.htm", "<html><body>Bah</body></html>" );
Html_dialog::Args args;
args.parent = parent;
args.title = "About";
Html_dialog dlg( args );
wxWebView* browser = wxWebView::New(
&dlg, wxID_ANY, wxWebViewDefaultURLStr,
wxDefaultPosition, size
);
browser->RegisterHandler(
wxSharedPtr<wxWebViewHandler>( new wxWebViewFSHandler( "memory" ) )
);
browser->LoadURL( "memory:dialog.htm" );
//browser->SetPage( "<html><body>Bah</body></html>", "memory:dialog.htm" );
dlg.SetLabel( title );
struct WcEvent
{
static void handler (wxWebViewEvent& event)
{
wxString const url = event.GetURL();
//wxMessageBox( url, "Navigation to:" );
if( !url.StartsWith( "memory:" ) )
{
event.Veto();
wxLaunchDefaultBrowser( url, wxBROWSER_NEW_WINDOW );
}
}
};
browser->Bind( wxEVT_WEBVIEW_NAVIGATING, &WcEvent::handler );
auto* const sizer = new wxGridSizer( 0 ) ;
sizer->Add( browser, 0, wxEXPAND | wxALL, 0);
// sizer->Add( browser, 1, wxALL, 10);
// sizer->Add( new wxStaticLine( &dlg, -1 ), 0, wxEXPAND | wxLEFT | wxRIGHT, 10 );
// sizer->Add( new wxButton( &dlg, wxID_OK, "Ok" ), 0, wxALL | wxALIGN_RIGHT, 15 );
dlg.SetAutoLayout( true );
dlg.SetSizer( sizer );
sizer->Fit( &dlg );
//dlg.Centre();
dlg.SetLayoutAdaptationMode( wxDIALOG_ADAPTATION_MODE_DISABLED );
dlg.ShowModal();
wxMemoryFSHandler::RemoveFile( "dialog.htm" );
for( auto p = p_first_bitmap; p != p_first_bitmap + n_bitmaps; ++p )
{
wxMemoryFSHandler::RemoveFile( p->filename );
}
}
} // namespace wxx