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:
parent
da817fa6eb
commit
8ef51d6704
@ -255,6 +255,14 @@
|
||||
# define wxUSE_MEDIACTRL 0
|
||||
# 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 /* _WX_MSW_CHKCONF_H_ */
|
||||
|
@ -158,6 +158,12 @@ public:
|
||||
virtual bool SetForegroundColour(const wxColour& colour);
|
||||
#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 bool AcceptsFocus() const;
|
||||
@ -260,6 +266,11 @@ private:
|
||||
wxMenu* m_privateContextMenu;
|
||||
|
||||
bool m_isNativeCaretShown;
|
||||
|
||||
#if wxUSE_INKEDIT && wxUSE_RICHEDIT
|
||||
int m_isInkEdit;
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -39,6 +39,7 @@
|
||||
#endif
|
||||
|
||||
#include "wx/module.h"
|
||||
#include "wx/sysopt.h"
|
||||
|
||||
#if wxUSE_CLIPBOARD
|
||||
#include "wx/clipbrd.h"
|
||||
@ -60,6 +61,10 @@
|
||||
|
||||
#if wxUSE_RICHEDIT
|
||||
|
||||
#if wxUSE_INKEDIT
|
||||
#include "wx/dynlib.h"
|
||||
#endif
|
||||
|
||||
// old mingw32 has richedit stuff directly in windows.h and doesn't have
|
||||
// richedit.h at all
|
||||
#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
|
||||
@ -94,15 +99,30 @@ public:
|
||||
// load the richedit DLL for the specified version of rich edit
|
||||
static bool Load(Version version);
|
||||
|
||||
#if wxUSE_INKEDIT
|
||||
// load the InkEdit library
|
||||
static bool LoadInkEdit();
|
||||
#endif
|
||||
|
||||
private:
|
||||
// the handles to richedit 1.0 and 2.0 (or 3.0) DLLs
|
||||
static HINSTANCE ms_hRichEdit[Version_Max];
|
||||
|
||||
#if wxUSE_INKEDIT
|
||||
static wxDynamicLibrary ms_inkEditLib;
|
||||
static bool ms_inkEditLibLoadAttemped;
|
||||
#endif
|
||||
|
||||
DECLARE_DYNAMIC_CLASS(wxRichEditModule)
|
||||
};
|
||||
|
||||
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)
|
||||
|
||||
#endif // wxUSE_RICHEDIT
|
||||
@ -252,6 +272,10 @@ void wxTextCtrl::Init()
|
||||
m_verRichEdit = 0;
|
||||
#endif // wxUSE_RICHEDIT
|
||||
|
||||
#if wxUSE_INKEDIT && wxUSE_RICHEDIT
|
||||
m_isInkEdit = 0;
|
||||
#endif
|
||||
|
||||
m_privateContextMenu = NULL;
|
||||
m_updatesCount = -1;
|
||||
m_isNativeCaretShown = true;
|
||||
@ -321,49 +345,73 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
||||
m_verRichEdit = m_windowStyle & wxTE_RICH2 ? 2 : 1;
|
||||
#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) )
|
||||
{
|
||||
// yes, class name for version 4.1 really is 5.0
|
||||
windowClass = _T("RICHEDIT50W");
|
||||
}
|
||||
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;
|
||||
if (wxRichEditModule::LoadInkEdit())
|
||||
{
|
||||
windowClass = INKEDIT_CLASS;
|
||||
m_isInkEdit = 1;
|
||||
|
||||
// Fake rich text version for other calls
|
||||
m_verRichEdit = 2;
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_verRichEdit == 1 )
|
||||
#endif
|
||||
|
||||
if (!m_isInkEdit)
|
||||
{
|
||||
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 )
|
||||
if ( m_verRichEdit == 2 )
|
||||
{
|
||||
if ( wxRichEditModule::Load(wxRichEditModule::Version_41) )
|
||||
{
|
||||
wxLogError(_("Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dll"));
|
||||
|
||||
s_errorGiven = true;
|
||||
// yes, class name for version 4.1 really is 5.0
|
||||
windowClass = _T("RICHEDIT50W");
|
||||
}
|
||||
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
|
||||
|
||||
@ -382,13 +430,25 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
||||
return false;
|
||||
|
||||
#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
|
||||
// for the normal controls
|
||||
LPARAM mask = ENM_CHANGE;
|
||||
|
||||
if ( GetRichVersion() == 1 )
|
||||
if (GetRichVersion() == 1 && !IsInkEdit())
|
||||
{
|
||||
// we also need EN_MSGFILTER for richedit 1.0 for the reasons
|
||||
// explained in its handler
|
||||
@ -2660,6 +2720,10 @@ void wxRichEditModule::OnExit()
|
||||
ms_hRichEdit[i] = NULL;
|
||||
}
|
||||
}
|
||||
#if wxUSE_INKEDIT
|
||||
if (ms_inkEditLib.IsLoaded())
|
||||
ms_inkEditLib.Unload();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* static */
|
||||
@ -2699,6 +2763,23 @@ bool wxRichEditModule::Load(Version version)
|
||||
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_TEXTCTRL && !(__SMARTPHONE__ && __WXWINCE__)
|
||||
|
Loading…
Reference in New Issue
Block a user