Win32コンソールアプリケーションとして次のようなプロジェクトを作成しました。
ビデオキャプチャアプリケーションのサンプル抜粋です。これをビルドしたところ、エ
ラーもなく実行できました。
しかし、このアプリケーションをC++のFormViewで作成したい場合、どうすればよいの
でしょうか?
ボタンのクリックイベントで、キャプチャ開始にしたいのですが・・・
プログラム初心者の為、その移行の仕方がわかりません。アドバイスをいただけない
でしょうか?
*******************************************************************
#include stdafx.h
#include <dshow.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
CoInitialize(NULL);
// 空のフィルタ グラフとキャプチャ グラフ ビルダを作成
IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuilder = NULL;
// フィルタ グラフを作成する
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **)&pGraph);
// キャプチャ グラフ ビルダを作成する。
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuilder);
pBuilder->SetFiltergraph(pGraph);
// システムデバイス列挙子を作成
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
// ビデオ キャプチャ デバイスの列挙子を作成する。
IEnumMoniker *pClassEnum = NULL;
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum,
0);
ULONG cFetched;
IMoniker *pMoniker = NULL;
IBaseFilter *pSrc = NULL;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
// 最初のモニカをフィルタ オブジェクトにバインドする。
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release();
pDevEnum->Release();
// pSrc は、前のコードのキャプチャ フィルタである
pGraph->AddFilter(pSrc, LVideo Capture);
// ファイルライタフィルタの設定
IBaseFilter *ppf = NULL;
IFileSinkFilter *pSink = NULL;
// ディスプレイへ (ビデオ プレビュー ストリームをレンダリング)
pBuilder->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
pSrc,
NULL, // 圧縮フィルタなし
NULL // デフォルトのレンダラ
);
// キャプチャ開始 (キャプチャ グラフの制御)
IMediaControl *pControl;
REFERENCE_TIME rtStart = 20000000,
rtStop = 50000000;
pBuilder->ControlStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
pSrc, // ソース フィルタ
&rtStart, // 開始タイム
&rtStop, // 終了タイム
0, // 開始クッキー
0 // 停止クッキー
);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pControl->Run();
MessageBox(NULL, stop?, DirectShow, MB_OK);
// 6. 終了
pSrc->Release();
ppf->Release();
pSink->Release();
pControl->Release();
//pEvent->Release();
pBuilder->Release();
pGraph->Release();
CoUninitialize();
cout << end\n;
return 0;
}
*******************************************************************
長々と申し訳ありません。
>プログラム初心者の為、その移行の仕方がわかりません。
「初心者です」といわれても、初心者にも結構幅があるものであなたがどのくらい解って
いる初心者なのかがわかりません。もう少し、「ココまで試したけど、こういうエラーが
出て躓いている。自分の予想ではこうなるはずなのに...」というように質問してもらえ
るといいと思います。
で、質問の主旨から「意外に解ってる初心者」と解釈させてもらって、
main()の中ではargc, argvは実際には使っていないようなので、この関数のインター
フェースだけ変更して丸ごとボタンのコールバック関数にしちゃっていいんじゃないで
しょうか。
すみません。
初心者といっても、Win32コンソールアプリケーションとMFCアプリケーションは全く
別々のもの、としか考えられていないような超初心者です。
プログラムは参考書のサンプルやネットのサンプルを動かしてみよう、程度なので
す。今回は、コンソールアプリケーションで書かれたプログラムをどうやって、MFCにも
っていくのか、全くもってわからないため、質問させて頂きました。
他にも、移行して自分なりにアレンジしてみたいプログラムはあるのですが、ほとん
どコンソールアプリケーションなんです。メンバ関数についても、やっと解ってきたく
らいの人間にわかるよう、アドバイス頂けないでしょうか?
>初心者といっても、Win32コンソールアプリケーションとMFCアプリケーションは全く
>別々のもの、としか考えられていないような超初心者です。
>移行して自分なりにアレンジしてみたいプログラムはあるのですが...
やりたいことはMFCアプリケーションを作成したいってことですよね?
中途半端に楽しようとせずにMFCの勉強をすることをお勧めします.
すみませんm(__)m
今は参考書片手にやっております。
ある程度まで理解できるようになりましたら、相手をしてやってください。