CaptureSound Managed その2
1.DirectX9 SDK sample ,CaptureSound Maneged の、最初の画面
パソコン内の、CaptureDevicesを、LIstBoxに列挙するwindowです。
まず、myDirectSoundCapture という projectを、作ります。
続いて、devicesFormという windowを追加します。
もし、devicesForm.Show()を使うと、MainFormも同時に表示されてしまいますので、アウト。
ShowDialog()メソッドを使うべし。
2.DevicesFormに、CaptureDevicesを列挙するには
CaptureDevicesCollectionと、DeviceInformation オブジェクトを、変数にする。
namespace
myDirectSoundCapture{
public partial class DevicesForm : Form
{
public CaptureDevicesCollection devices = new CaptureDevicesCollection();
public DeviceInformation deviceInfo = new DeviceInformation();
続いて、DevicesForm コンストラクタを記述する。
foreach という、便利なものを使います。
public DevicesForm()
{
InitializeComponent();
foreach (DeviceInformation info in devices)
//これのdescriptionを、ListBoxに追加します。
CaptureDevicelistBox.Items.Add(info.Description);
CaptureDevicelistBox.SelectedIndex = 0;
}
このDeviceInformationは、struct 構造体です。
クラスと構造体の違いが、いまいち....
以下のように、定義されています。
namespace
Microsoft.DirectX.DirectSound{
public struct DeviceInformation
{
public string Description { get; }
public Guid DriverGuid { get; }
public string ModuleName { get; }
public override string ToString();
}
}
DeviceInformation は、なくても、ListBoxに列挙できますが、あるほうが、スマートに記述できますね。
無いとすると
for (int i = 0; i < devices.Count; i++)
{
CaptureDevicelistBox.Items.Add(devices[i].Description);
}
てな、具合でしょうか?
3.これだけでは、選択されたdeviceを、MainFormに、渡せない
フォーム内の、OKボタンを押して、deviceを選択するのですが
private void buttonOK_Click(object sender, EventArgs e)
{
if (0 < CaptureDevicelistBox.Items.Count)
MainForm.CaptureDeviceGuid = devices[0].DriverGuid;
Close();
}
(んんっ、実は、ListBox内のdevicesは、列挙だけで、実際には、device[0]しか、選んでない if ( 0<.... )
これは、エラーですね、当然。
んじゃ、MainFormに、CaptureDeviceGuidを、追加しましょう。
public partial class MainForm : Form
{
Guid CaptureDeviceGuid = Guid.Empty;
public MainForm()
{
InitializeComponent();
DevicesForm devicesForm = new DevicesForm();
devicesForm.ShowDialog();
}
当然ですが、それでもエラーが出ます。
devicesFormクラスは、MainFormクラス内の変数には、アクセスできないのですから。
( 初歩的な事ばっかしで、済みません。私は、この教材で、windowsプログラミングの仕組みも、勉強させてもらっております。 )
大体やね、
devicesformの呼び出し元(親)を、指定してないのですから....
MainFormで、親を指定しましょう。
public partial class MainForm : Form
{
public Guid CaptureDeviceGuid = Guid.Empty; //publicを、付けとかんと、アクセスでけん
public MainForm()
{
InitializeComponent();
DevicesForm devicesForm = new DevicesForm(this);
devicesForm.ShowDialog();
}
}
子windowのDevicesFormに、MainFormのメンバを追加しましょう。
public partial class DevicesForm : Form
{
CaptureDevicesCollection devices = new CaptureDevicesCollection();
public DeviceInformation deviceInfo = new DeviceInformation();
private MainForm mf = null;
public DevicesForm()
{
InitializeComponent();
そして、DevicesForm コンスタラクタを書き換えましょう。
public DevicesForm(MainForm mf2)
{
InitializeComponent();
this.mf = mf2; //この子の親は、私(MainForm)なんだ.... うーむ、身につまされるなあ....
/* foreach (DeviceInformation info in devices)
CaptureDevicelistBox.Items.Add(info.Description);
CaptureDevicelistBox.SelectedIndex = 0;*/
for (int i = 0; i < devices.Count; i++)
{
CaptureDevicelistBox.Items.Add(devices[i].Description);
}
そんで、OKボタンを押すと
private void buttonOK_Click(object sender, EventArgs e)
{
if (0 < CaptureDevicelistBox.Items.Count)
mf.CaptureDeviceGuid = devices[0].DriverGuid;
Close();
}
これで、無事、正常にビルドできました、やれやれ (^_^;;
この教材で、1番しんどいのは、Mainプログラムです。
スレッド、Notify、AutoResetEvent とか、私には難しいの、ばっかりです。
これも、分解してやれば、何とか理解できそうな気が....
H.18.6.20