3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MFCでもWinRTその2. MFCアプリからWinRT APIの利用(ダイアログからOCRの利用)

Last updated at Posted at 2022-01-10

#1. 今回やること
・MessageDialogを表示できるようになったので、その他のWinRT APIの使い方をやります。
・コントロールを表示させないのでダイアログベースのMFCアプリからWinRTのOCR機能を利用するアプリケーションを作成します。
・OCRについて詳しいことは以前やったこちらを参照してください。
・MSのC++/WinRT の使用を開始するを前回のその1に追加して、その他のAPIも使えるようにしていきます。(OCR機能だけならヘッダをインクルードするだけでも利用可能なのですが、それは内緒にしておいてください)。

・以下のことをさらに追加して行きます
 ①WindowsApp.libのリンクと必要なヘッダのインクルード
 ②winrt::init_apartmentによるWinRTの初期化
 ③コードの追加

#2. プロジェクトの作成
・前回と同じようにMFCアプリのダイアログベースでプロジェクトを作成します。名前は「MFCWinRTOCR」で。
・C++言語標準を「ISO C++17」へ変更し、コマンドラインへ「/await」を追加します。
・pch.hで「TRY」と「GetCurrentTime」を#undefします。ここまでは前回と同じですね。

#3. WindowsApp.libのリンクと必要なヘッダのインクルード
・pch.hへ#pragma comment(lib, "windowsapp")を追加してwindowsapp.libへのリンクを追加します。
・さらに必要なヘッダを#includeします。どんなヘッダが必要かは前回OCRを利用したときを参照してください。
・というわけでpch.hは以下のようになります。

pch.h(変更後)

#ifndef PCH_H
#define PCH_H

// プリコンパイルするヘッダーをここに追加します
#include "framework.h"

#undef GetCurrentTime
#undef TRY

#pragma comment(lib, "windowsapp")

#include <winrt/base.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.UI.Popups.h>

#include <hstring.h>

#include <winrt/Windows.Storage.Pickers.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Media.Ocr.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Storage.h>

#endif //PCH_H

#4. ②winrt::init_apartmentによるWinRTの初期化
・MFCWinRTOCR.cppを開いて、InitInstance()へwinrt::init_apartment(winrt::apartment_type::single_threaded);を追加します。
1.png
・ここまで来たらあとはコードを追加するだけです。

#5. コードの追加
・Buttonを一個追加して、イベントハンドラも追加します。
・前回と同じように、IAsyncAction型のButton1Async()を作成し、イベントハンドラから呼び出すようにします。
・ファイルピッカーでファイルを選択して、ファイルを開いて、OCR機能を使用して、ダイアログへ保存する、と言う感じにしてみたのでMFCWinRTOCR.Dlg.cppは以下のように変更しています。

MFCWinRTOCR.Dlg.cpp(変更後)

//前略
void CMFCWinRTOCRDlg::OnBnClickedButton1()
{
	Button1Async();
}

winrt::Windows::Foundation::IAsyncAction CMFCWinRTOCRDlg::Button1Async()
{

	//ファイルピッカーでファイルを選んで
	auto picker = winrt::Windows::Storage::Pickers::FileOpenPicker();
	picker.as<IInitializeWithWindow>()->Initialize(this->m_hWnd);
	picker.FileTypeFilter().Append(L".jpg");
	picker.FileTypeFilter().Append(L".png");
	auto picfile = co_await picker.PickSingleFileAsync();

	//ファイルを開いて
	auto picstream = co_await picfile.OpenAsync(winrt::Windows::Storage::FileAccessMode::Read);
	auto picdecoder = co_await winrt::Windows::Graphics::Imaging::BitmapDecoder::CreateAsync(picstream);
	auto showpic = co_await picdecoder.GetSoftwareBitmapAsync(winrt::Windows::Graphics::Imaging::BitmapPixelFormat::Bgra8, winrt::Windows::Graphics::Imaging::BitmapAlphaMode::Premultiplied);

	//OCR機能を使用する。
	winrt::Windows::Media::Ocr::OcrEngine ocr = nullptr;
	ocr = winrt::Windows::Media::Ocr::OcrEngine::TryCreateFromUserProfileLanguages();
	auto result = co_await ocr.RecognizeAsync(showpic);

	//結果の表示
	winrt::hstring restext = result.Text();
	auto msgdlg = winrt::Windows::UI::Popups::MessageDialog(L"Result");
	msgdlg.as<IInitializeWithWindow>()->Initialize(this->m_hWnd);
	msgdlg.Content(restext);
	auto dlgres = co_await msgdlg.ShowAsync();
}

・こんな画像を読み込んで、こんな結果でした。
2.png
3.png

githubはこちら

さて、これでWinRTの機能をMFCアプリから使用できるようになりました。
今回はOCR機能だけですが、その他の機能も利用可能なはずです。
しかし、コントロールの表示ができていない・・・

というわけで、次こそは本当にボタンを表示させます。

目次

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?