extension module called wx.activex. Lots of demo and lib updates to go along with it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26301 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			382 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			382 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
                wxActiveX Library Licence, Version 3
 | 
						|
                ====================================
 | 
						|
 | 
						|
  Copyright (C) 2003 Lindsay Mathieson [, ...]
 | 
						|
 | 
						|
  Everyone is permitted to copy and distribute verbatim copies
 | 
						|
  of this licence document, but changing it is not allowed.
 | 
						|
 | 
						|
                       wxActiveX LIBRARY LICENCE
 | 
						|
     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
						|
  
 | 
						|
  This library is free software; you can redistribute it and/or modify it
 | 
						|
  under the terms of the GNU Library General Public Licence as published by
 | 
						|
  the Free Software Foundation; either version 2 of the Licence, or (at
 | 
						|
  your option) any later version.
 | 
						|
  
 | 
						|
  This library is distributed in the hope that it will be useful, but
 | 
						|
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library
 | 
						|
  General Public Licence for more details.
 | 
						|
 | 
						|
  You should have received a copy of the GNU Library General Public Licence
 | 
						|
  along with this software, usually in a file named COPYING.LIB.  If not,
 | 
						|
  write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 | 
						|
  Boston, MA 02111-1307 USA.
 | 
						|
 | 
						|
  EXCEPTION NOTICE
 | 
						|
 | 
						|
  1. As a special exception, the copyright holders of this library give
 | 
						|
  permission for additional uses of the text contained in this release of
 | 
						|
  the library as licenced under the wxActiveX Library Licence, applying
 | 
						|
  either version 3 of the Licence, or (at your option) any later version of
 | 
						|
  the Licence as published by the copyright holders of version 3 of the
 | 
						|
  Licence document.
 | 
						|
 | 
						|
  2. The exception is that you may use, copy, link, modify and distribute
 | 
						|
  under the user's own terms, binary object code versions of works based
 | 
						|
  on the Library.
 | 
						|
 | 
						|
  3. If you copy code from files distributed under the terms of the GNU
 | 
						|
  General Public Licence or the GNU Library General Public Licence into a
 | 
						|
  copy of this library, as this licence permits, the exception does not
 | 
						|
  apply to the code that you add in this way.  To avoid misleading anyone as
 | 
						|
  to the status of such modified files, you must delete this exception
 | 
						|
  notice from such code and/or adjust the licensing conditions notice
 | 
						|
  accordingly.
 | 
						|
 | 
						|
  4. If you write modifications of your own for this library, it is your
 | 
						|
  choice whether to permit this exception to apply to your modifications. 
 | 
						|
  If you do not wish that, you must delete the exception notice from such
 | 
						|
  code and/or adjust the licensing conditions notice accordingly.
 | 
						|
*/
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// headers
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// For compilers that support precompilation, includes "wx/wx.h".
 | 
						|
#if defined(__WXGTK__) || defined(__WXMOTIF__)
 | 
						|
        #include "wx/wx.h"
 | 
						|
#endif
 | 
						|
#include "wx/wxprec.h"
 | 
						|
#include "wx/filedlg.h"
 | 
						|
#include "wxIEApp.h"
 | 
						|
#include "wxIEFrm.h"
 | 
						|
#include "wxActiveXFrame.h"
 | 
						|
#include <istream>
 | 
						|
#include <fstream>
 | 
						|
using namespace std;
 | 
						|
#include <exdispid.h>
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// resources
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// the application icon
 | 
						|
#if defined(__WXGTK__) || defined(__WXMOTIF__)
 | 
						|
    #include "wxIE.xpm"
 | 
						|
#endif
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// constants
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
// IDs for the controls and the menu commands
 | 
						|
enum
 | 
						|
{
 | 
						|
    // menu items
 | 
						|
    FILE_QUIT = 1,
 | 
						|
	FILE_OPEN,
 | 
						|
	FILE_BROWSE,
 | 
						|
    FILE_HTML_EDITMODE,
 | 
						|
	FILE_TEST_HTML,
 | 
						|
	FILE_TEST_SELECT,
 | 
						|
	FILE_TEST_HTMLSELECT,
 | 
						|
	FILE_TEST_GETTEXT,
 | 
						|
	FILE_TEST_HTMLGETTEXT,
 | 
						|
    FILE_TEST_HOME,
 | 
						|
    FILE_TEST_ACTIVEX,
 | 
						|
    FILE_ABOUT,
 | 
						|
 | 
						|
	// controls
 | 
						|
	ID_MSHTML = 501,
 | 
						|
	ID_PROGRESS_GAUGE
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// event tables and other macros for wxWindows
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
// the event tables connect the wxWindows events with the functions (event
 | 
						|
// handlers) which process them. It can be also done at run-time, but for the
 | 
						|
// simple menu events like this the static method is much simpler.
 | 
						|
BEGIN_EVENT_TABLE(wxIEFrame, wxFrame)
 | 
						|
    EVT_SIZE(wxIEFrame::OnSize)
 | 
						|
    EVT_MENU(FILE_QUIT,		wxIEFrame::OnQuit)
 | 
						|
	EVT_MENU(FILE_BROWSE,		wxIEFrame::OnBrowse)
 | 
						|
	EVT_MENU(FILE_OPEN,			wxIEFrame::OnOpen)
 | 
						|
    EVT_MENU(FILE_HTML_EDITMODE, wxIEFrame::OnEditMode)
 | 
						|
    EVT_UPDATE_UI(FILE_HTML_EDITMODE, wxIEFrame::OnEditModeUI)
 | 
						|
    EVT_MENU(FILE_TEST_HTML,	wxIEFrame::OnTestHTML)
 | 
						|
    EVT_MENU(FILE_TEST_SELECT,  wxIEFrame::OnTestSelect)
 | 
						|
    EVT_MENU(FILE_TEST_HTMLSELECT,  wxIEFrame::OnTestHTMLSelect)
 | 
						|
    EVT_MENU(FILE_TEST_GETTEXT,  wxIEFrame::OnTestGetText)
 | 
						|
    EVT_MENU(FILE_TEST_HTMLGETTEXT,  wxIEFrame::OnTestHTMLGetText)
 | 
						|
    EVT_MENU(FILE_TEST_HOME, wxIEFrame::OnTestHome)
 | 
						|
    EVT_MENU(FILE_TEST_ACTIVEX, wxIEFrame::OnTestActiveX)
 | 
						|
    EVT_MENU(FILE_ABOUT,		wxIEFrame::OnAbout)
 | 
						|
 | 
						|
    // ActiveX Events
 | 
						|
    EVT_ACTIVEX_DISPID(ID_MSHTML, DISPID_STATUSTEXTCHANGE,  OnMSHTMLStatusTextChangeX)
 | 
						|
    EVT_ACTIVEX(ID_MSHTML, "BeforeNavigate2",   OnMSHTMLBeforeNavigate2X)
 | 
						|
	EVT_ACTIVEX(ID_MSHTML, "TitleChange",       OnMSHTMLTitleChangeX)
 | 
						|
	EVT_ACTIVEX(ID_MSHTML, "NewWindow2",        OnMSHTMLNewWindow2X)
 | 
						|
	EVT_ACTIVEX(ID_MSHTML, "ProgressChange",    OnMSHTMLProgressChangeX)
 | 
						|
END_EVENT_TABLE()
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// main frame
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
// frame constructor
 | 
						|
wxIEFrame::wxIEFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
 | 
						|
       : wxFrame((wxFrame *)NULL, -1, title, pos, size)
 | 
						|
{
 | 
						|
    // set the frame icon
 | 
						|
    SetIcon(wxICON(wxIE));
 | 
						|
 | 
						|
    // create a menu bar
 | 
						|
    wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF);
 | 
						|
 | 
						|
    // the "About" item should be in the help menu
 | 
						|
    wxMenu *helpMenu = new wxMenu;
 | 
						|
    helpMenu->Append(FILE_ABOUT, "&About...\tCtrl-A", "Show about dialog");
 | 
						|
 | 
						|
	menuFile->Append(FILE_TEST_HTML, "Test HTML", "Demonstrates LoadString()");
 | 
						|
	menuFile->Append(FILE_OPEN, "Open HTML File", "Demonstrates LoadStream(istream *)");
 | 
						|
	menuFile->Append(FILE_BROWSE, "Browse Web Page", "Demonstrates LoadUrl(url)");
 | 
						|
	menuFile->Append(FILE_HTML_EDITMODE, "Edit Mode", "Demonstrates editing html", true);
 | 
						|
	menuFile->AppendSeparator();
 | 
						|
	menuFile->Append(FILE_TEST_SELECT, "Get Selected Text", "Demonstrates GetStringSelection(false)");
 | 
						|
	menuFile->Append(FILE_TEST_HTMLSELECT, "Get HTML Selected Text", "Demonstrates GetStringSelection(true)");
 | 
						|
	menuFile->AppendSeparator();
 | 
						|
	menuFile->Append(FILE_TEST_GETTEXT, "Get Text", "Demonstrates GetText(false)");
 | 
						|
	menuFile->Append(FILE_TEST_HTMLGETTEXT, "Get HTML Text", "Demonstrates GetText(true)");
 | 
						|
	menuFile->Append(FILE_TEST_HOME, "Open Home Page", "Demonstrates GoHome()");
 | 
						|
	menuFile->AppendSeparator();
 | 
						|
	menuFile->Append(FILE_TEST_ACTIVEX, "Display a ActiveX control", "Demonstrates the Generic ActiveX Container");
 | 
						|
	menuFile->AppendSeparator();
 | 
						|
    menuFile->Append(FILE_QUIT, "E&xit\tAlt-X", "Quit this program");
 | 
						|
 | 
						|
    // now append the freshly created menu to the menu bar...
 | 
						|
    wxMenuBar *menuBar = new wxMenuBar();
 | 
						|
    menuBar->Append(menuFile, "&File");
 | 
						|
    menuBar->Append(helpMenu, "&Help");
 | 
						|
 | 
						|
    // ... and attach this menu bar to the frame
 | 
						|
    SetMenuBar(menuBar);
 | 
						|
 | 
						|
    // create a status bar just for fun (by default with 1 pane only)
 | 
						|
    wxStatusBar * sb = CreateStatusBar(2);
 | 
						|
    SetStatusText("Ready");
 | 
						|
 | 
						|
	// progress gauge (belongs to status bar)
 | 
						|
	m_gauge = new wxGauge(sb, ID_PROGRESS_GAUGE, 100);
 | 
						|
 | 
						|
	// IE Control
 | 
						|
	m_ie = new wxIEHtmlWin(this, ID_MSHTML);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// event handlers
 | 
						|
 | 
						|
void wxIEFrame::OnSize(wxSizeEvent& event)
 | 
						|
{
 | 
						|
	wxFrame::OnSize(event);
 | 
						|
 | 
						|
	wxStatusBar* sb = GetStatusBar();
 | 
						|
	if (! sb)
 | 
						|
		return;
 | 
						|
 | 
						|
	wxRect rc;
 | 
						|
	sb->GetFieldRect(1, rc);
 | 
						|
 | 
						|
	m_gauge->SetSize(rc);
 | 
						|
};
 | 
						|
 | 
						|
void wxIEFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
    // TRUE is to force the frame to close
 | 
						|
    Close(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
    wxString msg;
 | 
						|
    msg.Printf( _T("About wxIE...\n"));
 | 
						|
    wxMessageBox(msg, "About wxIE", wxOK | wxICON_INFORMATION, this);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnTestHTML(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxString html = 
 | 
						|
		"<HTML><BODY><H1>Hello World</H1>Plain Text</body></html>";
 | 
						|
	m_ie->LoadString(html);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void wxIEFrame::OnTestSelect(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxString s = m_ie->GetStringSelection();
 | 
						|
 | 
						|
	wxMessageBox(s);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnTestHTMLSelect(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxString s = m_ie->GetStringSelection(true);
 | 
						|
 | 
						|
	wxMessageBox(s);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnTestGetText(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxString s = m_ie->GetText();
 | 
						|
 | 
						|
	wxMessageBox(s);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnTestHTMLGetText(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxString s = m_ie->GetText(true);
 | 
						|
 | 
						|
	wxMessageBox(s);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnTestHome(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	m_ie->GoHome();
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
void wxIEFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxFileDialog dlg(this, "Chooose a HTML File", "", "", "HTML files (*.html; *.htm)|*.html;*.htm|",wxOPEN);
 | 
						|
 | 
						|
	if (dlg.ShowModal() == wxID_OK)
 | 
						|
	{
 | 
						|
		wxString fname = dlg.GetPath();
 | 
						|
 | 
						|
		ifstream *is = new ifstream(fname.mb_str());
 | 
						|
		m_ie->LoadStream(is);
 | 
						|
	};
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnEditMode(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	m_ie->SetEditMode(! m_ie->GetEditMode());
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnEditModeUI(wxUpdateUIEvent& event)
 | 
						|
{
 | 
						|
    if (m_ie)
 | 
						|
	    event.Check(m_ie->GetEditMode());
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnBrowse(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
	wxString url = wxGetTextFromUser("Enter URL:", "Browse", "", this);
 | 
						|
 | 
						|
	m_ie->LoadUrl(url);
 | 
						|
}
 | 
						|
 | 
						|
void wxIEFrame::OnMSHTMLStatusTextChangeX(wxActiveXEvent& event)
 | 
						|
{
 | 
						|
    SetStatusText(event["Text"]);
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
void wxIEFrame::OnMSHTMLBeforeNavigate2X(wxActiveXEvent& event)
 | 
						|
{
 | 
						|
    wxString url = event["Url"];
 | 
						|
	if (url == "about:blank")
 | 
						|
		return;
 | 
						|
 | 
						|
	int rc = wxMessageBox(url, "Allow open url ?", wxYES_NO);
 | 
						|
 | 
						|
	if (rc != wxYES)
 | 
						|
		event["Cancel"] = true;
 | 
						|
};
 | 
						|
 | 
						|
void wxIEFrame::OnMSHTMLTitleChangeX(wxActiveXEvent& event)
 | 
						|
{
 | 
						|
	SetTitle(event["Text"]);
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
void wxIEFrame::OnMSHTMLNewWindow2X(wxActiveXEvent& event)
 | 
						|
{
 | 
						|
	int rc = wxMessageBox("New Window requested", "Allow New Window ?", wxYES_NO);
 | 
						|
 | 
						|
	if (rc != wxYES)
 | 
						|
		event["Cancel"] = true;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
void wxIEFrame::OnMSHTMLProgressChangeX(wxActiveXEvent& event)
 | 
						|
{
 | 
						|
	if ((long) event["ProgressMax"] != m_gauge->GetRange())
 | 
						|
		m_gauge->SetRange((long) event["ProgressMax"]);
 | 
						|
 | 
						|
	m_gauge->SetValue((long) event["Progress"]);
 | 
						|
};
 | 
						|
 | 
						|
void wxIEFrame::OnTestActiveX(wxCommandEvent& WXUNUSED(event))
 | 
						|
{
 | 
						|
// Some known prog ids
 | 
						|
//#define PROGID "Shell.Explorer"
 | 
						|
//#define PROGID CLSID_WebBrowser
 | 
						|
//#define PROGID CLSID_MozillaBrowser
 | 
						|
//#define PROGID CLSID_HTMLDocument
 | 
						|
//#define PROGID "MSCAL.Calendar"
 | 
						|
//#define PROGID "WordPad.Document"
 | 
						|
//#define PROGID "SoftwareFX.ChartFX"
 | 
						|
//#define PROGID "PDF.PdfCtrl"
 | 
						|
#define PROGID "ShockwaveFlash.ShockwaveFlash"
 | 
						|
 | 
						|
    wxDialog dlg(this, -1, wxString(wxT("Test ActiveX")));
 | 
						|
 | 
						|
    wxFlexGridSizer *sz = new wxFlexGridSizer(2);
 | 
						|
    sz->Add(new wxStaticText(&dlg, -1, wxT("Enter a ActiveX ProgId")), 0, wxALL, 5 );
 | 
						|
 | 
						|
    wxComboBox *cb = new wxComboBox(&dlg, 101, "");
 | 
						|
    cb->Append(wxT("ShockwaveFlash.ShockwaveFlash"));
 | 
						|
    cb->Append(wxT("MSCAL.Calendar"));
 | 
						|
    cb->Append(wxT("Shell.Explorer"));
 | 
						|
    cb->Append(wxT("WordPad.Document.1"));
 | 
						|
    cb->Append(wxT("SoftwareFX.ChartFX.20"));
 | 
						|
    cb->Append(wxT("PDF.PdfCtrl.5"));
 | 
						|
    cb->SetSelection(0);
 | 
						|
 | 
						|
    sz->Add(cb, 0, wxALL, 5 );
 | 
						|
 | 
						|
    // next row
 | 
						|
    sz->Add(new wxButton(&dlg, wxID_CANCEL, "Cancel"), 0, wxALIGN_RIGHT|wxALL, 5 );
 | 
						|
    sz->Add(new wxButton(&dlg, wxID_OK, "Ok"), 0, wxALIGN_RIGHT|wxALL, 5 );
 | 
						|
 | 
						|
    dlg.SetAutoLayout( TRUE );
 | 
						|
    dlg.SetSizer(sz);
 | 
						|
    sz->Fit(&dlg);
 | 
						|
    sz->SetSizeHints(&dlg);
 | 
						|
 | 
						|
 | 
						|
    if (dlg.ShowModal() == wxID_OK)
 | 
						|
    {
 | 
						|
        wxString progId = cb->GetValue();
 | 
						|
        wxActiveXFrame *frame = new wxActiveXFrame(this, progId);
 | 
						|
        frame->Show();
 | 
						|
    };
 | 
						|
}
 | 
						|
 |