⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umain.cpp

📁 这篇文档是讲如何利用IFELanguage接口实现对中文语句的分隔
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 特别感谢Zswang(伴水)的友情推荐
// IMEEngine类原出处:http://www.mihai-nita.net/article.php?artID=20051215a
// ccrun(老妖)略作修改并在BCB6中调试通过
//---------------------------------------------------------------------------
#include "msime.h"
#include "IMEEngine.h"

void __fastcall TfrmMain::btnTestClick(TObject *Sender)
{
    WideString wstrInput(edtInput->Text);

    IMEEngine imee;
    imee.GetJMorphResult(FELANG_REQ_REV,
            FELANG_CMODE_PINYIN
            | FELANG_CMODE_NOINVISIBLECHAR, // 紧凑演示拼音,中间不显示空格分隔符
            wstrInput.c_bstr());
    if(imee.m_pmorrslt)
    {
        WideString wstrOutput, wstrWord, wstrPinYin;

        wstrOutput = WideString(imee.m_pmorrslt->pwchOutput);
        wstrOutput = wstrOutput.SubString(1, imee.m_pmorrslt->cchOutput);

        mmoOutput->Lines->Clear();
        // 输出整句的单字拼音
        mmoOutput->Lines->Add(wstrOutput);

        // 将句子分隔成词语的数量
        mmoOutput->Lines->Add(String().sprintf("分隔为 %d 段", imee.m_pmorrslt->cWDD));
        mmoOutput->Lines->Add("----------");

        // 将句子分隔成词语并单独加配拼音
		for(int i = 0; i < imee.m_pmorrslt->cWDD; i++)
        {
            // 读取每段的词语或字
            wstrWord = wstrInput.SubString(
                    imee.m_pmorrslt->pWDD[i].wReadPos + 1,
                    imee.m_pmorrslt->pWDD[i].cchRead);
            // 读取每段的拼音
            wstrPinYin = wstrOutput.SubString(
                    imee.m_pmorrslt->pWDD[i].wDispPos + 1,
                    imee.m_pmorrslt->pWDD[i].cchDisp);
            //
            if(wstrPinYin.Length() > 0)
                wstrWord = wstrWord + "(" + wstrPinYin + ")";
            //
            mmoOutput->Lines->Add(wstrWord);
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lblWebClick(TObject *Sender)
{
    ShellExecute(NULL, "Open", lblWeb->Caption.c_str(), NULL, NULL, SW_SHOW);    
}
//---------------------------------------------------------------------------

/*
以下代码为ccrun(老妖)写的简单实现代码

#include <ole2.h>

//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
    : TForm(Owner)
{
    OleInitialize(NULL);
}
//---------------------------------------------------------------------------
#include "msime.h"

void __fastcall TForm4::Button1Click(TObject *Sender)
{
    static const IID IID_IFELanguage =
    {
        0x019f7152, 0xe6db, 0x11d0,
        { 0x83, 0xc3, 0x00, 0xc0, 0x4f, 0xdd, 0xb8, 0x2e }
    };

    // 简体中文
    LPCWSTR msime = L"MSIME.China";
    CLSID    clsid;
    if(CLSIDFromString(const_cast<LPWSTR>(msime), &clsid) != S_OK)
        return;

    //
    IFELanguage *pIFELanguage;
    if(CoCreateInstance(clsid, NULL, CLSCTX_SERVER,
            IID_IFELanguage, (LPVOID*)&pIFELanguage) != S_OK)
        return;

    if(!pIFELanguage)
        return;

    if(pIFELanguage->Open() != S_OK)
    {
        pIFELanguage->Release();
        return;
    }

    DWORD dwCaps;
    if(pIFELanguage->GetConversionModeCaps(&dwCaps) != S_OK)
    {
        pIFELanguage->Close();
        pIFELanguage->Release();
    }

    // 要解析的中文句子
    WideString wstrInput = WideString("汉字加拼音演示 妖哥万岁");

    MORRSLT    *pmorrslt;
    if(pIFELanguage->GetJMorphResult(
            FELANG_REQ_REV,
            FELANG_CMODE_PINYIN |
            FELANG_CMODE_NOINVISIBLECHAR,
            wstrInput.Length(), wstrInput, NULL, &pmorrslt) != S_OK)
    {
        pIFELanguage->Close();
        pIFELanguage->Release();
    }
    if(!pmorrslt)
    {
        pIFELanguage->Close();
        pIFELanguage->Release();
    }

    WideString wstrOutput, wstrWord, wstrPinYin;
    wstrOutput = WideString(pmorrslt->pwchOutput);
    wstrOutput = wstrOutput.SubString(1, pmorrslt->cchOutput);

    // 将句子分隔成词语并单独加配拼音
    for(int i = 0; i < pmorrslt->cWDD; i++)
    {
        // 读取每段的词语或字
        wstrWord = wstrInput.SubString(
                pmorrslt->pWDD[i].wReadPos + 1,
                pmorrslt->pWDD[i].cchRead);
        // 读取每段的拼音
        wstrPinYin = wstrOutput.SubString(
                pmorrslt->pWDD[i].wDispPos + 1,
                pmorrslt->pWDD[i].cchDisp);
        //
        if(wstrPinYin.Length() > 0)
            wstrWord = wstrWord + "(" + wstrPinYin + ")";
        // 输出结果
        Memo1->Lines->Add(wstrWord);
    }

    CoTaskMemFree(pmorrslt);
    pIFELanguage->Close();
    pIFELanguage->Release();
}

//---------------------------------------------------------------------------
void __fastcall TForm4::FormClose(TObject *Sender, TCloseAction &Action)
{
    CoUninitialize();
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -