首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何接受MathML?

我如何接受MathML?
EN

Stack Overflow用户
提问于 2012-02-20 16:45:42
回答 3查看 1.3K关注 0票数 4

我今天发现,Windows 7附带了一个非常令人印象深刻的MathPanel实用程序,用于对方程式进行手写识别:

这很好。(在这里,我输入了sRGB颜色空间伽马变换的部分公式)

但现在我似乎不能用它做任何事。

有一个插入按钮。我假设单击插入会将其插入到其后面活动的应用程序中(就像屏幕上的键盘工作一样):

不过,我想它会像粘贴操作一样运行。

我在帮助中找不到任何信息,说明应用程序需要什么才能使其工作。没有提到任何特殊的API,有些软件必须支持。

我也无法在MSDN上找到任何关于接受插入等式所需的特殊API的信息。

为了接收MathPanel输入,我需要实现哪些API、注册、回调、侦听器、消息、COM对象?

我提到MathML的唯一原因是因为对SuperUser提到MathML的回答

理论上,任何支持MathML (数学标记语言)的应用程序都可以与Windows7Math输入面板一起使用。数学输入面板只对支持MathML的程序使用。下面是一些这样的应用: StarOffice、OpenOffice、Opera和Maple。

那么,如何使我的程序支持MathML呢?

据我所知,MathML是一种标记语言,而不是Windows。这就像在说,“如何使我的程序支持HTML?”Html是文本,你可以把它粘贴到任何地方。

MathPad拒绝粘贴,除非我“支持”MathML?

更新

在单击IDataObject Insert之后,检查剪贴板上的,可以看到两种可用的格式(这两种格式都不是文本,这解释了为什么我没有得到任何标记):

格式1:

代码语言:javascript
复制
     CLIPFORMAT cfFormat: "MathML Presentation" (49839)
PDVTargetDevice ptd:      0x00000000
          DWORD dwAspect: DVASPECT_CONTENT
          DWORD lindex:   -1
          DWORD tymed:    1  (TYMED_HGLOBAL)

格式2:

代码语言:javascript
复制
     CLIPFORMAT cfFormat:"MathML" (49838)
PDVTargetDevice ptd:      0x00000000
          DWORD dwAspect: DVASPECT_CONTENT
          DWORD lindex:   -1
          DWORD tymed:    1  (TYMED_HGLOBAL)

因此,至少现在我有了一些剪贴板格式:

  • "MathML演示“
  • "MathML“

我仍然无法在MSDN上找到任何关于剪贴板格式的内容。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-20 20:36:17

监视发送到我窗口的消息,看起来像Math Input Panel应用程序发送了一个Ctrl+V

  • WM_KEYDOWN (0x11) VK_CONTROL
  • WM_KEYDOWN (0x56) V密钥
  • WM_CHAR (0x16)
  • WM_KEYUP (0x11) VK_CONTROL
  • WM_KEYUP (0x56) V密钥

所以你需要认识到有人试图点击Ctrl+V,然后你必须提取内容。

首先注册三种剪贴板格式:

代码语言:javascript
复制
Handle CF_MathML_Presentation = RegisterClipboardFormat("MathML Presentation");
Handle CF_MathML_Content = RegisterClipboardFormat("MathML Content");
Handle CF_MathML = RegisterClipboardFormat("MathML");

注释: W3C数学标记语言(MathML) 3.0版附录B文档要注册的剪贴板格式名称:

  • 泛型MathML窗口剪贴板名称:MathML
  • Presentation Windows剪贴板名称:MathML Presentation
  • Content MathML Windows剪贴板名称:MathML Content

然后在剪贴板中获取IDataObject的句柄:

代码语言:javascript
复制
IDataObject dataObject;
OleGetClipboard(dataObject);

然后枚举所有格式,查找您喜欢的格式:

代码语言:javascript
复制
IEnumFORMATETC enum;
dataObject.EnumFormatEtc(DATADIR_GET, out enum);

String mathXml = "";

foreach (FormatEtc format in enum)
{
    if (format.cfFormat = CF_MathML_Presentation) ||
       (format.cfFormat = CF_MathML_Content) ||
       (format.cfFormat = CF_MathML)
    {
        //We know how to handle these formats:
        STGMEDIUM medium;
        dataObject.GetData(format.cfFormat, out medium);

        mathXml = GetStringFromStorageMedium(medium); //handles all the nasty HGlobal/IStream/IStorage nonsense
    }
}

ShowMessage(mathXml); //tada!

微软还允许您使用编写数学输入COM对象的程序

代码语言:javascript
复制
//Create the COM object
IMathInputControl mathInputControl = CreateComObject(CLSID_MathInputControl);
mathInputControl.Show();

然后,可以创建一个接收通知事件的对象:

代码语言:javascript
复制
class MathEvents : _IMathInputControlEvents
{
    public HRESULT Insert(String mathXml)
    {
       //Notifies the event handler when the Insert button is clicked.
       MessageBox.Show(mathXml);
       return S_OK;
    }

    public HRESULT Clear()
    {
       //Notifies the event handler when the Clear button is clicked.      
       return S_OK;
    }

    public HRESULT Close()
    {
       //Notifies the event handler when the Close button is clicked.
       return S_OK;
    }

    public HRESULT PaintHRESULT Paint(LONG_PTR hdc, LONG Left, LONG Top, LONG Right, LONG Bottom, LONG Element, LONG State)
    {
       //Notifies the event handler when the buttons and background of the control require painting.
       return S_OK;           
    }

缺少的要素是如何为mathInputControl提供对回调对象的引用。

这是超机密的复杂COM代码,涉及ConnectionPointContainer, andAdvise` `,哪一个不能从C#中完成。

但是你不需要这样做,你可以直接使用Ctrl+V

票数 3
EN

Stack Overflow用户

发布于 2012-02-21 20:55:16

我认为它被正式称为“数学输入面板”(MIP)。MathType产品支持它,并提供一个菜单项来运行它。正如其他回复中提到的,单击MIP的插入按钮将向其下方的窗口发送一个Ctrl。如果该窗口支持该键盘快捷方式并处理MathML,那么它将工作。

虽然MathML剪贴板格式是在粘贴上处理MathML输入的推荐方法,但如果您在应用程序中实现MathML支持,则还应该接受以CF_UNICODETEXT形式提供的MathML文本。有些应用程序支持将MathML复制到剪贴板上,但似乎不知道MathML剪贴板的格式。当然,您的粘贴代码必须嗅探文本以识别MathML,而不是常规的非MathML文本。你也应该考虑接受拖放和粘贴。

Math输入控件是MIP的一个相关但略有不同的配置。如果我没记错的话,它缺乏MIP的历史和其他一些特征。我们开始为MathType使用它,并很快意识到它没有好处。您应该忽略它,只需支持MathML的粘贴和拖放。添加一个数学输入面板菜单项,如果这对你的应用是有意义的。

票数 1
EN

Stack Overflow用户

发布于 2012-12-29 16:34:02

剪贴板格式"MathML表示“实际上包含文本;在使用Windows ()之前,我已经尝试过了。

此外,如果将MathML片段复制到剪贴板上为纯文本(例如,CF_TEXT),然后将其粘贴到Word文档中,您也将得到纯文本,即Word不会将其解释为表示MathML。

要做到这一点,您必须同时将其复制为CF_TEXT和"MathML演示文稿“。要获得后者的ID,请尝试将"MathML表示“注册为Ian建议的剪贴板格式。Windows将返回其剪贴板格式ID;将此ID与SetClipboardData()一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9364890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档