MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Библиотека проверки правописания"
Answer 898091
В Windows есть встроенный API для проверки правописания, но он появился только в Windows 8. RichEdit именно его и использует.
Пример:
#include <stdio.h> #include <stdlib.h> #include <exception> #include <locale.h> #include <iostream> #include <string> #include <windows.h> #include <wrl.h> #include <Spellcheck.h> //кидает исключение, если HRESULT является ошибкой inline void HR(HRESULT const result) { if (S_OK != result) { wprintf(L"Error HRESULT 0x%x!!!\n", (UINT)result); throw std::exception(); } } //выполняет проверку орфографии в тексте и возвращает число ошибок int SpellCheck(LPCWSTR text) { Microsoft::WRL::ComPtr<ISpellCheckerFactory> factory; HR(CoCreateInstance(__uuidof(SpellCheckerFactory), nullptr, CLSCTX_INPROC_SERVER, __uuidof(factory), reinterpret_cast<void **>(factory.GetAddressOf()))); BOOL supported = FALSE; HR(factory->IsSupported(L"ru-RU", &supported)); if (supported == FALSE) { printf("Fatal error: Russian language not supported!\n"); throw std::exception(); } Microsoft::WRL::ComPtr<ISpellChecker> checker; HR(factory->CreateSpellChecker(L"ru-RU", checker.GetAddressOf())); int n_errors = 0; Microsoft::WRL::ComPtr<IEnumSpellingError> errors; HR(checker->Check(text, errors.GetAddressOf())); for (;;) { Microsoft::WRL::ComPtr<ISpellingError> error; if (S_OK != errors->Next(error.GetAddressOf())) { break; } n_errors++; ULONG startIndex; HR(error->get_StartIndex(&startIndex)); ULONG length; HR(error->get_Length(&length)); std::wstring word(text + startIndex, text + startIndex + length); std::wcout << L"Ошибка в слове: " << word << std::endl; CORRECTIVE_ACTION action; HR(error->get_CorrectiveAction(&action)); if (action == CORRECTIVE_ACTION_GET_SUGGESTIONS) { std::wcout << L" (Варианты исправления: "; Microsoft::WRL::ComPtr<IEnumString> suggestions; HR(checker->Suggest(word.c_str(), suggestions.GetAddressOf())); for (;;) { wchar_t * suggestion; if (S_OK != suggestions->Next(1, &suggestion, nullptr)) { break; } // Add the suggestion to a list for presentation std::wcout << suggestion << L" "; CoTaskMemFree(suggestion); } std::wcout << L")" << std::endl; } std::wcout << std::endl; } return n_errors; } int main(int argc, char **argv) { setlocale(LC_ALL, "Russian"); HR(CoInitializeEx(nullptr, COINIT_MULTITHREADED)); auto text = L"Превед, медвед!"; std::wcout << text << std::endl; std::wcout << L"*********************************" << std::endl; auto res = SpellCheck(text); std::wcout << L"*********************************" << std::endl; std::wcout << L"Всего ошибок: " << res<< std::endl; getchar(); return 0; } /* Вывод программы: Превед, медвед! ********************************* Ошибка в слове: Превед (Варианты исправления: Привод Провод Приведи Приведу Приведя Правде Привад Проведи Проведу Проведя ) Ошибка в слове: медвед (Варианты исправления: медведе медведи медведь медведю медведя медведей медведем медведка медведке медведки ) ********************************* Всего ошибок: 2 */
Источник: Using the C++ Spell Checking API
В C++/CLI можно задействовать средства проверки правописания из WPF, как описано здесь.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.