こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ビデオキャプチャ

どうしても、うまくいきません・・・
以下のプログラムで、BorlandC++ Builder6.0のpanel1にカメラから取得した映像をストリーム再生したいのですが・・・。
コンパイルエラーとして、->か->*の左には構造体のポインタが必要、と出ます。
どうやったらこのエラーを解決し、ストリーム再生できるようになるでしょうか?
アドバイスお願いします!!!

#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include <vfw.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND hwnd;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// キャプチャドライバに接続
SendMessage(hwnd,WM_CAP_DRIVER_CONNECT,0,0L);

CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(hwnd, &CapDrvCaps, sizeof (CAPDRIVERCAPS));

if (CapDrvCaps.fHasOverlay)
capOverlay( hwnd->Panel1, TRUE ); //オーバーレイモードで動作
//ShowWindowAsync( hWndCap, SW_SHOW );

capDriverDisconnect( hwnd ); // ドライバの解放
//::DestroyWindow( hwnd ); // ウィンドウの破棄
}

投稿日時 - 2002-10-15 16:17:01

QNo.381354

すぐに回答ほしいです

質問者が選んだベストアンサー

> capOverlay( hwnd->Panel1, TRUE ); // オーバーレイモードで動作

の第一引数に hwnd->Panel1 が渡されているからじゃないでしょうか?
capOverlay マクロの第一引数はキャプチャウィンドウのハンドル hwnd を渡さないといけないんじゃ、、、?

それと、ソース見る限りじゃ、hwnd の実体はどこにあるんでしょう?

> HWND hwnd;

のウィンドウハンドル変数にキャプチャウィンドウのハンドルが入っていないように思えるんですが、ひょっとして

> __fastcall TForm1::TForm1(TComponent* Owner)
> : TForm(Owner)
> {

が呼び出されると自動的に hwnd にキャプチャウィンドウのハンドルが入るのですか?

もしそうでないんなら参照URLのソースにあるように、

> hWndCap = capCreateCaptureWindow(
> "Captrue Window", //キャプチャウィンドウの名前
> WS_OVERLAPPEDWINDOW, //ウィンドウスタイル このパラメータについてはここを見てください。
> 0, 0, //表示位置
> 320, 240, //ウィンドウサイズ
> NULL, //親のハンドル NULL:親なしのウィンドウ
> NULL); //よくわかりません

のようにしてキャプチャウィンドウを作ってそのハンドルをそれぞれのマクロなり関数なりに代入してやるか、別のファイルなりで作ったキャプチャウィンドウがあるならそのキャプチャウィンドウのハンドルをグローバル変数を通して持ってくるなり、キャプチャウィンドウのハンドルを取得する関数とかを調べてみてください。

参考URL:http://laputa.cs.shinshu-u.ac.jp/~gtakano/prog.html

投稿日時 - 2002-10-15 17:11:25

お礼

ご回答、何度目になるか・・・本当にありがとうございます。あまりにも、理解できていないのに、要望だけは達者で申し訳ありません。

今回、このように記述してしまったのは、Panel1をキャプチャウィンドウとしたい、と考えた為、
> hWndCap = capCreateCaptureWindow(
と書いて、キャプチャウィンドウを作るは必要ないだろう、としてしまいました。
hwndの実体とは、、、キャプチャウィンドウの構造体のことでしょうか・・・?
勘違いでしたら、すみません・・・。
キャプチャウィンドウはPanel1にしたいのですが、どのようにして記述すればよいのでしょうか?

> HWND hwnd;

と書いたのは、HogePiyoさんが参考に、と添付してくださったサイトに”よくわからない場合は、#include文の下あたりに、HWND hWndCap;の1行を追加してください”とあったから書いただけなのです。

> __fastcall TForm1::TForm1(TComponent* Owner)
> : TForm(Owner)
> {

が呼び出されると、自動的にPanel1がキャプチャウィンドウとして機能するためには、hwndの実体を記述する際に書き込めばよいのでしょうか?

ただ、
> hWndCap = capCreateCaptureWindow(
> "Captrue Window", // キャプチャウィンドウの名前
> WS_OVERLAPPEDWINDOW, // ウィンドウスタイル このパラメータについてはここを見てください。
> 0, 0, // 表示位置
> 320, 240, // ウィンドウサイズ
> NULL, // 親のハンドル NULL:親なしのウィンドウ
> NULL); // よくわかりません

このように記述した場合、実行画面でFormの真ん中にキャプチャウィンドウがきませんでした。 それは、

> 0, 0, // 表示位置

としてあるこの数字0,0,を書き換えると真ん中に表示できるでしょうか?
これは明日の朝、学校で確かめてみますね。確認不足で申し訳ございません。

無理やりPanel1をキャプチャウィンドウに・・・と私が考えているのは、どうしても、ポインタ・構造体、これらのものが頭の中でビジュアル的組み立てて見ることができないからだと思うのです。
初めてプログラミングをする上で、こんなにも大変だとは思っていませんでした。
HogePiyoさんには、何度も何度もアドバイスを頂いており、大変申し訳なく、ありがたいと思っております。
私も頑張って、成功をお伝えできるよう努力いたしますので、どうかよろしくお願いします。

投稿日時 - 2002-10-16 00:57:41

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

↓いろいろ探してみたらいいサイトが見つかりました。

http://www6.airnet.ne.jp/miyakawa/project/prj1/video.htm

参考URL:http://www6.airnet.ne.jp/miyakawa/project/prj1/video.htm

投稿日時 - 2002-10-16 02:54:38

お礼

参考サイトを見てびっくりしました!!!
早速、やってみます。
本当にありがとうございます!!!

投稿日時 - 2002-10-16 10:06:54

ANo.2

一般的な SDK でウィンドウハンドルを必要とする部分に、C++Builderのウィンドウを使用する場合は、Handle プロパティを使用します。

例えば、こんな感じです。

capDriverConnect(Panel1->Handle, 0);

投稿日時 - 2002-10-16 02:48:33

お礼

ありがとうございます!!
Hogepiyoさんの参考サイトとinthefloiさんのヒントでなんとか頑張っていきたいと思います!!
しかし、サイトのコードを丸写ししても、はじめの画面の1コマだけが静止画?(フリーズとも言うような気がしますが)として表示されるだけで、連続してオーバーレイできていない気がします。
OSにXPを使用しているからでしょうか?

投稿日時 - 2002-10-16 14:26:12

あなたにオススメの質問