Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/04/12 (水)

こーぞーたいを学ぶよ!

| 20:52 | こーぞーたいを学ぶよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - こーぞーたいを学ぶよ! - 雪乃☆雫のなでしこ日和 こーぞーたいを学ぶよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 こーぞーたいだのぽいんたあだのって・・・なんかソレ系は、非常に敷居が高い気がして、なるべく避けて通るようにしていた命題なんですが・・・

 なんでいきなりーゆうことになったかと言うと、例のカメラですね。

 またちょっと目をしながらVFWのメッセージを眺めていて・・・

 ちょっと、ダイアログを出してみたわけですよ。これは、取りあえず送れば出る簡単なメッセージなので。

 出せるダイアログは、「VIDEOFORMAT(ビデオ形式)」「VIDEOSOURCE(ビデオソース)」「VIDEODISPLAYT(ビデオ出力)」「VIDEOCOMPRESSION(圧縮器)」の4種類あって、実際に出せるかどうかは、カメラに依存しているラシイです。

#-----------------------------------------------------------
!WM_CAP_DLG_VIDEOFORMAT=$400+41
●ビデオ形式ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)

!WM_CAP_DLG_VIDEOSOURCE=$400+42
●ビデオソースダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOSOURCE,0,0)

!WM_CAP_DLG_VIDEODISPLAY=$400+43
●ビデオ出力ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEODISPLAYT,0,0)

!WM_CAP_DLG_VIDEOCOMPRESSION=$400+46
●圧縮器ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOCOMPRESSION,0,0)
#-----------------------------------------------------------

 うちで出せたのは、ビデオ出力を除く3種類で、しかし、圧縮器とは何なのか全く分からないので無視するとして(えっ)ビデオ形式や、ビデオソースは、(別に使わないけど)ちょっとあると、本物っぽくて(?)いいかなあと思ったのが運の尽き!

 ビデオソースの方は、特に問題ありません(たぶん)

 問題は、ビデオ形式で、解像度が変えられるわけなんだけど・・・ビデオの解像度は変わりますが、当然のことながら、母艦のサイズは変わらないので、640*480の母艦の左上に、ちっちゃこいビデオ映像が表示されるとゆーことになってしまいます。

 ビデオ形式ダイアログで解像度を変更したら、変更したキャプチャーウィンドウのサイズを、母艦のサイズに反映しなくちゃいけません。

 しかも、この解像度変更は、プログラムを終了しても元に戻らんので、次起動時も見事にの状態で、起動して来ちゃうんですよね><

 起動時の母艦のサイズも、本当は、640*480で決め打ちではダメで、キャプチャーウィンドウのサイズに合わせてやらなくちゃいけなかったんです。

 ちょっと現実逃避しようと思って別のコトしたら、こっちでもまたキビシイ現実に直面するとゆう、いつものパターン><

(ちょっとリバーシについて考えはじめたのが違いの元ってゆう・・・ミニだかマックスだかアルファだかベータだか、なんかもーわけ分からんヽ(;´Д`)ノ ・・・やっぱ初心で、とりあえずはしりとりかな;)


 さてこでのキャプチャーウィンドウのサイズを知るには、「WM_CAP_GET_STATUS」で、キャプチャーウィンドウのステータスをゲットしなくちゃいけない。一体どこからゲットするかというと、「CAPSTATUS」とゆう構造体からだよって話なんです。

 winAPIでなんかかんかする場合、SETする系はたいてい、ちゃんと送りさえすればこちらが特に意識しなくても値をセットしてくれて動くんだけど、GETするにはどうやら構造体から逃れられないっぽいため、これまではつとめてGETしないよう心がけていたのです(なにそれ;)

 だって、も、こーぞーたいってなんすか・・・。しくしくしく。


 うっすらと分かっているのは、

・目的の構造体と同じ構成の、なでしこのグループを作る。
・PACKグループを構造体にする。→APIで操作。
・UNPACKで構造体をグループにする。→なでしこで操作。

 ・・・的な???

 以前やったジョイパッドを使うAPIのプログラムで使われていて、何の呪文だかさっぱり分からんと思い調べた結果、こんな感じラシイと分かったものの、理解するには到らなかったんです;;;

 しかしまーワタシも近頃は色々ひらめいて、だいぶ賢くなってきてますからっ!

 コレを使って、以前スクリーンセーバーの時に、なんだか分からんと無視した「GetWindowRect」をやってみようと思う。

 ばいなりしゅとくやかくほはいまだよく分からないけど、とりあえずPACKUNPACKで同じコトができーな気がしてきた☆

#-----------------------------------------------------------
#まずはGetWindowRectを使えるようにする。
#https://msdn.microsoft.com/ja-jp/library/cc364769.aspx
#指定されたウィンドウの左上端と右下端の座標をスクリーン座標で取得します。
#スクリーン座標は、表示画面の左上端が (0,0) となります。
#-----------------------------------------------------------
●WinRect取得(hWnd,lpRect)=DLL("user32.dll",
"BOOL GetWindowRect(
HWND hWnd,      // ウィンドウのハンドル
LPRECT lpRect   // ウィンドウの座標値
)")

#-----------------------------------------------------------
#構造体の内容でグループを作る。
#https://msdn.microsoft.com/ja-jp/library/a5ch4fda.aspx
#-----------------------------------------------------------
■WinRect
 ・左
 ・上
 ・右
 ・下

#-----------------------------------------------------------
#グループを構造体に。
#(型ってのがまた、ひとつ分からんケド、これはLONGラシイ。)
#-----------------------------------------------------------
PACK(WinRect,S,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#引数は、パックした構造体へのポインター。
#(変数Aの保持している生データへのポインタ・・・なんて言われても
#ぜんっぜんわかんないけど、深く考えず「POINTER」を使えばOK;)
#-----------------------------------------------------------
WinRect取得(母艦のハンドル,POINTER(S))
それ言う。  # 関数成功すると、0 以外の値が返ります。関数失敗すると、0 が返ります。

#-----------------------------------------------------------
#構造体をグループに。
#-----------------------------------------------------------
UNPACK(S,WinRect,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#(WinRectの右-WinRectの左)と(WinRectの下-WinRectの上)が
#母艦の幅と高さと同一ならば、正しく取得されており成功です。
#-----------------------------------------------------------
母艦の幅を表示母艦の高さを表示改行表示。
(WinRectの右-WinRectの左)を表示。
(WinRectの下-WinRectの上)を表示改行表示。

#ちなみに、「の」でも「.」でもイイっぽい。
WinRectの左を表示。
WinRect.上を表示。
WinRectの右を表示。
WinRect.下を表示。
#-----------------------------------------------------------

 でっ、できた!!(喜)

ゲスト



トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170412