CWnd と MCIWnd... の HWND

[戻る]
あき 2002/04/02(火) 23:16:32
動画,音声(avi,mpeg,waveなど)を再生するものを作ってます。
その方法として、MCIWnd... でウィンドウを作って再生してます。
MCIWndCreate で作成されたウィンドウについて質問です。

MFC の CWnd クラスを派生させて、CMediaWnd クラスを作成したのですが、
ClassWizard によって追加したメッセージによる処理
(マウスクリックや、ウィンドウ位置,サイズ変更など)
をうまくやってくれません。
MCIWndCreate で取ったウィンドウハンドルを
CWnd へ置きかえる方法が悪いのでは?と思ってるのですが...。
作成した CMediaWnd クラスのコードの一部を下に記します。


//hParent - 親ウィンドウ, dwStyle - ウィンドウスタイル
BOOL CMediaWnd::Create(HWND hParent, DWORD dwStyle)
{
    //Attach を使うのが悪いのでしょうか?
    return Attach
        (::MCIWndCreate(hParentWnd,NULL, dwStyle, null));
}

HWND CMediaWnd::DestroyWindow()
{
    //Attach が悪ければ、やっぱりココも悪いですよね...。
    MCIWndDestroy(m_hWnd);
    return Detach();
}

void CMediaWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
    //ここなどが呼ばれないみたいなんです...。
    CWnd::OnLButtonDown(nFlags, point);
}

というような感じです。
他にもメディアファイルのオープンや、再生、停止などの関数も用意しました。
このような MCIWnd...系を使った関数は正しく動きます。
メッセージによる処理だけが駄目なんです。
それと、ウィンドウ終了時にエラーが出るんです。
DestroyWindow で自分で破棄した場合には正常に終了するんですが、
ウィンドウの右上にある×印をクリックすると、アサートするんです。
OnClose で DestroyWindow を呼ぼうにも OnClose 自体が呼ばれないんですし...。
(ウィンドウプロシージャに関係があるのでは?などとも考えてみましたけど、
クラス内でどう実装したらいいかも解らなくて、結局どうしようもなくなってしまいまし
た・・・。)

解る方、いたらどうかお願いします。


環境
WindowsMe
VisualC++6.0 StandardEdition
MFC 使用

あき 2002/04/02(火) 23:18:07
すみません、訂正です。
コードの MCIWndCreate の引数が間違えてました。

//hParent - 親ウィンドウ, dwStyle - ウィンドウスタイル
BOOL CMediaWnd::Create(HWND hParent, DWORD dwStyle)
{
    //Attach を使うのが悪いのでしょうか?
    return Attach
        (::MCIWndCreate(hParent,NULL, dwStyle, null));
}

dairygoods 2002/04/03(水) 09:33:54
Attachしてもメッセージハンドラは置き換えられません。
SubClassWindowを使えばできると思います。

あき 2002/04/04(木) 00:29:02
[[解決]]
早速 SubClassWindow でやってみたところ、成功しました。
何日も頑張ってたことなんで、もうかなり嬉しいです。
(こんなことで嬉しがってるなんて、やっぱり初心者ですかね?)
dairygoodsさん、本当にどうもありがとうございました。

古いスレッドには追加発言できません。