次の方法で共有


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

この記事では、ActiveX コントロールの開発に関連する高度なトピックについて説明します。 これらには次のものが含まれます。

Von Bedeutung

ActiveX は、新しい開発には使用すべきではないレガシ テクノロジです。 ActiveX に代わる最新のテクノロジの詳細については、「 ActiveX コントロール」を参照してください。

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

ActiveX コントロール クラスはクラス ライブラリの一部であるため、標準 MFC アプリケーションでデータベース クラスを使用して MFC データベース クラスを使用する ActiveX コントロールを開発する場合と同じプロシージャとルールを適用できます。

MFC データベース クラスの概要については、「MFC データベース クラス (DAO および ODBC)」を参照してください。 この記事では、MFC ODBC クラスと MFC DAO クラスの両方について説明し、どちらかの詳細を説明します。

DAO は、Office 2013 でサポートされています。 DAO 3.6 は最終バージョンであり、古いと見なされます。 Visual C++ 環境とウィザードは DAO をサポートしていません (ただし、DAO クラスは含まれており、引き続き使用できます)。 新しいプロジェクトには 、OLE DB テンプレート または ODBC および MFC を使用することをお勧めします。 DAO は、既存のアプリケーションの保守にのみ使用する必要があります。

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

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

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

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

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

次のプロシージャは、整数の 2 次元配列としてアクセスできる Array と呼ばれるパラメーター化されたプロパティを追加します。

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

  1. コントロールのプロジェクトを読み込みます。

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

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

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

  5. [ プロパティ名] ボックスに「 Array」と入力します。

  6. [ プロパティの種類 ] ボックスで、 shortを選択します。

  7. [実装の種類] で、[Get/Set メソッド] をクリックします。

  8. [ 関数の取得 ] ボックスと [ 関数の設定 ] ボックスに、Get 関数と Set 関数の一意の名前を入力するか、既定の名前をそのまま使用します。

  9. パラメーターコントロールとパラメーター型コントロールを使用して、 (short 型) と呼ばれるパラメーターを追加します。

  10. column (type short) という 2 つ目のパラメーターを追加します。

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

プロパティの追加ウィザードによって行われた変更

カスタム プロパティを追加すると、プロパティの追加ウィザードによってコントロール クラス ヘッダー (.H) と実装 (.CPP) ファイル。

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

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

このコードでは、 GetArraySetArray という 2 つの関数を宣言します。これにより、ユーザーはプロパティにアクセスするときに特定の行と列を要求できます。

さらに、プロパティの追加ウィザードでは、コントロール クラスの実装 (.CPP) ファイル:

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

最後に、 GetArray 関数と SetArray 関数の実装が 、CPP ファイル。 ほとんどの場合、プロパティの値を返すように Get 関数を変更します。 通常、Set 関数には、プロパティが変更される前または後に実行する必要があるコードが含まれます。

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

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

コントロールでエラー状態が発生した場合は、コントロール コンテナーにエラーを報告することが必要な場合があります。 エラーが発生した状況に応じて、エラーを報告する方法は 2 つあります。 プロパティの Get 関数または Set 関数内、または OLE オートメーション メソッドの実装内でエラーが発生した場合、コントロールは COleControl::ThrowError を呼び出す必要があります。これは、エラーが発生したことをコントロール ユーザーに通知します。 他の時点でエラーが発生した場合、コントロールは COleControl::FireError を呼び出す必要があります。これによって、ストック エラー イベントが発生します。

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

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

エラー 説明
CTL_E_ILLEGALFUNCTIONCALL 無効な関数呼び出し
CTL_E_OVERFLOW オーバーフロー
CTL_E_OUTOFMEMORY メモリ不足
CTL_E_DIVISIONBYZERO 0 で除算しました
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 Set not supported (読み取り専用プロパティ)
CTL_E_NEEDPROPERTYARRAYINDEX プロパティ配列インデックスが必要です
CTL_E_SETNOTPERMITTED Set は使用できません
CTL_E_GETNOTSUPPORTEDATRUNTIME 実行時にサポートされない
CTL_E_GETNOTSUPPORTED Get はサポートされていません (書き込み専用プロパティ)
CTL_E_PROPERTYNOTFOUND プロパティが見つかりません
CTL_E_INVALIDCLIPBOARDFORMAT クリップボードの形式が無効です
CTL_E_INVALIDPICTURE 無効な画像
CTL_E_PRINTERERROR プリンター エラー
CTL_E_CANTSAVEFILETOTEMP ファイルを TEMP に保存できない
CTL_E_SEARCHTEXTNOTFOUND 検索テキストが見つかりません
CTL_E_REPLACEMENTSTOOLONG 置換が長すぎます

必要に応じて、CUSTOM_CTL_SCODE マクロを使用して、標準コードの 1 つでカバーされていない条件のカスタム エラー コードを定義します。 このマクロのパラメーターは、1000 ~ 32767 の範囲の整数にする必要があります。 例えば次が挙げられます。

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

既存の VBX コントロールを置き換える ActiveX コントロールを作成する場合は、エラー コードに互換性があることを確認するために VBX コントロールが使用するのと同じ数値で ActiveX コントロールのエラー コードを定義します。

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

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

ActiveX コントロールの基本クラスが COleControlされている場合は、 CWnd::P reTranslateMessage をオーバーライドして、コンテナーがメッセージを処理する前にメッセージを処理できます。 この手法を使用する場合は、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 を 使用してコントロールにアクセスすると、コントロールは正しく機能しません。 代わりに、次のいずれかの手法を使用して、コントロールを表すオブジェクトを取得する必要があります。

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

    -又は-

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

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

こちらも参照ください

MFC ActiveX コントロール