wxTextCtrl with wxTE_RICH2 style now uses RichEdit 4.1 if available (replaces patch 1160809)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32990 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
8397cab4da
commit
628c219e64
@ -33,6 +33,7 @@ Unix:
|
|||||||
wxMSW:
|
wxMSW:
|
||||||
|
|
||||||
- Added "orient" parameter to wxMDIParentFrame::Tile()
|
- Added "orient" parameter to wxMDIParentFrame::Tile()
|
||||||
|
- wxTextCtrl with wxTE_RICH2 style now uses RichEdit 4.1 if available
|
||||||
|
|
||||||
wxGTK:
|
wxGTK:
|
||||||
|
|
||||||
|
@ -84,20 +84,28 @@
|
|||||||
class wxRichEditModule : public wxModule
|
class wxRichEditModule : public wxModule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum Version
|
||||||
|
{
|
||||||
|
Version_1, // riched32.dll
|
||||||
|
Version_2or3, // both use riched20.dll
|
||||||
|
Version_41, // msftedit.dll (XP SP1 and Windows 2003)
|
||||||
|
Version_Max
|
||||||
|
};
|
||||||
|
|
||||||
virtual bool OnInit();
|
virtual bool OnInit();
|
||||||
virtual void OnExit();
|
virtual void OnExit();
|
||||||
|
|
||||||
// load the richedit DLL of at least of required version
|
// load the richedit DLL for the specified version of rich edit
|
||||||
static bool Load(int version = 1);
|
static bool Load(Version version);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// the handles to richedit 1.0 and 2.0 (or 3.0) DLLs
|
// the handles to richedit 1.0 and 2.0 (or 3.0) DLLs
|
||||||
static HINSTANCE ms_hRichEdit[2];
|
static HINSTANCE ms_hRichEdit[Version_Max];
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxRichEditModule)
|
DECLARE_DYNAMIC_CLASS(wxRichEditModule)
|
||||||
};
|
};
|
||||||
|
|
||||||
HINSTANCE wxRichEditModule::ms_hRichEdit[2] = { NULL, NULL };
|
HINSTANCE wxRichEditModule::ms_hRichEdit[Version_Max] = { NULL, NULL, NULL };
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxRichEditModule, wxModule)
|
IMPLEMENT_DYNAMIC_CLASS(wxRichEditModule, wxModule)
|
||||||
|
|
||||||
@ -303,63 +311,58 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
|||||||
// we need to load the richedit DLL before creating the rich edit control
|
// we need to load the richedit DLL before creating the rich edit control
|
||||||
if ( m_windowStyle & wxTE_RICH )
|
if ( m_windowStyle & wxTE_RICH )
|
||||||
{
|
{
|
||||||
static bool s_errorGiven = false;// MT-FIXME
|
// versions 2.0, 3.0 and 4.1 of rich edit are mostly compatible with
|
||||||
|
// each other but not with version 1.0, so we have separate flags for
|
||||||
// Which version do we need? Use 1.0 by default because it is much more
|
// the version 1.0 and the others (and so m_verRichEdit may be 0 (plain
|
||||||
// like the the standard EDIT or 2.0 if explicitly requested, but use
|
// EDIT control), 1 for version 1.0 or 2 for any higher version)
|
||||||
// only 2.0 in Unicode mode as 1.0 doesn't support Unicode at all
|
|
||||||
//
|
//
|
||||||
// TODO: RichEdit 3.0 is apparently capable of emulating RichEdit 1.0
|
// notice that 1.0 has no Unicode support at all so in Unicode build we
|
||||||
// (and thus EDIT) much better than RichEdit 2.0 so we probably
|
// must use another version
|
||||||
// should use 3.0 if available as it is the best of both worlds -
|
|
||||||
// but as I can't test it right now I don't do it (VZ)
|
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
const int verRichEdit = 2;
|
m_verRichEdit = 2;
|
||||||
#else // !wxUSE_UNICODE
|
#else // !wxUSE_UNICODE
|
||||||
int verRichEdit = m_windowStyle & wxTE_RICH2 ? 2 : 1;
|
m_verRichEdit = m_windowStyle & wxTE_RICH2 ? 2 : 1;
|
||||||
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
|
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
|
||||||
|
|
||||||
// only give the error msg once if the DLL can't be loaded
|
if ( m_verRichEdit == 2 )
|
||||||
if ( !s_errorGiven )
|
|
||||||
{
|
{
|
||||||
// try to load the RichEdit DLL (will do nothing if already done)
|
if ( wxRichEditModule::Load(wxRichEditModule::Version_41) )
|
||||||
if ( !wxRichEditModule::Load(verRichEdit) )
|
|
||||||
{
|
{
|
||||||
#if !wxUSE_UNICODE
|
// yes, class name for version 4.1 really is 5.0
|
||||||
// try another version?
|
windowClass = _T("RICHEDIT50W");
|
||||||
verRichEdit = 3 - verRichEdit; // 1 <-> 2
|
}
|
||||||
|
else if ( wxRichEditModule::Load(wxRichEditModule::Version_2or3) )
|
||||||
if ( !wxRichEditModule::Load(verRichEdit) )
|
{
|
||||||
#endif // wxUSE_UNICODE
|
windowClass = _T("RichEdit20")
|
||||||
{
|
#if wxUSE_UNICODE
|
||||||
wxLogError(_("Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dll"));
|
_T("W");
|
||||||
|
#else // ANSI
|
||||||
s_errorGiven = true;
|
_T("A");
|
||||||
}
|
#endif // Unicode/ANSI
|
||||||
|
}
|
||||||
|
else // failed to load msftedit.dll and riched20.dll
|
||||||
|
{
|
||||||
|
m_verRichEdit = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// have we managed to load any richedit version?
|
if ( m_verRichEdit == 1 )
|
||||||
if ( !s_errorGiven )
|
|
||||||
{
|
{
|
||||||
m_verRichEdit = verRichEdit;
|
if ( wxRichEditModule::Load(wxRichEditModule::Version_1) )
|
||||||
if ( m_verRichEdit == 1 )
|
|
||||||
{
|
{
|
||||||
windowClass = wxT("RICHEDIT");
|
windowClass = _T("RICHEDIT");
|
||||||
}
|
}
|
||||||
else
|
else // failed to load any richedit control DLL
|
||||||
{
|
{
|
||||||
#ifndef RICHEDIT_CLASS
|
// only give the error msg once if the DLL can't be loaded
|
||||||
wxString RICHEDIT_CLASS;
|
static bool s_errorGiven = false; // MT ok as only used by GUI
|
||||||
RICHEDIT_CLASS.Printf(_T("RichEdit%d0"), m_verRichEdit);
|
|
||||||
#if wxUSE_UNICODE
|
|
||||||
RICHEDIT_CLASS += _T('W');
|
|
||||||
#else // ANSI
|
|
||||||
RICHEDIT_CLASS += _T('A');
|
|
||||||
#endif // Unicode/ANSI
|
|
||||||
#endif // !RICHEDIT_CLASS
|
|
||||||
|
|
||||||
windowClass = RICHEDIT_CLASS;
|
wxLogError(_("Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dll"));
|
||||||
|
|
||||||
|
s_errorGiven = true;
|
||||||
|
|
||||||
|
m_verRichEdit = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2619,6 +2622,8 @@ bool wxTextCtrl::GetStyle(long position, wxTextAttr& style)
|
|||||||
// wxRichEditModule
|
// wxRichEditModule
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static const HINSTANCE INVALID_HINSTANCE = (HINSTANCE)-1;
|
||||||
|
|
||||||
bool wxRichEditModule::OnInit()
|
bool wxRichEditModule::OnInit()
|
||||||
{
|
{
|
||||||
// don't do anything - we will load it when needed
|
// don't do anything - we will load it when needed
|
||||||
@ -2629,7 +2634,7 @@ void wxRichEditModule::OnExit()
|
|||||||
{
|
{
|
||||||
for ( size_t i = 0; i < WXSIZEOF(ms_hRichEdit); i++ )
|
for ( size_t i = 0; i < WXSIZEOF(ms_hRichEdit); i++ )
|
||||||
{
|
{
|
||||||
if ( ms_hRichEdit[i] )
|
if ( ms_hRichEdit[i] && ms_hRichEdit[i] != INVALID_HINSTANCE )
|
||||||
{
|
{
|
||||||
::FreeLibrary(ms_hRichEdit[i]);
|
::FreeLibrary(ms_hRichEdit[i]);
|
||||||
ms_hRichEdit[i] = NULL;
|
ms_hRichEdit[i] = NULL;
|
||||||
@ -2638,17 +2643,9 @@ void wxRichEditModule::OnExit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
bool wxRichEditModule::Load(int version)
|
bool wxRichEditModule::Load(Version version)
|
||||||
{
|
{
|
||||||
// we don't support loading richedit 3.0 as I don't know how to distinguish
|
if ( ms_hRichEdit[version] == INVALID_HINSTANCE )
|
||||||
// it from 2.0 anyhow
|
|
||||||
wxCHECK_MSG( version == 1 || version == 2, false,
|
|
||||||
_T("incorrect richedit control version requested") );
|
|
||||||
|
|
||||||
// make it the index in the array
|
|
||||||
version--;
|
|
||||||
|
|
||||||
if ( ms_hRichEdit[version] == (HINSTANCE)-1 )
|
|
||||||
{
|
{
|
||||||
// we had already tried to load it and failed
|
// we had already tried to load it and failed
|
||||||
return false;
|
return false;
|
||||||
@ -2660,16 +2657,21 @@ bool wxRichEditModule::Load(int version)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString dllname = version ? _T("riched20") : _T("riched32");
|
static const wxChar *dllnames[] =
|
||||||
dllname += _T(".dll");
|
{
|
||||||
|
_T("riched32"),
|
||||||
|
_T("riched20"),
|
||||||
|
_T("msftedit"),
|
||||||
|
};
|
||||||
|
|
||||||
ms_hRichEdit[version] = ::LoadLibrary(dllname);
|
wxCOMPILE_TIME_ASSERT( WXSIZEOF(dllnames) == Version_Max,
|
||||||
|
RichEditDllNamesVersionsMismatch );
|
||||||
|
|
||||||
|
ms_hRichEdit[version] = ::LoadLibrary(dllnames[version]);
|
||||||
|
|
||||||
if ( !ms_hRichEdit[version] )
|
if ( !ms_hRichEdit[version] )
|
||||||
{
|
{
|
||||||
wxLogSysError(_("Could not load Rich Edit DLL '%s'"), dllname.c_str());
|
ms_hRichEdit[version] = INVALID_HINSTANCE;
|
||||||
|
|
||||||
ms_hRichEdit[version] = (HINSTANCE)-1;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user