SUBEDIT サンプル : Windows 標準コントロールのスーパークラス化
更新 : 2007 年 11 月
SUBEDIT サンプルでは、Windows 標準エディット コントロールをスーパークラス化する ATL コントロールの作成方法を示します。
SUBEDIT 属性サンプルは、このサンプルの属性付きバージョンです。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
このサンプルをビルドして実行するには
ソリューション ファイル SubEdit.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
サンプルのビルド後に、Web ブラウザで AtlEdit.htm を開き、コントロールを試します。
ATLEdit クラスを開くと、ActiveX コントロール テスト コンテナでコントロールをテストできます。テスト コンテナにアクセスしてコントロールをテストする方法の詳細については、「テスト コンテナでのプロパティとイベントのテスト」を参照してください。
Windows コントロールのスーパークラス化
ATL を使用すると、Windows 標準コントロールをスーパークラス化するコントロールを作成できます。スーパークラス化を使用すると、既存のクラスに基づくウィンドウ クラスを作成できます。ただし、ウィンドウ プロシージャは既存のクラスのものではなく、別のウィンドウ プロシージャに変更されます。次に、この新しいウィンドウ クラスに基づいてウィンドウを作成できます。コントロールをスーパークラス化すると、メッセージは先に ATL メッセージ マップによって処理されてからコントロールの元のウィンドウ プロシージャに送られます。したがって、Windows 標準コントロールの既定の動作を変更できます。
ATL コントロール ウィザードを使用して ActiveX コントロールを作成する場合は、標準ウィンドウ クラスに基づくコントロールを追加するように選択できます。この場合は、ウィザードによって CContainedWindow 型のメンバ変数が ActiveX コントロールのクラスに追加されます。次に、CContainedWindow::Create は、指定したウィンドウ クラスをスーパークラス化するウィンドウを作成します。このウィンドウは CContainedWindow::WindowProc を使用し、メッセージ マップを通じてメッセージを送ります。メッセージでさらに処理が必要な場合は、ウィンドウ クラスの元のウィンドウ プロシージャにそのメッセージが送られます。
SUBEDIT サンプル コードのチェック (AtlEdit.h)
CAtlEdit クラスのコンストラクタは、m_bWindowOnly メンバ変数を TRUE に設定します。これで、コントロールがウィンドウなしのコントロールとしてアクティブになることはありません。
CContainedWindow のメンバ変数 m_EditCtrl は、CAtlEdit コンストラクタによって初期化されます。CContainedWindow コンストラクタでは、スーパークラス化されるウィンドウ クラスの名前 (この例では "EDIT")、メッセージ マップを含む CAtlEdit クラスへのポインタ、および m_EditCtrl のメッセージを処理するメッセージ マップの識別子という 3 つのパラメータを使用します。既定では、m_EditCtrl は ALT_MSG_MAP マクロで宣言される代替メッセージ マップを使用します。
既定のメッセージ マップでは、CAtlEdit コントロールに送られる WM_CREATE メッセージと WM_CTLCOLOREDIT メッセージのハンドラ関数名を宣言します。OnCreate ハンドラは、CContainedWindow::Create を呼び出して m_EditCtrl のウィンドウを作成します。OnCtlColorEdit ハンドラは、m_EditCtrl の新しい背景色とテキストの色を指定します。
代替メッセージ マップでは、m_EditCtrl に送られる WM_CHAR メッセージのハンドラ関数を宣言します。このハンドラは記号や数字ではなく文字だけを受け入れ、Windows の Edit クラスによって定義された元のウィンドウ プロシージャに WM_CHAR メッセージを渡します。
キーワード
このサンプルでは、次のキーワードを使用します。
CComCoClass; CComControl; CComModule::GetClassObject; CComModule::GetLockCount; CComModule::Init; CComModule::RegisterServer; CComModule::Term; CComModule::UnregisterServer; CComObjectRoot; CContainedWindow::DefWindowProc; DisableThreadLibraryCalls; GetStockObject; GetWindowRect; IDataObjectImpl; IDispatchImpl; IOleControlImpl; IOleInPlaceActiveObjectImpl; IOleInPlaceObjectWindowlessImpl; IOleInPlaceObjectWindowlessImpl::SetObjectRects; IOleObjectImpl; IPersistStorageImpl; IPersistStreamInitImpl; IProvideClassInfo2Impl; IQuickActivateImpl; ISpecifyPropertyPagesImpl; IViewObjectExImpl; SetBkColor; SetTextColor; SetWindowPos