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