MCI表示について – プログラミング – Home

通知
すべてクリア

MCI表示について


海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

MCIで1024×256の動画ファイルを再生できるようになりました。
そこでこの1024×256のウインドウをボタンを押下することで700×200に
変更することにしました。
それに伴い、1024×256で表示されていた動画の一部分だけを700×200のウインドウに
表示させるようにしたいのですが、なにかよい方法はあるのでしょうか?
縮小とかではなく一部分の抜出です。
一部分というのは(0,0)のポイントではなく(150,30)のポイントからウイントウサイズ
700×200に合わせる為に(850,230)までを抜き出すという感じです。

開発環境はWin XP Visual Studio2005 VC++ MFCです。


引用解決済
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

mciSendCommandを使用している場合は
MCI_PUTでMCI_DGV_PUT_SOURCEとMCI_DGV_PUT_DESTINATIONの範囲を
適切に設定してやれば一部分のみ表示ができます。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

subaruさん有難うございます。

>>mciSendCommandを使用している場合
MCIWndCreate()を使用しているのですが・・・


返信引用
かもねぎ
 かもねぎ
(@かもねぎ)
ゲスト
結合: 17年前
投稿: 61
 

アプリでメッセージ処理できるように整えてやれば良いのでは?


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

> MCIWndCreate()を使用しているのですが・・・
それならMCIウインドウのマクロ関数などを使う。

MCIWndGetSource()
MCIWndPutSource()
とか
MCIWndGetDest()
MCIWndPutDest()
など。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

金魚ちゃんさん
有難うございます。

>MCIWndGetSource()
>MCIWndPutSource()
>とか
>MCIWndGetDest()
>MCIWndPutDest()
を調べてみましたが、よいサンプルが見つかりませんでした。
具体的な使用方法などを提示していただけると幸いです。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

MCIWndGetSource()については若干HPに記載されていて、
MCIWndGetSource(hwnd,prc)ということは分かりました。
hwndにはMCIWndのハンドルでprcにはソース長方形のコーディネートを含むRECT構造への
ポインターをいれるということですが、
prc部にどうやって1024×256の動画ファイルの(150、30)のポインタから(850、230)まで
の一部分を指定してやればいいのか分かりません。
どなたか教えて下さい。

宜しくお願いいたします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>prc部にどうやって1024×256の動画ファイルの(150、30)のポインタから(850、230)まで
>の一部分を指定してやればいいのか分かりません。

RECT構造体の使い方がわからないのでしょうか?
MFC使用ということなのでCRect型の値でもいいですよ。

CRect rc(150, 30, 700, 200);
MCIWndPutSource(hwnd, rc);


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

MCIWndGetSource()とMCIWndPutSource()を使ってコーディングしてみました。

///////////////略//////////////////

MCIWndGetSource(hAVIWnd,&rect);
rect.OffsetRect(150,30);
MCIWndPutSource(hAVIWnd,rect);

//////////////略//////////////////

これでやると(150,30)?のポイントから元画像の一部分のみの表示は可能になったのです
が、元画像と比較すると拡大表示されてしまっているんです。
これを拡大とか無しで元画像1024×256の一部(700×200)を抜き出したいのですが、
どのようにしたらよいでしょうか?
もちろん1024×256から一部分抜き出した際には、ビューウインドウは700×200に変更
しています。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

subaruさん
有難うございます。

subaruさんが提示してくれました方法でもやってみたのですが、
同様に拡大表示されてしまいました。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>これでやると(150,30)?のポイントから元画像の一部分のみの表示は可能になったのです
>が、元画像と比較すると拡大表示されてしまっているんです。

画像が拡大されてしまうのは、実際に画像を表示する範囲が適切に
設定されていないからです。
MCIWndPutSourceで設定された元画像の範囲が
MCIWndPutDestで設定された範囲に表示されるわけです。
今回の場合は、MCIWndPutSourceで(150,30)-(850,230)の範囲を設定したあと
同様にMCIWndPutDest()で(0,0)-(700,200)の範囲を設定してあげてください。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

大変遅くなりましたが、
subaruさん
返信有難うございます。

>今回の場合は、MCIWndPutSourceで(150,30)-(850,230)の範囲を設定したあと
>同様にMCIWndPutDest()で(0,0)-(700,200)の範囲を設定してあげてください。

どのように範囲を設定すればよいのでしょうか?


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

CRect rect(150,30,850,210);
MCIWndPutSource(hAVIWnd,rect);
CRect size(0,0,700,200);
MCIWndPutSource(hAVIWnd,size);
で出来るようになったのですが、
ボタンをもう一度押下で、元の1024×256のサイズに戻したいのですが、
うまくいきません。

初期化みたいなことはできるでしょうか?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

どのようなコードを書いてどのように
うまくいかないのでしょうか?

一応実験してみました。

#include <windows.h>
#include <tchar.h>
#include <vfw.h>

#pragma comment(lib, vfw32.lib)

int wmain()
{
HWND hwnd = MCIWndCreate(NULL, GetModuleHandle(NULL), WS_VISIBLE,
LC:\\Users\\Public\\Videos\\Sample Videos\\bear.wmv);

//初期値を取得
RECT orgsrc;
MCIWndGetSource(hwnd, &orgsrc);
RECT orgdest;
MCIWndGetDest(hwnd, &orgdest);

//(100,100)-(400,400)の部分を再生
RECT rect = {100, 100, 400, 400};
MCIWndPutSource(hwnd, &rect);
OffsetRect(&rect, -100, -100);
MCIWndPutDest(hwnd, &rect);
MCIWndPlay(hwnd);
Sleep(5000);

//元に戻す
MCIWndPutSource(hwnd, &orgsrc);
MCIWndPutDest(hwnd, &orgdest);
Sleep(5000);

MCIWndStop(hwnd);
MCIWndClose(hwnd);
MCIWndDestroy(hwnd);
return 0;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました