Empfangen von Eingaben vom Mathematischen Eingabesteuerelement
In diesem Abschnitt wird erläutert, wie Sie das MathML-Markup mithilfe der Active Template Library (ATL) und des Component Object Model (COM) aus dem Mathematischen Eingabesteuerelement abrufen.
Um die erkannte mathematische Formel aus dem Mathematischen Eingabesteuerelement abzurufen, können Sie das Verhalten überschreiben, das beim Drücken der Einfügeschalte-Schaltfläche auftritt. Dazu müssen Sie einen Ereignishandler einrichten, der die verschiedenen Ereignisse implementiert, die von der _IMathInputControlEvents-Schnittstelle unterstützt werden. Das Einrichten des Ereignishandlers umfasst die folgenden Schritte für die Ereignisse, die Sie unterstützen möchten (in diesem Fall einfügen).
- Erstellen einer Vorlagenklasse mit Ereignissenken
- Einrichten der Ereignishandler
- Erben der Ereignishandlerklasse in Ihrer Standard-Klasse
- Initialisieren Sie Ihre Klasse, um die Ereignissenken zu erben.
Erstellen einer Vorlagenklasse mit Ereignissenken
Wenn Sie eine Ereignissenke implementieren, die das Mathematische Eingabesteuerelement verwendet, müssen Sie zuerst eine Senken-ID angeben. Anschließend müssen Sie eine Vorlagenklasse erstellen, die von den Ereignis-, Ereignissteuerungshandler- und Mathematischen Eingabesteuerelement-Ereignisschnittstellen erbt. Der folgende Code zeigt, wie Sie eine Senken-ID festlegen und eine solche Vorlagenklasse erstellen, CMathInputControlEventHandler, die von den erforderlichen Schnittstellen erbt. Diese Vorlagenklasse ist auch so eingerichtet, dass ein privater unbekannter Schnittstellenzeiger verwendet wird, der verwendet wird, um das mathematische Eingabesteuerelement bei der Initialisierung zu übergeben, und das m_ulAdviseCount Member, um die Anzahl der Aufrufe zu zählen, die beraten/aufheben sollen.
#pragma once
static const int MATHINPUTCONTROL_SINK_ID = 1 ;
template <class T>
class ATL_NO_VTABLE CMathInputControlEventHandler :
public IDispEventSimpleImpl<MATHINPUTCONTROL_SINK_ID, CMathInputControlEventHandler<T>, &__uuidof(_IMathInputControlEvents)>
{
private:
IUnknown *m_pUnknown;
ULONG m_ulAdviseCount;
CDialog *m_pMain;
Hinweis
Das Element m_pMain sollte sich in Ihrer Implementierung unterscheiden, wenn Sie kein Dialogfeld verwenden.
Nachdem Sie nun über die Standardvorlagenklasse verfügen, müssen Sie eine Vorwärtsdeklaration für die Ereignishandler bereitstellen, die Sie überschreiben werden, und dann eine Senkenzuordnung für die von Ihnen zu behandelnden Ereignisse einrichten. Der folgende Code zeigt, wie Sie Ereignishandler für die Insert-Methode einrichten, die aufgerufen wird, wenn ein Benutzer auf die Schaltfläche einfügen im mathematischen Eingabesteuerelement klickt, und die Close-Methode , die aufgerufen wird, wenn ein Benutzer auf die Schaltfläche abbrechen im mathematischen Eingabesteuerelement klickt.
public:
static const _ATL_FUNC_INFO OnMICInsertInfo; // = {CC_STDCALL, VT_I4, 1, {VT_BSTR}};
static const _ATL_FUNC_INFO OnMICCloseInfo; // = {CC_STDCALL, VT_I4, 0, {VT_EMPTY}};
BEGIN_SINK_MAP(CMathInputControlEventHandler)
SINK_ENTRY_INFO(MATHINPUTCONTROL_SINK_ID, __uuidof(_IMathInputControlEvents), DISPID_MICInsert, OnMICInsert, const_cast<_ATL_FUNC_INFO*>(&OnMICInsertInfo))
SINK_ENTRY_INFO(MATHINPUTCONTROL_SINK_ID, __uuidof(_IMathInputControlEvents), DISPID_MICClose, OnMICClose, const_cast<_ATL_FUNC_INFO*>(&OnMICCloseInfo))
END_SINK_MAP()
Da Sie mit dem Mathematischen Eingabesteuerelement arbeiten, ist es hilfreich, einen internen Verweis auf die relevante Schnittstelle festzulegen. Die folgende Hilfsprogrammfunktion wird in der Beispielklasse erstellt, um diesen Verweis festzulegen.
HRESULT Initialize(IUnknown *pUnknown, CDialog *pMain)
{
m_pMain = pMain;
m_pUnknown = pUnknown;
m_ulAdviseCount = 0;
return S_OK;
}
Einrichten der Ereignishandler
Nachdem Sie die Ereignissenken eingerichtet haben, müssen Sie Ihre Implementierungen der Ereignissenken erstellen. In beiden Methoden im folgenden Codebeispiel rufen die Ereignissenken ein Handle für die Steuerelementschnittstelle für mathematische Eingaben ab. In der Funktion Einfügen wird das Erkennungsergebnis als MathML angezeigt, und das Steuerelement ist ausgeblendet. In der Schließen-Funktion ist das Mathematische Eingabesteuerelement ausgeblendet.
// Methods
HRESULT __stdcall OnMICInsert( BSTR bstrRecoResult)
{
CComQIPtr<IMathInputControl> spMIC(m_pUnknown);
HRESULT hr=S_OK;
if (spMIC)
{
MessageBox(NULL,bstrRecoResult,L"Recognition Result",MB_OK);
hr = spMIC->Hide();
return hr;
}
return E_FAIL;
}
HRESULT __stdcall OnMICClose()
{
CComPtr<IMathInputControl> spMIC;
HRESULT hr = m_pUnknown->QueryInterface<IMathInputControl>(&spMIC);
if (SUCCEEDED(hr))
{
hr = spMIC->Hide();
return hr;
}
return hr;
}
};
Erben der Ereignishandlerklasse in Ihrer Standard-Klasse
Nachdem Sie Ihre Vorlagenklasse implementiert haben, müssen Sie sie in die Klasse vererben, in der Sie Ihr Mathematisches Eingabesteuerelement einrichten. Für die Zwecke dieses Leitfadens ist diese Klasse ein Dialogfeld, CMIC_TEST_EVENTSDlg. Im Dialogheader müssen die erforderlichen Header enthalten sein, und die von Ihnen erstellte Vorlagenklasse muss geerbt werden. Die Klasse, in der Sie geerbt haben, und die Ereignishandler müssen Über Forwarddeklarationen verfügen, damit die Vorlage implementiert werden kann. Das folgende Codebeispiel zeigt, wie dies geschieht.
#pragma once
#include <atlbase.h>
#include <atlwin.h>
// include for MIC
#include "micaut.h"
// include for event sinks
#include <iacom.h>
#include "mathinputcontroleventhandler.h"
class CMIC_TEST_EVENTSDlg;
const _ATL_FUNC_INFO CMathInputControlEventHandler<CMIC_TEST_EVENTSDlg>::OnMICInsertInfo = {CC_STDCALL, VT_I4, 1, {VT_BSTR}};
const _ATL_FUNC_INFO CMathInputControlEventHandler<CMIC_TEST_EVENTSDlg>::OnMICCloseInfo = {CC_STDCALL, VT_I4, 0, {VT_EMPTY}};
// CMIC_TEST_EVENTSDlg dialog
class CMIC_TEST_EVENTSDlg : public CDialog,
public CMathInputControlEventHandler<CMIC_TEST_EVENTSDlg>
{
public:
CComPtr<IMathInputControl> m_spMIC; // Math Input Control
Hinweis
Der Vorlagentyp CMIC_TEST_EventsDlg unterscheidet sich, es sei denn, Sie haben Ihrer Klasse den gleichen Namen wie im Beispiel gegeben.
Initialisieren Sie Ihre Klasse, um die Ereignissenken zu erben.
Nachdem Sie Ihre Klasse so eingerichtet haben, dass sie von der Vorlagenklasse erbt, können Sie sie für die Behandlung von Ereignissen einrichten. Dies besteht aus der Initialisierung der -Klasse, um ein Handle für das Mathematische Eingabesteuerelement und die aufrufende Klasse zu erhalten. Darüber hinaus muss das mathematische Eingabesteuerelement zum Behandeln von Ereignissen an die DispEventAdvise-Methode gesendet werden, die die CMathInputControlEventHandler-Beispielklasse erbt. Der folgende Code wird von der OnInitDialog-Methode in der Beispielklasse aufgerufen, um diese Aktionen auszuführen.
// includes for implementation
#include "micaut_i.c"
// include for event handler
#include "mathinputcontroleventhandler.h"
...
OnInitDialog{
...
// TODO: Add extra initialization here
CoInitialize(NULL);
HRESULT hr = g_spMIC.CoCreateInstance(CLSID_MathInputControl);
if (SUCCEEDED(hr)){
hr = CMathInputControlEventHandler<CMIC_TEST_EVENTSDlg>::Initialize(m_spMIC, this);
if (SUCCEEDED(hr)){
hr = CMathInputControlEventHandler<CMIC_TEST_EVENTSDlg>::DispEventAdvise(m_spMIC);
if (SUCCEEDED(hr)){
hr = m_spMIC->Show();
}
}
}
}
}
Hinweis
Der In diesem Beispiel CMIC_TEST_EventsDlg Vorlagentyp unterscheidet sich, es sei denn, Sie haben Ihre Klasse mit dem gleichen Namen wie im Beispiel bezeichnet.