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 個のパラメーターが)。
次の手順では、整数の次元配列としてアクセスできるというパラメーター化されたプロパティを配列追加します。
パラメーター化されたプロパティをプロパティの追加ウィザードを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、コントロールのライブラリ ノードを展開します。
ショートカット メニューを開くには、コントロール (ライブラリ ノードの 2 番目のノード)のインターフェイス ノードを右クリックします。
ショートカット メニューのをクリック 追加 は、 プロパティの追加をクリックします。
プロパティ名(O),プロパティ名 ボックスで、型 Array。
プロパティの型,プロパティの種類,プロパティの種類(Y),プロパティ型 ボックスで、ボックス short。
実装の種類、をクリック Get/Set Methods。
Get Function と 関数の設定,Set 関数(I) ボックスで、派生型の一意の名前と集計関数は、既定の名前を受け入れます。
パラメーター名,パラメーター名(N) と パラメーターの型 のコントロールを使用して row (型 short)というパラメーターを追加します。
2 番目のパラメーターによって呼び出されます column (型 short)を追加します。
[完了] をクリックします。
プロパティの追加ウィザードによる変更
カスタム プロパティを追加する場合は、プロパティの追加ウィザードはコントロール クラスのヘッダーを変更します。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をダイヤルする必要があります。
発生したエラーの種類を示すために、コントロールは ThrowError か FireErrorにエラー コードを渡す必要があります。エラー コードは 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();