CWindowImpl クラス

ウィンドウを作成またはサブクラス化するためのメソッドを提供します。

重要

このクラスとそのメンバーは、Windows ランタイムで実行するアプリケーションで使用することはできません。

構文

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT<TBase, TWinTraits>

パラメーター

T
CWindowImpl から派生した新しいクラス。

TBase
クラスの基底クラス。 既定では、基底クラスは CWindow です。

TWinTraits
ウィンドウのスタイルを定義する traits クラス。 既定値は、CControlWinTraits です。

メンバー

パブリック メソッド

名前 説明
CWindowImpl::Create ウィンドウを作成します。

CWindowImplBaseT メソッド

名前 説明
DefWindowProc 既定のメッセージ処理を提供します。
GetCurrentMessage 現在のメッセージを返します。
GetWindowProc 現在のウィンドウ プロシージャを返します。
OnFinalMessage 最後のメッセージが受信された後に (通常は WM_NCDESTROY) 呼び出されます。
SubclassWindow ウィンドウをサブクラス化します。
UnsubclassWindow 前にサブクラス化されたウィンドウを復元します。

静的メソッド

名前 説明
GetWndClassInfo ウィンドウ クラスの情報を管理する CWndClassInfo の静的インスタンスを返します。
WindowProc ウィンドウに送信されるメッセージを処理します。

データ メンバー

名前 説明
m_pfnSuperWindowProc ウィンドウ クラスの元のウィンドウ プロシージャをポイントします。

解説

CWindowImpl を使用して、新しいウィンドウを作成したり、既存のウィンドウをサブクラス化したりすることができます。 CWindowImpl ウィンドウ プロシージャでは、メッセージを適切なハンドラーに送信するのに、メッセージ マップが使用されます。

CWindowImpl::Create では、CWndClassInfo によって管理されるウィンドウ クラスの情報に基づいてウィンドウを作成します。 CWindowImpl には、DECLARE_WND_CLASS マクロが含まれています。これは、CWndClassInfo によって新しいウィンドウ クラスが登録されることを意味します。 既存のウィンドウ クラスをスーパークラス化する場合は、クラスを CWindowImpl から派生し、DECLARE_WND_SUPERCLASS マクロを含めます。 この場合、CWndClassInfo は、既存のクラスに基づくウィンドウ クラスを登録しますが、CWindowImpl::WindowProc を使用します。 次に例を示します。

class ATL_NO_VTABLE CMyWindow :
   OtherInheritedClasses
   public CComControl<CMyWindow>
          // CComControl derives from CWindowImpl
{
public:
   // 1. The NULL parameter means ATL will generate a
   //    name for the superclass
   // 2. The "EDIT" parameter means the superclass is
   //    based on the standard Windows Edit box
   DECLARE_WND_SUPERCLASS(NULL, _T("EDIT"))

   // Remainder of class declaration omitted

注意

CWndClassInfo は、1 つのウィンドウ クラスの情報のみを管理するため、CWindowImpl のインスタンスによって作成された各ウィンドウは、同じウィンドウ クラスに基づきます。

CWindowImpl は、ウィンドウのサブクラス化もサポートします。 SubclassWindow メソッドは、既存のウィンドウを CWindowImpl オブジェクトにアタッチし、ウィンドウ プロシージャを CWindowImpl::WindowProc に変更します。 CWindowImpl の各インスタンスは、別のウィンドウをサブクラス化できます。

Note

特定の CWindowImpl オブジェクトに対して、Create または SubclassWindow を呼び出します。 同じオブジェクトで両方のメソッドを呼び出さないでください。

CWindowImpl に加えて、ATL には、別のオブジェクトに含まれるウィンドウを作成する CContainedWindow が用意されています。

基底クラスのデストラクター (CWindowImplRoot) を使用すれば、ウィンドウが消えてからオブジェクトが破棄されるように保証できます。

CWindowImplCWindowImplBaseT から派生し、それは CWindowImplRoot から派生し、それは TBaseCMessageMap から派生します。

詳細情報 参照先
コントロールの作成 ATL チュートリアル
ATL でのウィンドウの使用 ATL ウィンドウ クラス
ATL プロジェクト ウィザード ATL プロジェクトの作成

継承階層

CMessageMap

TBase

CWindowImplRoot

CWindowImplBaseT

CWindowImpl

要件

ヘッダー: atlwin.h

CWindowImpl::Create

新しいウィンドウ クラスに基づいてウィンドウを作成します。

HWND Create(
    HWND hWndParent,
    _U_RECT rect = NULL,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

パラメーター

hWndParent
[入力] 親またはオーナー ウィンドウへのハンドル。

rect
[入力] ウィンドウの位置を指定する RECT 構造体。 RECT は、ポインターまたは参照渡しによって渡すことができます。

szWindowName
[入力] ウィンドウの名前を指定します。 既定値は NULL です。

dwStyle
[入力] ウィンドウのスタイル。 この値は、ウィンドウ用の特徴クラスによって提供されるスタイルと組み合わされます。 既定値を使用すると、スタイルに対するフル コントロールが特徴クラスに与えられます。 使用可能な値の一覧については、Windows SDK の CreateWindow に関するページを参照してください。

dwExStyle
[入力] 拡張ウィンドウ スタイル。 この値は、ウィンドウ用の特徴クラスによって提供されるスタイルと組み合わされます。 既定値を使用すると、スタイルに対するフル コントロールが特徴クラスに与えられます。 使用可能な値の一覧については、Windows SDK の CreateWindowEx に関するページを参照してください。

MenuOrID
[入力] 子ウィンドウの場合は、ウィンドウ識別子です。 最上位ウィンドウの場合は、ウィンドウのメニュー ハンドル。 既定値は 0U です。

lpCreateParam
[入力] ウィンドウ作成データへのポインター。 詳細については、CreateWindowEx に関する記事の最後のパラメーターの説明を参照してください。

戻り値

成功した場合は、新しく作成されたウィンドウへのハンドル。 それ以外の場合は NULL。

解説

Create では、ウィンドウ クラスが登録されていない場合は、最初にそれを登録します。 新しく作成されたウィンドウは、自動的に CWindowImpl オブジェクトにアタッチされます。

Note

既に SubclassWindow を呼び出している場合は、Create を呼び出さないでください。

既存のウィンドウ クラスに基づくウィンドウ クラスを使用するには、クラスを CWindowImpl から派生し、DECLARE_WND_SUPERCLASS マクロを含めます。 既存のウィンドウ クラスのウィンドウ プロシージャは m_pfnSuperWindowProc に保存されます。 詳細については、CWindowImpl の概要に関するページを参照してください。

Note

0 を MenuOrID パラメーターの値として使用する場合は、コンパイラ エラーを回避するために、0U (既定値) として指定する必要があります。

CWindowImpl::DefWindowProc

メッセージ マップによって処理されないメッセージを処理するため、WindowProc によって呼び出されます。

LRESULT DefWindowProc(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

LRESULT DefWindowProc();

パラメーター

uMsg
[入力] ウィンドウに送信されたメッセージ。

wParam
[入力] メッセージ固有の追加情報。

lParam
[入力] メッセージ固有の追加情報。

戻り値

メッセージ処理の結果。

解説

既定では、DefWindowProcCallWindowProc Win32 関数を呼び出して、メッセージ情報を m_pfnSuperWindowProc で指定されたウィンドウ プロシージャに送信します。

パラメーターが指定されていない関数は、現在のメッセージから必要なパラメーターを自動的に取得します。

CWindowImpl::GetCurrentMessage

MSG 構造体にパッケージ化されている現在のメッセージを返します。

const MSG* GetCurrentMessage();

戻り値

現在のメッセージ。

CWindowImpl::GetWindowProc

現在のウィンドウ プロシージャである WindowProc を返します。

virtual WNDPROC GetWindowProc();

戻り値

現在のウィンドウ プロシージャ。

解説

ウィンドウ プロシージャを独自のものに置き換えるには、このメソッドをオーバーライドします。

CWindowImpl::GetWndClassInfo

Create によって呼び出され、ウィンドウクラス情報にアクセスします。

static CWndClassInfo& GetWndClassInfo();

戻り値

CWndClassInfo の静的インスタンス。

解説

既定で、CWindowImpl では、新しいウィンドウ クラスを指定するための DECLARE_WND_CLASS マクロを介してこのメソッドを取得します。

既存のウィンドウ クラスをスーパークラス化する場合は、クラスを CWindowImpl から派生し、DECLARE_WND_SUPERCLASS マクロを含めて、GetWndClassInfo をオーバーライドします。 詳細については、CWindowImpl の概要に関するページを参照してください。

DECLARE_WND_CLASS および DECLARE_WND_SUPERCLASS マクロを使用することに加えて、GetWndClassInfo を独自の実装でオーバーライドすることもできます。

CWindowImpl::m_pfnSuperWindowProc

ウィンドウに応じて、次のウィンドウ プロシージャのいずれかを指します。

WNDPROC m_pfnSuperWindowProc;

解説

ウィンドウの種類 ウィンドウ プロシージャ
新しいウィンドウ クラスに基づくウィンドウ。DECLARE_WND_CLASS マクロを介して指定されています。 DefWindowProc Win32 関数。
既存のクラスを変更するウィンドウクラスに基づくウィンドウ。DECLARE_WND_SUPERCLASS マクロを使用して指定されています。 既存のウィンドウ クラスのウィンドウ プロシージャ。
サブクラス化されたウィンドウ。 サブクラス化されたウィンドウの元のウィンドウ プロシージャ。

CWindowImpl::DefWindowProc からは、m_pfnSuperWindowProc に保存されているウィンドウ プロシージャにメッセージ情報が送信されます。

CWindowImpl::OnFinalMessage

最後のメッセージを受信した後に呼び出されます (通常は WM_NCDESTROY)。

virtual void OnFinalMessage(HWND hWnd);

パラメーター

hWnd
[入力] 破棄されているウィンドウへのハンドル。

解説

OnFinalMessage の既定の実装では何も行われませんが、クリーンアップを処理してからウィンドウを破棄するように、この関数をオーバーライドすることができます。 ウィンドウの破棄時にオブジェクトを自動的に削除する場合は、この関数を呼び出 delete this; すことができます。

CWindowImpl::SubclassWindow

hWnd によって識別されるウィンドウをサブクラス化し、CWindowImpl オブジェクトにアタッチします。

BOOL SubclassWindow(HWND hWnd);

パラメーター

hWnd
[入力] サブクラス化されているウィンドウへのハンドル。

戻り値

ウィンドウが正常にサブクラス化された場合は TRUE。それ以外の場合は FALSE。

解説

サブクラス化されたウィンドウで CWindowImpl::WindowProc が使用されるようになりました。 元のウィンドウ プロシージャは m_pfnSuperWindowProc に保存されます。

Note

既に Create を呼び出している場合は、SubclassWindow を呼び出さないでください。

CWindowImpl::UnsubclassWindow

サブクラス化されたウィンドウを CWindowImpl オブジェクトからデタッチし、m_pfnSuperWindowProc に保存された元のウィンドウ プロシージャを復元します。

HWND UnsubclassWindow();

戻り値

以前にサブクラス化されたウィンドウへのハンドル。

CWindowImpl::WindowProc

この静的関数では、ウィンドウ プロシージャを実装します。

static LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

パラメーター

hWnd
[入力] ウィンドウへのハンドル。

uMsg
[入力] ウィンドウに送信されたメッセージ。

wParam
[入力] メッセージ固有の追加情報。

lParam
[入力] メッセージ固有の追加情報。

戻り値

メッセージ処理の結果。

解説

WindowProc では、既定のメッセージ マップ (BEGIN_MSG_MAP で宣言) を使用して、メッセージを適切なハンドラーに送信します。 必要に応じて、WindowProcDefWindowProc を呼び出して、追加のメッセージ処理を行います。 最終メッセージが処理されない場合、WindowProc では次のことを行います。

  • ウィンドウがサブクラス化されていない場合、サブクラス化の解除を実行します。

  • m_hWnd を消去します。

  • ウィンドウが破棄される前に OnFinalMessage を呼び出します。

WindowProc をオーバーライドして、メッセージを処理するための別のメカニズムを提供することができます。

関連項目

BEGIN_MSG_MAP
CComControl クラス
クラスの概要