Sortir un navigateur, c'est très facile. Surtout lorsque le moteur de rendu est basé sur le travail des autres... Dans wxWidgets, il y a un composant (wxHtmlWindow) qui permet d'afficher des pages web dans des applications.
C'est très pratique par exemple pour afficher un fichier d'aide au format HTML, ou pour générer des rapports tant soit peu jolis. Mais il ne faut pas lui en demander trop.
Pour compiler le code suivant, vous avez besoin de C++ et de wxWidgets. Pour utiliser l'exemple, il faudra créer les images des boutons : back.png, go.png, home.png, next.png, reload.png, stop.png. Pour mes tests, j'ai pompé celles de FireFox, mais comme ce ne sont pas les miennes, je n'y touche pas.
Le code fonctionne sous Windows, Linux, Unix ou Macintosh. Quoi qu'avec ces deux derniers, en utilisant la classe wxWebKit, vous avez directement le rendu de Safari .
#include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wx/image.h" #include "wx/fs_inet.h" #include "wx/html/htmlwin.h" #include "wx/html/htmlproc.h" //------------------------------------------ class wxNavFrame : public wxFrame { DECLARE_EVENT_TABLE() private: enum { ID_NAV_PREV = 1000, ID_NAV_NEXT, ID_NAV_REFRESH, ID_NAV_STOP, ID_NAV_HOME, ID_NAV_GO, ID_FOX, }; wxPanel *ToolBar; wxBitmapButton *buttonPrev, *buttonNext, *buttonRefresh, *buttonStop, *buttonHome, *buttonGo; wxTextCtrl *editURL; wxHtmlWindow *Fox; void OnToolPrevClick(wxCommandEvent& event); void OnToolNextClick(wxCommandEvent& event); void OnToolRefreshClick(wxCommandEvent& event); void OnToolStopClick(wxCommandEvent& event); void OnToolHomeClick(wxCommandEvent& event); void OnToolGoClick(wxCommandEvent& event); public: wxNavFrame(); ~wxNavFrame(); }; BEGIN_EVENT_TABLE(wxNavFrame, wxFrame) EVT_BUTTON(ID_NAV_PREV, wxNavFrame::OnToolPrevClick) EVT_BUTTON(ID_NAV_NEXT, wxNavFrame::OnToolNextClick) EVT_BUTTON(ID_NAV_REFRESH, wxNavFrame::OnToolRefreshClick) EVT_BUTTON(ID_NAV_STOP, wxNavFrame::OnToolStopClick) EVT_BUTTON(ID_NAV_HOME, wxNavFrame::OnToolHomeClick) EVT_BUTTON(ID_NAV_GO, wxNavFrame::OnToolGoClick) END_EVENT_TABLE() wxNavFrame::wxNavFrame() : wxFrame(NULL, -1, wxT("Internet Navigator (wxHTML)"), wxDefaultPosition, wxSize(600,500), wxDEFAULT_FRAME_STYLE) { this->SetSizeHints(wxDefaultSize, wxDefaultSize); wxBoxSizer *VSizer; VSizer = new wxBoxSizer(wxVERTICAL); ToolBar = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1,35), wxTAB_TRAVERSAL); wxBoxSizer *TSizer; TSizer = new wxBoxSizer(wxHORIZONTAL); buttonPrev = new wxBitmapButton(ToolBar, ID_NAV_PREV, wxImage(wxT("back.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW); TSizer->Add(buttonPrev, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5); buttonNext = new wxBitmapButton(ToolBar, ID_NAV_NEXT, wxImage(wxT("next.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW); TSizer->Add(buttonNext, 0, wxALIGN_CENTER_VERTICAL, 5); buttonRefresh = new wxBitmapButton(ToolBar, ID_NAV_REFRESH, wxImage(wxT("reload.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW); TSizer->Add(buttonRefresh, 0, wxALIGN_CENTER_VERTICAL, 5); buttonStop = new wxBitmapButton(ToolBar, ID_NAV_STOP, wxImage(wxT("stop.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW); TSizer->Add(buttonStop, 0, wxALIGN_CENTER_VERTICAL, 5); buttonHome = new wxBitmapButton(ToolBar, ID_NAV_HOME, wxImage(wxT("home.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW); TSizer->Add(buttonHome, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5); editURL = new wxTextCtrl(ToolBar, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); TSizer->Add(editURL, 1, wxALIGN_CENTER_VERTICAL|wxALL, 0); buttonGo = new wxBitmapButton(ToolBar, ID_NAV_GO, wxImage(wxT("go.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW); TSizer->Add(buttonGo, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); ToolBar->SetSizer(TSizer); ToolBar->Layout(); VSizer->Add(ToolBar, 0, wxALL|wxEXPAND, 0); Fox = new wxHtmlWindow(this, ID_FOX, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO); VSizer->Add(Fox, 1, wxALL|wxEXPAND, 0); this->SetSizer(VSizer); this->Layout(); this->Center(); this->Show(true); Fox->SetFocus(); } wxNavFrame::~wxNavFrame() { } void wxNavFrame::OnToolPrevClick(wxCommandEvent& event) { Fox->HistoryBack(); } void wxNavFrame::OnToolNextClick(wxCommandEvent& event) { Fox->HistoryForward(); } void wxNavFrame::OnToolRefreshClick(wxCommandEvent& event) { //Fox->Reload(); } void wxNavFrame::OnToolStopClick(wxCommandEvent& event) { //Fox->Stop(); } void wxNavFrame::OnToolHomeClick(wxCommandEvent& event) { Fox->LoadPage(wxT("http://ecrucru.free.fr")); } void wxNavFrame::OnToolGoClick(wxCommandEvent& event) { Fox->LoadPage(editURL->GetValue()); Fox->SetFocus(); } //------------------------------------------ class wxNavApp: public wxApp { private: wxNavFrame *MainFrame; public: virtual bool OnInit(); }; DECLARE_APP(wxNavApp) IMPLEMENT_APP(wxNavApp) bool wxNavApp::OnInit() { wxApp::OnInit(); wxInitAllImageHandlers(); wxFileSystem::AddHandler(new wxInternetFSHandler); MainFrame = new wxNavFrame(); SetTopWindow(MainFrame); return true; }
Il faudra juste taper les URL en entier.