none
Excel2002, 2003でのOLEオブジェクトの描画について RRS feed

  • 質問

  • Excel上のシートへ、OLEオブジェクトを配置して、非アクティブ時には、
    OLEオブジェクトが生成したメタファイルを表示しています。
    ここでのOLEオブジェクトは、VisualC++2005による自作のプログラムになります。

    Excel2002上では、OLEオブジェクトをアクティブにして、
    OLEオブジェクトを操作し、OLEオブジェクトを非アクティブ状態に戻すと、
    COleServerItem:: OnDraw関数(COleServerItemの派生クラスのOnDraw関数)が呼ばれて、
    シート上で表示しているメタファイルの表示内容が更新されるのですが、

    Excel2003上で、同様に、OLEオブジェクトをアクティブにして、
    OLEオブジェクトを操作し、OLEオブジェクトを非アクティブ状態に戻しても、
    COleServerItem:: OnDraw関数(COleServerItemの派生クラスのOnDraw関数)が呼ばれず、
    シート上で表示しているメタファイルの表示内容も古いままとなり、
    OLEオブジェクトの操作内容とシート上の表示内容が異なってしまいます。

    (Excel2003上でも、OLEオブジェクト操作後、5分から10分程度時間が経つと、
    COleServerItem:: OnDraw関数が呼ばれて、メタファイルの表示内容も
    更新されますが、更新までの時間がかかりすぎています。)

    Excel2003上でも、Excel2002の時と同様に、OLEオブジェクトを操作後、
    OLEオブジェクトの操作内容とシート上の表示内容(メタファイル)を
    同期させたいのですが、どなたかお分かりの方、ご教示願えませんか?

    [エクセルのバージョン]
    Excel2002, Excel2003
    [OSのバージョン]
    Windows XP Professional SP2
    [開発環境]
    Visual Studio 2005 SP1 (Visual C++ 2005を使用)

    2008年7月9日 1:23

回答

  • 自己レスになります。

    Excel2002では、メタファイル形式の要求で表示内容(メタファイル)のリクエストが来ますが、
    Excel2003以降では、拡張メタファイル形式の要求で表示内容(メタファイル)のリクエストが来ます。
    MFCの既定の実装では、拡張メタファイル形式の要求では、COleServerItemの派生クラスのOnDraw関数が反応しないため、表示内容の更新が行われていませんでした。

    そこで、以下のコードの通り、COleServerItemの派生クラスのOnRenderData関数で、
    拡張メタファイル形式の要求をメタファイル形式へ変更すると、COleServerItemの派生クラスのOnDraw関数が呼ばれ、表示内容の更新が行われました。

    同じ現象で困っている方がおりましたら、ご参考ください。

    CMyOleServerItemは、COleServerItemの派生クラスです。

    BOOL CMyOleServerItem:: OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
    {
        // MFC(既定の実装)は拡張メタファイルに対応していないので
        // ここでサポートする
        if (lpFormatEtc->cfFormat == CF_ENHMETAFILE) {
            // 拡張メタをメタに落とし込む
            lpFormatEtc->cfFormat = CF_METAFILEPICT;
            lpFormatEtc->tymed = TYMED_MFPICT;
        }

        return __super:: OnRenderData(lpFormatEtc, lpStgMedium);
    }

    2008年7月9日 6:11