次の方法で共有


SUBEDIT サンプル : Windows 標準コントロールのスーパークラス化

更新 : 2007 年 11 月

SUBEDIT サンプルでは、Windows 標準エディット コントロールをスーパークラス化する ATL コントロールの作成方法を示します。

SUBEDIT 属性サンプルは、このサンプルの属性付きバージョンです。

y1w6aa0t.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。

サンプルとそのインストール手順を取得するには

  • Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。

    詳細については、「サンプル ファイルの格納場所」を参照してください。

  • 使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。

  • サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

このサンプルをビルドして実行するには

  1. ソリューション ファイル SubEdit.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. サンプルのビルド後に、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_EditCtrlALT_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

参照

その他の技術情報

ATL サンプル