次の方法で共有


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

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

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

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

  • ActiveX コントロールの Handling Errors

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

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

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 または Set 関数のペアを追加してプロパティを実装します。

メソッドとプロパティのパラメーター化されたプロパティと同様に、許容されるパラメーターの数に制限がない。 パラメーター化されたプロパティは、制限が 15 のパラメーターで、プロパティ値を格納するために予約されて 1 個のパラメーターが)。

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

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

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

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

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

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

  5. プロパティ名 ボックスで、Arrayを入力します。

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

  7. 実装 の場合、クリック Get/Set メソッドの設定

  8. Get 関数(G)関数の設定 ボックスで、型の一意の名前は Set 関数取得または既定の名前を受け入れます。

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

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

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

プロパティの追加ウィザードによる変更

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

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

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

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

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

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

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

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

ActiveX コントロールの Handling Errors

エラー条件が発生すると、コントロールにコントロール コンテナーにエラーを通知する必要があります。 エラーが発生した場合に、エラーを報告するための 2 種類のメソッドがあります。 エラーがプロパティ内で発生したかまたは 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

空白を使用することはできません。

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 を使用する必要があります:

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

    または

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

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

参照

概念

MFC ActiveX コントロール