次の方法で共有


MFC ActiveX コントロール : 高度なトピック

この技術情報では、 ActiveX コントロールを開発する場合の高度なトピックについて説明します。以下に例を示します。

  • ActiveX コントロールのデータベース クラスを使用する

  • パラメーター化されたプロパティの実装

  • ActiveX コントロールでのエラー処理

  • コントロールの特殊なキーの処理

  • 実行時には表示されないアクセスのダイアログ コントロール

ActiveX コントロールのデータベース クラスを使用する

ActiveX コントロール クラスがクラス ライブラリの一部であるため、 MFC データベース クラスを使用する ActiveX コントロールを開発する際に、標準の MFC アプリケーションでデータベース クラスを使用するには、同じプロシージャ、および規則を適用できます。

MFC データベース クラスの作成の概要については、 MFC データベース (DAO クラスと ODBC)を参照してください。技術情報は、 MFC ODBC クラスと MFC DAO クラスの両方を紹介し、いずれかの詳細に指示します。

[!メモ]

Visual C++ .NET では、Visual C++ 開発環境およびウィザードでは DAO はサポートされなくなりました (DAO クラスは含まれているので、このクラスを使うことはできます)。Microsoft は、新しいプロジェクトに OLE DB テンプレートODBC と MFC を使用することをお勧めします。DAO は、既存のアプリケーションを保守するためだけに使用してください。

パラメーター化されたプロパティの実装

パラメーター化されたプロパティ (、プロパティの配列)は、コントロールの一つのプロパティとして値で同種の収集を公開するためのメソッドです。たとえば、プロパティとして配列またはディクショナリを公開するためにパラメーター化されたプロパティを使用できます。Visual Basic では、このようなプロパティは配列表記を使用してアクセスされます:

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

パラメーター化されたプロパティを実装するには、プロパティの追加ウィザードを使用します。プロパティの追加ウィザードは、コントロールでユーザーが上の表記を使用して、標準のメソッドでプロパティにアクセスできるようにする Get または集計関数のペアを追加して、プロパティを実装します。

メソッドおよびプロパティのパラメーター化されたプロパティと同様に、許可されるパラメーターの数に制限があります。パラメーター化されたプロパティの場合、制約は 15 のパラメーターです (プロパティ値を格納するために予約されて 1 個のパラメーターが)。

次の手順では、整数の次元配列としてアクセスできるというパラメーター化されたプロパティを配列追加します。

パラメーター化されたプロパティをプロパティの追加ウィザードを追加するには

  1. コントロール プロジェクトを読み込んでください。

  2. クラス ビューで、コントロールのライブラリ ノードを展開します。

  3. ショートカット メニューを開くには、コントロール (ライブラリ ノードの 2 番目のノード)のインターフェイス ノードを右クリックします。

  4. ショートカット メニューのをクリック 追加 は、 プロパティの追加をクリックします。

  5. プロパティ名(O),プロパティ名 ボックスで、型 Array。

  6. プロパティの型,プロパティの種類,プロパティの種類(Y),プロパティ型 ボックスで、ボックス short

  7. 実装の種類、をクリック Get/Set Methods

  8. Get Function関数の設定,Set 関数(I) ボックスで、派生型の一意の名前と集計関数は、既定の名前を受け入れます。

  9. パラメーター名,パラメーター名(N)パラメーターの型 のコントロールを使用して row (型 short)というパラメーターを追加します。

  10. 2 番目のパラメーターによって呼び出されます column (型 short)を追加します。

  11. [完了] をクリックします。

2dffbw6e.collapse_all(ja-jp,VS.110).gifプロパティの追加ウィザードによる変更

カスタム プロパティを追加する場合は、プロパティの追加ウィザードはコントロール クラスのヘッダーを変更します。H)と実装 (.cpp)ファイル。

次の行はコントロール クラスに追加されます。H ファイル:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

このコードは、ユーザーがプロパティにアクセスすると、列および特定の行を要求できる 2 種類の関数を GetArray と SetArray と宣言します。

また、プロパティの追加ウィザードはコントロール クラスの実装 (.cpp)ファイルに含まれるコントロールのディスパッチ マップに次の行を追加します:

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

最後に、 GetArray の実装と SetArray 関数は、 .cpp ファイルの末尾に追加されます。ほとんどの場合、プロパティの値を返す場合は、 Get 関数を変更します。集計関数は、通常、実行する必要があるコードをプロパティの変更の前後のいずれか含まれています。

便利です。このプロパティにパラメーター化されたプロパティの値はコントロールに、クラス型 shortの次元配列メンバー変数を宣言できます。これで、パラメーターによって示されるように、適切な行と列に格納された値を返すには、 Get 関数を変更し、行と列パラメーターによって参照される値を更新する集計関数を変更します。

ActiveX コントロールでのエラー処理

エラー条件がコントロールに発生する場合は、コントロール コンテナーにエラーを通知する必要があります。エラーが発生した状況によってエラーを報告するための 2 とおりの方法があります。エラーがプロパティで取得または発生する OLE オートメーションのメソッドの実装内で集計関数は、エラーが発生したことにコントロールのユーザーに通知するコントロール COleControl::ThrowErrorをダイヤルする必要があります。エラーが他のときにが発生した場合、標準的なエラー イベントを発生させるコントロールは COleControl::FireErrorをダイヤルする必要があります。

発生したエラーの種類を示すために、コントロールは ThrowErrorFireErrorにエラー コードを渡す必要があります。エラー コードは 32 ビット値がある OLE ステータス コードです。可能な場合は、 OLECTL.H のヘッダー ファイルで定義されているコードの標準セットからエラー コードを選択します。次の表は、これらのコードを示します。

ActiveX コントロールのエラー コード

エラー

Description

CTL_E_ILLEGALFUNCTIONCALL

無効な関数呼び出し

CTL_E_OVERFLOW

オーバーフロー

CTL_E_OUTOFMEMORY

メモリが足りません

CTL_E_DIVISIONBYZERO

除算

CTL_E_OUTOFSTRINGSPACE

文字列の領域から

CTL_E_OUTOFSTACKSPACE

スタック領域から

CTL_E_BADFILENAMEORNUMBER

不正なファイル名または数

CTL_E_FILENOTFOUND

あるコンテナーに存在するファイル

CTL_E_BADFILEMODE

不正なファイル モード

CTL_E_FILEALREADYOPEN

[コンテナーに存在するファイル既に

CTL_E_DEVICEIOERROR

デバイスの I/O エラー

CTL_E_FILEALREADYEXISTS

コンテナーに存在するファイルが既にあります

CTL_E_BADRECORDLENGTH

不適切なレコード長

CTL_E_DISKFULL

ディスクがいっぱいです。

CTL_E_BADRECORDNUMBER

不適切なレコード数

CTL_E_BADFILENAME

不正なファイル名

CTL_E_TOOMANYFILES

多すぎるファイル

CTL_E_DEVICEUNAVAILABLE

デバイスが使用不可能

CTL_E_PERMISSIONDENIED

拒否する承認

CTL_E_DISKNOTREADY

準備できなかったディスク

CTL_E_PATHFILEACCESSERROR

パスまたはファイル アクセス エラー

CTL_E_PATHNOTFOUND

検索パス

CTL_E_INVALIDPATTERNSTRING

無効なパターン文字列

CTL_E_INVALIDUSEOFNULL

null の無効な使用

CTL_E_INVALIDFILEFORMAT

無効なファイル形式

CTL_E_INVALIDPROPERTYVALUE

無効なプロパティ値

CTL_E_INVALIDPROPERTYARRAYINDEX

無効なプロパティの配列インデックス

CTL_E_SETNOTSUPPORTEDATRUNTIME

実行時にサポートされていない設定します。

CTL_E_SETNOTSUPPORTED

サポートされていない設定します (読み取り専用プロパティ)

CTL_E_NEEDPROPERTYARRAYINDEX

プロパティの配列インデックスを必要とします。

CTL_E_SETNOTPERMITTED

許可されない設定

CTL_E_GETNOTSUPPORTEDATRUNTIME

実行時にサポートされていない取得します。

CTL_E_GETNOTSUPPORTED

サポートされていない取得します (書き込み専用プロパティ)

CTL_E_PROPERTYNOTFOUND

検索プロパティ

CTL_E_INVALIDCLIPBOARDFORMAT

無効なクリップボード形式

CTL_E_INVALIDPICTURE

無効なピクチャ

CTL_E_PRINTERERROR

誤字

CTL_E_CANTSAVEFILETOTEMP

TEMP にファイルを保存できません

CTL_E_SEARCHTEXTNOTFOUND

見つかったテキスト

CTL_E_REPLACEMENTSTOOLONG

置換が長すぎます。

必要に応じて、標準のコードの 1 には含まれず要件のカスタム エラー コードの定義に CUSTOM_CTL_SCODE のマクロを使用します。このマクロのパラメーターは、 1000 ~ 32767 の整数である必要があります。次に例を示します。

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

既存の VBX コントロールを置き換えるために ActiveX コントロールを作成してもエラー コードに互換性があることを保証するために、 VBX コントロールと同じ数値の ActiveX コントロールのエラー コードを定義します。

コントロールの特殊なキーの処理

場合によっては特殊な方法で特定のキーストロークの組み合わせを処理する場合があります。; たとえば方向キー ID を押したときに Enter キーがエディット コントロールのグループ間の複数行テキスト ボックス コントロールまたは移動押すと、新しい行を挿入します。

ActiveX コントロールの基本クラスが COleControl場合、コンテナーは、を処理する前にメッセージを処理するために CWnd::PreTranslateMessage をオーバーライドできます。この手法を使用した場合、 PreTranslateMessageのオーバーライドのメッセージを処理する場合は TRUE を常に返します。

次のコード例は、方向キーに関連するメッセージを処理する一つの方法を示します。

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
      case WM_KEYDOWN:
         switch (pMsg->wParam)
         {
         case VK_UP:
         case VK_DOWN:
         case VK_LEFT:
         case VK_RIGHT:
            bHandleNow = TRUE;
            break;
         }
         if (bHandleNow)
         {
            OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
         }
         break;
   }
   return bHandleNow;
}

ActiveX コントロールのキーボード インターフェイスの操作の詳細については、 ActiveX SDK のドキュメントを参照してください。

実行時には表示されないアクセスのダイアログ コントロール

ユーザー インターフェイスを持たないし、実行時には表示されないダイアログ コントロールを作成できます。ダイアログ ボックスに ActiveX コントロールの実行時には表示されないの追加し、コントロールへのアクセスに CWnd::GetDlgItem を使用すると、コントロールが正しく機能しません。代わりに、コントロールを表すオブジェクトを取得する次の手法の 1 つを使用する必要があります:

  • メンバー変数の追加ウィザードを使用して、を選択します Control Variable に、コントロールの ID を選択し、メンバー変数の名前を入力し、 Control Typeとしてコントロールのラッパー クラスを選択します。

    または

  • ダイアログの項目に、ローカル変数、およびサブクラスを宣言します。次のようなコードを挿入します。CMyCtrl は、ラッパー クラスです IDC_MYCTRL1 コントロールの ID です):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

参照

概念

MFC ActiveX コントロール