1

我使用浏览器:

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser.Document;
IHTMLTxtRange range = (IHTMLTxtRange)doc.selection.createRange();
...
if(range.execCommand("StrikeThrough", false, null))
{
    //Is range strikethroughed or not?
}

我如何检测是否选择删除线(在代码中)?

4

3 回答 3

0

不久前,我在 c++ 中开发了一个基于 mshtml 的编辑器,我做了类似以下代码的操作来获取当前选择的文本样式。

CComQIPtr<IOleCommandTarget> spCmdTarg(pDispDoc);

if (pStyle && spCmdTarg)
{
    const ULONG uNumCmnds = 4;
    OLECMD arrCmnds[uNumCmnds];
    arrCmnds[0].cmdID = IDM_BOLD;
    arrCmnds[1].cmdID = IDM_ITALIC;
    arrCmnds[2].cmdID = IDM_UNDERLINE;
    arrCmnds[3].cmdID = IDM_STRIKETHROUGH;

    if ( SUCCEEDED(spCmdTarg->QueryStatus(&CGID_MSHTML, uNumCmnds, arrCmnds, NULL)) )
    {
        pStyle->SetBold(arrCmnds[0].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
        pStyle->SetItalic(arrCmnds[1].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
        pStyle->SetUnderline(arrCmnds[2].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
        pStyle->SetStrikeThrough(arrCmnds[3].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
    }
}

我不太确定如何在 c# 中翻译此代码以及 mshtml 的 interlop 层上可用的内容,但希望这可以帮助您从某个地方开始。

于 2010-11-16T22:55:43.827 回答
0

如果命令成功,则 execCommand 返回 true。所以你可以尝试:

if (range.execCommand("StrikeThrough", false, null))
{
    // Strikethrough succeeded
}

要确定选择是否已经是 StrikeThrough,您可以查看文本范围对象的 parentElement 属性,看看它是否是一个罢工元素。

于 2010-11-17T05:00:21.140 回答
0

我知道已经 3 年了,但我认为对于任何搜索的人来说:

尝试使用

bool struckthrough = doc.queryCommandState("StrikeThrough");

如果当前选择具有该标记,则返回true/ 。false您正在创建一个范围对象 - 您可以range.select()将其设置为要由查询状态检查的范围。

于 2013-04-16T14:56:36.133 回答