Last Updated 2005/09/16
Programming Tips Visual C++ OCX  索 引 
OCXの定数
2005/09/16

VC++ で作成した OCX を VisualBasic に貼り付けた時に,定数がドロップダウンさせるにはどうしたらよいか?

(よく市販の OCX では
MousePointer
0 - 既定値
1 - 矢印
2 - クロス
と表示される)



*.IDL ファイルに

    typedef enum {
        既定値 = 0,
        矢印   = 1,
        クロス = 2,
    } enumPOINTER;

とか記述する.

プロパティを以下のようにする.

 [propget, id(1)] HRESULT MousePointer([out, retval] enumPOINTER* num);
 [propput, id(1)] HRESULT MousePointer([in] enumPOINTER newVal);


ソースに日本語が入っているが,ATL のプロジェクトではタイプライブラリを元にヘッダーを自動生成するのでエラーになってしまう.
これをごまかすには,最初は英字で enum を定義してビルドした後,enum 定義されたヘッダーを保存しておく.
*.IDL を望みの漢字に変更して *.IDL のみコンパイルしてタイプライブラリを作成する.
保存しておいたヘッダーファイルをタイプライブラリより新しい日付にしてビルドする.

(大変な手間がかかり,これでは間違いも発生してしまう)


ならば,正攻法で IPerPropertyBrowsing インターフェイスをインプリメントする.
(ATL では IPerPropertyBrowsingImpl テンプレートクラスが該当する)

MFC では以下のように記述する.


プロパティがとりうる値を表す予め定義された文字列のセットを返す為の,OnGetPredefinedStrings メンバ関数をオーバーライドする.

この関数は以下の引数を持つ.

    DISPID dispid                  プロパティの識別用
    CStringArray* pStrArray        とりうる値を示す文字列の配列へのポインタ
    CDWordArray* pCookieArray      上の文字列に対応したID(クッキー値)を格納する
                                   ためのDWORD配列へのポインタ


この関数内では,上記プロパティの値を示す文字列と ID のペアを必要なだけ渡されてきた配列クラスへのポインタを使用して追加する.

    CString Name(_T("0 - 値1"));
    pStrArray->Add(Name);
    pCookieArray->Add(0);

    Name = _T("1 - 値2");
    pStrArray->Add(Name);
    pCookieArray->Add(1);

    Name = _T("2 - 値3");
    pStrArray->Add(Name);
    pCookieArray->Add(2);


次に OnGetPredefinedValue メンバ関数をオーバーライドする.
この関数は以下の引数を持つ.

    DISPID dispid                  プロパティの識別用
    DWORD dwCookie                 クッキー値
    VARIANT FAR* lpvarOut          クッキーに対応した値を返すための変数


この関数は OnGetPredefinedStrings でセットした文字列に対応するクッキー値を渡してくるので,そのクッキー値が示す値を VARIANT 変数にセットする.
(ここでは クッキー値 = プロパティ値 なのでそのままセットする)

    VariantClear(lpvarOut);
    V_VT(lpvarOut) = VT_I2;
    V_I2(lpvarOut) = (short)dwCookie;


最後に OnGetDisplayString をオーバーライドして,現在のプロパティ値を示す文字列を返すようにする.



MFC のサンプルとしては ENUM32 が存在する.


参照
前後のTips
OCXの定数

DSS ProgrammingTipsCGI Ver2.02