Attempt at using inkedit control for wxTextCtrl, when PC is tablet enabled. Currently

doesn't behave properly but is a first step.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37357 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2006-02-06 17:56:44 +00:00
parent da817fa6eb
commit 8ef51d6704
3 changed files with 138 additions and 38 deletions

View File

@@ -255,6 +255,14 @@
# define wxUSE_MEDIACTRL 0 # define wxUSE_MEDIACTRL 0
# endif # endif
# endif # endif
# if wxUSE_INKEDIT
# ifdef wxABORT_ON_CONFIG_ERROR
# error "wxUSE_INKEDIT requires wxUSE_DYNLIB_CLASS"
# else
# undef wxUSE_INKEDIT
# define wxUSE_INKEDIT 0
# endif
# endif
#endif /* wxUSE_DYNLIB_CLASS */ #endif /* wxUSE_DYNLIB_CLASS */
#endif /* _WX_MSW_CHKCONF_H_ */ #endif /* _WX_MSW_CHKCONF_H_ */

View File

@@ -158,6 +158,12 @@ public:
virtual bool SetForegroundColour(const wxColour& colour); virtual bool SetForegroundColour(const wxColour& colour);
#endif // wxUSE_RICHEDIT #endif // wxUSE_RICHEDIT
#if wxUSE_INKEDIT && wxUSE_RICHEDIT
bool IsInkEdit() const { return m_isInkEdit != 0; }
#else
bool IsInkEdit() const { return false; }
#endif
virtual void AdoptAttributesFromHWND(); virtual void AdoptAttributesFromHWND();
virtual bool AcceptsFocus() const; virtual bool AcceptsFocus() const;
@@ -260,6 +266,11 @@ private:
wxMenu* m_privateContextMenu; wxMenu* m_privateContextMenu;
bool m_isNativeCaretShown; bool m_isNativeCaretShown;
#if wxUSE_INKEDIT && wxUSE_RICHEDIT
int m_isInkEdit;
#endif
}; };
#endif #endif

View File

@@ -39,6 +39,7 @@
#endif #endif
#include "wx/module.h" #include "wx/module.h"
#include "wx/sysopt.h"
#if wxUSE_CLIPBOARD #if wxUSE_CLIPBOARD
#include "wx/clipbrd.h" #include "wx/clipbrd.h"
@@ -60,6 +61,10 @@
#if wxUSE_RICHEDIT #if wxUSE_RICHEDIT
#if wxUSE_INKEDIT
#include "wx/dynlib.h"
#endif
// old mingw32 has richedit stuff directly in windows.h and doesn't have // old mingw32 has richedit stuff directly in windows.h and doesn't have
// richedit.h at all // richedit.h at all
#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__) #if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
@@ -94,15 +99,30 @@ public:
// load the richedit DLL for the specified version of rich edit // load the richedit DLL for the specified version of rich edit
static bool Load(Version version); static bool Load(Version version);
#if wxUSE_INKEDIT
// load the InkEdit library
static bool LoadInkEdit();
#endif
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[Version_Max]; static HINSTANCE ms_hRichEdit[Version_Max];
#if wxUSE_INKEDIT
static wxDynamicLibrary ms_inkEditLib;
static bool ms_inkEditLibLoadAttemped;
#endif
DECLARE_DYNAMIC_CLASS(wxRichEditModule) DECLARE_DYNAMIC_CLASS(wxRichEditModule)
}; };
HINSTANCE wxRichEditModule::ms_hRichEdit[Version_Max] = { NULL, NULL, NULL }; HINSTANCE wxRichEditModule::ms_hRichEdit[Version_Max] = { NULL, NULL, NULL };
#if wxUSE_INKEDIT
wxDynamicLibrary wxRichEditModule::ms_inkEditLib;
bool wxRichEditModule::ms_inkEditLibLoadAttemped = false;
#endif
IMPLEMENT_DYNAMIC_CLASS(wxRichEditModule, wxModule) IMPLEMENT_DYNAMIC_CLASS(wxRichEditModule, wxModule)
#endif // wxUSE_RICHEDIT #endif // wxUSE_RICHEDIT
@@ -252,6 +272,10 @@ void wxTextCtrl::Init()
m_verRichEdit = 0; m_verRichEdit = 0;
#endif // wxUSE_RICHEDIT #endif // wxUSE_RICHEDIT
#if wxUSE_INKEDIT && wxUSE_RICHEDIT
m_isInkEdit = 0;
#endif
m_privateContextMenu = NULL; m_privateContextMenu = NULL;
m_updatesCount = -1; m_updatesCount = -1;
m_isNativeCaretShown = true; m_isNativeCaretShown = true;
@@ -321,49 +345,73 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
m_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
if ( m_verRichEdit == 2 ) #if wxUSE_INKEDIT
// First test if we can load an ink edit control. Normally, all edit
// controls will be made ink edit controls if a tablet environment is
// found (or if msw.inkedit != 0 and the InkEd.dll is present).
// However, an application can veto ink edit controls by either specifying
// msw.inkedit = 0 or by removing wxTE_RICH[2] from the style.
if ((wxSystemSettings::HasFeature(wxSYS_TABLET_PRESENT) || wxSystemOptions::GetOptionInt(wxT("msw.inkedit")) != 0) &&
!(wxSystemOptions::HasOption(wxT("msw.inkedit")) && wxSystemOptions::GetOptionInt(wxT("msw.inkedit")) == 0))
{ {
if ( wxRichEditModule::Load(wxRichEditModule::Version_41) ) if (wxRichEditModule::LoadInkEdit())
{ {
// yes, class name for version 4.1 really is 5.0 windowClass = INKEDIT_CLASS;
windowClass = _T("RICHEDIT50W"); m_isInkEdit = 1;
}
else if ( wxRichEditModule::Load(wxRichEditModule::Version_2or3) ) // Fake rich text version for other calls
{ m_verRichEdit = 2;
windowClass = _T("RichEdit20")
#if wxUSE_UNICODE
_T("W");
#else // ANSI
_T("A");
#endif // Unicode/ANSI
}
else // failed to load msftedit.dll and riched20.dll
{
m_verRichEdit = 1;
} }
} }
#endif
if ( m_verRichEdit == 1 ) if (!m_isInkEdit)
{ {
if ( wxRichEditModule::Load(wxRichEditModule::Version_1) ) if ( m_verRichEdit == 2 )
{ {
windowClass = _T("RICHEDIT"); if ( wxRichEditModule::Load(wxRichEditModule::Version_41) )
}
else // failed to load any richedit control DLL
{
// only give the error msg once if the DLL can't be loaded
static bool s_errorGiven = false; // MT ok as only used by GUI
if ( !s_errorGiven )
{ {
wxLogError(_("Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dll")); // yes, class name for version 4.1 really is 5.0
windowClass = _T("RICHEDIT50W");
s_errorGiven = true; }
else if ( wxRichEditModule::Load(wxRichEditModule::Version_2or3) )
{
windowClass = _T("RichEdit20")
#if wxUSE_UNICODE
_T("W");
#else // ANSI
_T("A");
#endif // Unicode/ANSI
}
else // failed to load msftedit.dll and riched20.dll
{
m_verRichEdit = 1;
} }
m_verRichEdit = 0;
} }
}
if ( m_verRichEdit == 1 )
{
if ( wxRichEditModule::Load(wxRichEditModule::Version_1) )
{
windowClass = _T("RICHEDIT");
}
else // failed to load any richedit control DLL
{
// only give the error msg once if the DLL can't be loaded
static bool s_errorGiven = false; // MT ok as only used by GUI
if ( !s_errorGiven )
{
wxLogError(_("Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dll"));
s_errorGiven = true;
}
m_verRichEdit = 0;
}
}
} // !useInkEdit
} }
#endif // wxUSE_RICHEDIT #endif // wxUSE_RICHEDIT
@@ -382,13 +430,25 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
return false; return false;
#if wxUSE_RICHEDIT #if wxUSE_RICHEDIT
if ( IsRich() ) if (IsRich())
{ {
#if wxUSE_INKEDIT
if (IsInkEdit())
{
// Pass IEM_InsertText (0) as wParam, in order to have the ink always
// converted to text.
::SendMessage(GetHwnd(), EM_SETINKINSERTMODE, 0, 0);
// Make sure the mouse can be used for input
::SendMessage(GetHwnd(), EM_SETUSEMOUSEFORINPUT, 1, 0);
}
#endif
// enable the events we're interested in: we want to get EN_CHANGE as // enable the events we're interested in: we want to get EN_CHANGE as
// for the normal controls // for the normal controls
LPARAM mask = ENM_CHANGE; LPARAM mask = ENM_CHANGE;
if ( GetRichVersion() == 1 ) if (GetRichVersion() == 1 && !IsInkEdit())
{ {
// we also need EN_MSGFILTER for richedit 1.0 for the reasons // we also need EN_MSGFILTER for richedit 1.0 for the reasons
// explained in its handler // explained in its handler
@@ -2660,6 +2720,10 @@ void wxRichEditModule::OnExit()
ms_hRichEdit[i] = NULL; ms_hRichEdit[i] = NULL;
} }
} }
#if wxUSE_INKEDIT
if (ms_inkEditLib.IsLoaded())
ms_inkEditLib.Unload();
#endif
} }
/* static */ /* static */
@@ -2699,6 +2763,23 @@ bool wxRichEditModule::Load(Version version)
return true; return true;
} }
#if wxUSE_INKEDIT
// load the InkEdit library
bool wxRichEditModule::LoadInkEdit()
{
static wxDynamicLibrary ms_inkEditLib;
static bool ms_inkEditLibLoadAttemped;
if (ms_inkEditLibLoadAttemped)
ms_inkEditLib.IsLoaded();
ms_inkEditLibLoadAttemped = true;
wxLogNull logNull;
return ms_inkEditLib.Load(wxT("inked"));
}
#endif
#endif // wxUSE_RICHEDIT #endif // wxUSE_RICHEDIT
#endif // wxUSE_TEXTCTRL && !(__SMARTPHONE__ && __WXWINCE__) #endif // wxUSE_TEXTCTRL && !(__SMARTPHONE__ && __WXWINCE__)