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です。
mciSendCommandを使用している場合は
MCI_PUTでMCI_DGV_PUT_SOURCEとMCI_DGV_PUT_DESTINATIONの範囲を
適切に設定してやれば一部分のみ表示ができます。
subaruさん有難うございます。
>>mciSendCommandを使用している場合
MCIWndCreate()を使用しているのですが・・・
アプリでメッセージ処理できるように整えてやれば良いのでは?
> MCIWndCreate()を使用しているのですが・・・
それならMCIウインドウのマクロ関数などを使う。
MCIWndGetSource()
MCIWndPutSource()
とか
MCIWndGetDest()
MCIWndPutDest()
など。
金魚ちゃんさん
有難うございます。
>MCIWndGetSource()
>MCIWndPutSource()
>とか
>MCIWndGetDest()
>MCIWndPutDest()
を調べてみましたが、よいサンプルが見つかりませんでした。
具体的な使用方法などを提示していただけると幸いです。
MCIWndGetSource()については若干HPに記載されていて、
MCIWndGetSource(hwnd,prc)ということは分かりました。
hwndにはMCIWndのハンドルでprcにはソース長方形のコーディネートを含むRECT構造への
ポインターをいれるということですが、
prc部にどうやって1024×256の動画ファイルの(150、30)のポインタから(850、230)まで
の一部分を指定してやればいいのか分かりません。
どなたか教えて下さい。
宜しくお願いいたします。
>prc部にどうやって1024×256の動画ファイルの(150、30)のポインタから(850、230)まで
>の一部分を指定してやればいいのか分かりません。
RECT構造体の使い方がわからないのでしょうか?
MFC使用ということなのでCRect型の値でもいいですよ。
CRect rc(150, 30, 700, 200);
MCIWndPutSource(hwnd, rc);
MCIWndGetSource()とMCIWndPutSource()を使ってコーディングしてみました。
///////////////略//////////////////
MCIWndGetSource(hAVIWnd,&rect);
rect.OffsetRect(150,30);
MCIWndPutSource(hAVIWnd,rect);
//////////////略//////////////////
これでやると(150,30)?のポイントから元画像の一部分のみの表示は可能になったのです
が、元画像と比較すると拡大表示されてしまっているんです。
これを拡大とか無しで元画像1024×256の一部(700×200)を抜き出したいのですが、
どのようにしたらよいでしょうか?
もちろん1024×256から一部分抜き出した際には、ビューウインドウは700×200に変更
しています。
subaruさん
有難うございます。
subaruさんが提示してくれました方法でもやってみたのですが、
同様に拡大表示されてしまいました。
>これでやると(150,30)?のポイントから元画像の一部分のみの表示は可能になったのです
>が、元画像と比較すると拡大表示されてしまっているんです。
画像が拡大されてしまうのは、実際に画像を表示する範囲が適切に
設定されていないからです。
MCIWndPutSourceで設定された元画像の範囲が
MCIWndPutDestで設定された範囲に表示されるわけです。
今回の場合は、MCIWndPutSourceで(150,30)-(850,230)の範囲を設定したあと
同様にMCIWndPutDest()で(0,0)-(700,200)の範囲を設定してあげてください。
大変遅くなりましたが、
subaruさん
返信有難うございます。
>今回の場合は、MCIWndPutSourceで(150,30)-(850,230)の範囲を設定したあと
>同様にMCIWndPutDest()で(0,0)-(700,200)の範囲を設定してあげてください。
どのように範囲を設定すればよいのでしょうか?
CRect rect(150,30,850,210);
MCIWndPutSource(hAVIWnd,rect);
CRect size(0,0,700,200);
MCIWndPutSource(hAVIWnd,size);
で出来るようになったのですが、
ボタンをもう一度押下で、元の1024×256のサイズに戻したいのですが、
うまくいきません。
初期化みたいなことはできるでしょうか?
どのようなコードを書いてどのように
うまくいかないのでしょうか?
一応実験してみました。
#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;
}