高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1150
Movie Drawing Complete Procedure with C++


Q: ムービー描画完了プロシージャとして C++ クラスのインスタンスメソッドを使おうとしています。これを行うための方法はありますか?何か推奨する方法がありますか? どのムービー(私のオブジェクト)がフレームを描画しているかを知りたいのです。

A: 描画完了関数をムービーに割り当てるには、SetMovieDrawingCompleteProc の呼び出しを使います。この呼び出しは、ムービー、フラグ(movieDrawingCallWhenChanged または movieDrawingCallAlways)、コールバックを指すための UPP、および RefCon を引数として取ります。MovieDrawingCompleteProc をインストールするときは、MovieDrawingCompleteUPP を、クラスのメンバ関数ではなく静的なクラス関数に対して使います。RefCon を使って、クラスのインスタンスを参照できます。


// Example クラスのヘッダファイル
// MyClass.h
class MyClass {
public:
            MyClass() { mMovie = NULL; };
    virtual ~MyClass();

protected:
            void  InstallMovieDrawingComplete(Movie inMovie,
                                     long inFlags = movieDrawingCallAlways);
    virtual OSErr DrawingCompleteDoSomething(Movie theMovie) { return noErr; };

private:
    /*  ムービー描画の完了時に呼び出される
        typedef OSErr (*MovieDrawingCompleteProcPtr) (Movie theMovie, long refCon);
     */
    static pascal OSErr MyClassMovieDrawingCompleteProc(Movie theMovie, long refCon);
    static MovieDrawingCompleteUPP sMovieDrawingCompleteUPP;
           Movie                   mMovie;
};

// Example クラスの実装
// MyClass.cpp

MovieDrawingCompleteUPP MyClass::sMovieDrawingCompleteUPP = NULL;

pascal OSErr MyClass::MyClassMovieDrawingCompleteProc(Movie theMovie, long refCon)
{
    MyClass *instance = reinterpret_cast<MyClass *>(refCon);
    OSErr err = noErr;

    if (instance)
        err = instance->DrawingCompleteDoSomething(theMovie);

    return err;
}

MyClass::~MyClass()
{
    if (mMovie) ::SetMovieDrawingCompleteProc(mMovie, 0, NULL, 0L);
    if (sMovieDrawingCompleteUPP)
        ::DisposeMovieDrawingCompleteUPP(sMovieDrawingCompleteUPP);
}

/*
   inFlags: movieDrawingCallWhenChanged
                ムービーが変更されたときのみ、ツールボックスが描画完了関数を呼び出すように指定する
            movieDrawingCallAlways
                ツールボックスに対して、アプリケーションが MoviesTask を呼び出すたびに描画完了関数を呼び出すように指定する
 */
void MyClass::InstallMovieDrawingComplete(Movie inMovie, long inFlags)
{
    if (NULL == MyClass::sMovieDrawingCompleteUPP) {
        MyClass::sMovieDrawingCompleteUPP =
                 ::NewMovieDrawingCompleteUPP(MyClass::MyClassMovieDrawingCompleteProc);
    }

    if (inMovie) {
        if (mMovie) {
            // 前のムービーのコールバックを取り除く
            ::SetMovieDrawingCompleteProc(mMovie, 0, NULL, 0L);
        }
        ::SetMovieDrawingCompleteProc(inMovie, inFlags,
                                      MyClass::sMovieDrawingCompleteUPP,
                                      long(this));
        mMovie = inMovie;
   }
}

リスト 1 MovieDrawingCompleteProc に静的なメンバを使用


[2002 年 6 月 18 日]