目次に戻る
C-Parts開発手順
2002/10/02 update.

ここでは、ShadeプラグインとしてC-Partsを使用する場合の開発の手順を説明します。
必要なファイル

  • CPxxxx.h

    C-Partsのコンパイルに必要なC++ヘッダファイル群です。
    このヘッダファイルはWindows/Macintosh共に同じ内容です。
    Visual C++にて、これらの全ヘッダを参照できるように設定しておいてください(プロジェクトに加えてください)。

    VC++の「プロジェクトの設定」ダイアログ


    上記画像の場合、「C:\Shade\ShadePluginSDK\CParts_source」内にC-Partsのヘッダファイル「CPxxxx.h」が入っている必要があります。

  • CPartsLib.lib

    C-Partsのコンパイルに必要なライブラリファイルです。
    Visual C++のメニューの[プロジェクト]-[設定...] の「リンク」タブ、 「オブジェクト/ライブラリ モジュール」入力ボックスに「CPartsLib.lib」を追加してください。

    VC++の「プロジェクトの設定」ダイアログ


    なお、このライブラリのパスが同「リンク」タブの「追加ライブラリのパス」で参照できる必要があります。

    VC++の「プロジェクトの設定」ダイアログ


    上記画像の場合、「C:\Shade\ShadePluginSDK\lib」内に「CPartsLib.lib」が入っている必要があります。

  • CPartsSI.cpp / CPartsSI.h

    C-Parts - Shadeブリッジ」のソースファイルです。これも、コンパイル時に必要になります。
    このファイルはWindows/Macintosh共に同じ内容です。
    Visual C++のプロジェクト内にこのファイルを加えるようにしてください。


  • CPxxxx.h

    C-Partsのコンパイルに必要なC++ヘッダファイル群です。
    このヘッダファイルはWindows/Macintosh共に同じ内容です。
    CodeWarriorにて、これらの全ヘッダを参照できるように設定しておいてください(プロジェクトに加えてください)。

  • CPartsCW.a

    C-Parts本体のスタティックライブラリです。
    このライブラリはCodeWarrior 8の「Apple Mach-O PowerPC」リンカ専用のライブラリです(OS X版のShadeプラグインSDKで使用するリンカと同じです)。
    リンク時にこのファイルが必要になります。プロジェクトに加えるようにしてください。



    また、その他にリンクするライブラリとして以下のものが必要になります。

    bundle1.o
    MSL_Runtime_Mach-O.a


    なお、リンクの順番には注意してください。
    「bundle1.o」が一番先頭に、「MSL_Runtime_Mach-O.a」が一番後尾になるようにします。

  • *.plc

    OS Xの場合は、ソースファイル(*.cpp / *.h)以外に、plcという拡張子のファイルがあります。
    これには、ファイルのバージョン情報やプラグインのIDが記述されています。


    #define kBundleIdentifier "com.expressiontools.shadeplugin.0x434ff001"
    
    plist
    {
        dictionary
        {
            key "CFBundleDevelopmentRegion" value string "English"
            key "CFBundleExecutable" value string __OUTPUT_FILENAME__
            key "CFBundleIdentifier" value string kBundleIdentifier
            key "CFBundleInfoDictionaryVersion" value string "6.0"
            key "CFBundlePackageType" value string __OUTPUT_TYPE__
            key "CFBundleSignature" value string __OUTPUT_CREATOR__
            key "CFBundleVersion" value string "1.0"
            }
    }

    この1行目の末尾の「0x434ff001」が、ShadeのプラグインIDと同じ値である必要があります。
    "CFBundleVersion"がOSから見たファイルのバージョンです。
    とりあえず、プラグイン動作に最低限必要なのは、先頭の「kBundleIdentifier」の文字列(とプラグインID)です。
    他の部分は、そのままでも特に問題ありません。

  • CPartsSI.cpp / CPartsSI.h

    C-Parts - Shadeブリッジ」のソースファイルです。これも、コンパイル時に必要になります。
    このファイルはWindows/Macintosh共に同じ内容です。
    CodeWarriorのプロジェクト内にこのファイルを加えるようにしてください。

プラグインソースでのC-Partsの利用
プラグインソースは、サンプルの「CPartsSample.cpp」を元に説明していきます。
ここでは、plugin_interfaceでの使用を例に挙げていますが、他のインターフェースでも常駐型プラグインであればC-Partsを使用することができます。

  • #includeの指定

    C-Partsで使用する関数・クラスのヘッダファイルを#includeで指定します。

    //C-Partsで使用するヘッダ類
    #include "CPartsMain.h"
    #include "CPWindow.h"
    #include "CPLabel.h"
    #include "CPEditBox.h"
    #include "CPPushButton.h"
    #include "CPGroup.h"
    #include "CPProgressBar.h"
    #include "CPCheckBox.h"
    #include "CPRadioButton.h"
    #include "CPSlider.h"
    #include "CPTab.h"
    #include "CPComboBox.h"
    #include "CPSpin.h"
    #include "CPSpinEditBox.h"
    #include "CPImage.h"
    
    #include "CPartsSI.h"	//C-Parts - Shade のブリッジ
    


    このとき、「#include "CPartsMain.h"」は必ず先頭に指定するようにしてください。

  • 常駐プラグインにする


    extern_c bool STDCALL is_resident (const IID &iid, int i, void *) {
        //必ず常駐させる
        return true;
    }
    

    プラグインのグローバル関数の「is_resident()」において、trueを返して常駐プラグインにします。

  • plugin_interfaceのscene_opened

    ここで、C-Partsの初期化処理を行います。

    virtual void scene_opened (sxbool &b, scene_interface *scene, void * = 0) {
        //C-Parts初期化処理
        CPartsSI_Initialize(scene);
    }
    

    C-Parts Ver1.07以前(ShadeR5以前)は、各インターフェースのコンストラクタで「CPartsSI_Initialize」を呼び出していましたが、 この位置が「scene_opend」に移行し、引数にscene_interfaceのポインタを渡している点に注意してください。

    「C-Parts - Shadeブリッジ」の「CPartsSI_Initialize()」により、Shadeが起動したときにC-Partsの初期化が行われるようになります。
    複数のC-Partsを使ったプラグインが存在する場合は、この処理が複数呼ばれることになりますがC-Parts本体である共有ライブラリ「CPartsLib.dll」は、 1回分の初期化処理しか行いませんので支障はありません。

  • plugin_interfaceのデストラクタ

    ここで、C-Partsの終了処理を行います。

    ~plugin_component () {
        //C-Partsの終了
        CPartsSI_Terminate();
    }
    

    「C-Parts - Shadeブリッジ」の「CPartsSI_Terminate()」により、Shadeが終了するときにC-Partsの後処理が行われるようになります。
    複数のC-Partsを使ったプラグインが存在する場合は、この処理が複数呼ばれることになりますがC-Parts本体である共有ライブラリ「CPartsLib.dll」は、 1回分の終了処理しか行いませんので支障はありません。

  • C-PartsのGUI部品をprivateで定義

    C-PartsのGUI部品として使用するクラスの実体をShadeプラグインクラスのprivateとして定義します。

    private:
        CPWindow cp_win;
        CPPushButton cp_butClose;
    


  • ダイアログの生成


    cp_win.Clear();
    if(cp_win.CreateNewDialog("テストダイアログ",120,120,160,80)<0){
        shade->message("CreateNewDialog failed!!");
        return;
    }
    

    cp_win(CPWindowクラス)のメソッド「Clear()」で情報を初期化した後に、 「CreateNewDialog()」でダイアログを生成しています。
    スクリーン上の(120,120)の位置に(160x80)のサイズのダイアログを生成します。

  • プッシュボタンの配置とコールバック関数の登録


    //「閉じる」ボタンの配置
    cp_butClose.SetText("閉じる");
    cp_butClose.SetBounds(20,20,120,24);
    cp_butClose.AttachSelectEvent(this->OnClose);
    

    cp_butClose(CPPushButtonクラス)のメソッド「SetText()」で表示文字列を指定し、 「SetBounds()」で表示位置とサイズを指定します。
    AttachSelectEvent()」で、ボタンが押されたときにどのstatic関数を呼び出すか指定します。
    ここでは「this->OnClose」となっていますが、これは今のクラス(this)の「OnClose()」を指定したことになります。

    コールバック関数「OnClose」は以下のようになります。

    static void OnClose(CPPushButton *lpBut)
    {
        lpBut->GetParentWindow()->CloseWindow();    //ウィンドウを閉じる
    }
    

    コールバック関数の制約として、staticの静的関数として記述する必要がある点に注意してください。

    コールバック関数の引数は、イベントを発生させたプッシュボタン(CPPushButton : cp_butClose)へのポインタとなります。
    GetParentWindow()」で親となるCPWindow(cp_win)を取得し、 メソッド「CloseWindow()」を呼び出します。
    これで、モーダルダイアログに対して閉じる(イベントループから抜ける)命令を送ります。

  • ツールヒントの文字列を指定


    cp_butClose.SetHintText("ダイアログを閉じます。");
    

    SetHintText()」でツールヒントの文字列を指定します。
    これにより、ボタンの上にマウスカーソルが来たときに、ここで指定した文字列がポップアップで表示されるようになります。

  • ダイアログにプッシュボタンを追加


    cp_win.Add(&cp_butClose);
    

    cp_winクラス(CPWindow)に、cp_butClose(CPPushButton)を追加します。
    これで、初めて土台となるダイアログにプッシュボタンが結びついたことになります。

  • モーダルダイアログのイベントループ


    cp_win.DoModal();
    

    モーダルダイアログを表示し、イベントループを行います。
    ウィンドウの「閉じるボタン」が押されるか、「CPWindow::CloseWindow()」が呼ばれるとイベントループから抜けます。


以上のソースを記述し、プラグインをビルドします(全体のソースは、「CPartsSample.txt」を参照してください)。
生成できたプラグインファイルをShadeの「plugins」フォルダにコピーします。
プラグインメニューより以下のようなウィンドウを出すことができます。



なお、Windows環境の場合は、C-Partsを使用したプラグインを実行するためには、C-Partsのライブラリ本体である「CPartsLib.dll」を Shadeの実行ファイルのあるフォルダと同じ位置にコピーしておく必要があります。
OS Xの場合は、プラグインパッケージ単体をShadeのpluginsフォルダにコピーすることで動作します。