プロが教える店舗&オフィスのセキュリティ対策術

どうしても、うまくいきません・・・
以下のプログラムで、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 ); // ウィンドウの破棄
}

A 回答 (3件)

> 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.h …
    • good
    • 0
この回答へのお礼

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

今回、このように記述してしまったのは、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

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



http://www6.airnet.ne.jp/miyakawa/project/prj1/v …

参考URL:http://www6.airnet.ne.jp/miyakawa/project/prj1/v …
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/10/16 10:06

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



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

capDriverConnect(Panel1->Handle, 0);
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/10/16 14:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!