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) 呼び出されます。 |
サブクラスウィンドウ | ウィンドウをサブクラス化します。 |
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
Note
CWndClassInfo
は、1 つのウィンドウ クラスの情報のみを管理するため、CWindowImpl
のインスタンスによって作成された各ウィンドウは、同じウィンドウ クラスに基づきます。
CWindowImpl
は、ウィンドウのサブクラス化もサポートします。 SubclassWindow
メソッドは、既存のウィンドウを CWindowImpl
オブジェクトにアタッチし、ウィンドウ プロシージャを CWindowImpl::WindowProc
に変更します。 CWindowImpl
の各インスタンスは、別のウィンドウをサブクラス化できます。
Note
特定の CWindowImpl
オブジェクトに対して、Create
または SubclassWindow
を呼び出します。 同じオブジェクトで両方のメソッドを呼び出さないでください。
CWindowImpl
に加えて、ATL には、別のオブジェクトに含まれるウィンドウを作成する CContainedWindow が用意されています。
基底クラスのデストラクター (CWindowImplRoot
) を使用すれば、ウィンドウが消えてからオブジェクトが破棄されるように保証できます。
CWindowImpl
は CWindowImplBaseT
から派生し、それは CWindowImplRoot
から派生し、それは TBase
と CMessageMap から派生します。
詳細情報: | 参照トピック |
---|---|
コントロールの作成 | ATL チュートリアル |
ATL でのウィンドウの使用 | ATL ウィンドウ クラス |
ATL プロジェクト ウィザード | ATL プロジェクトの作成 |
継承階層
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
[in] ウィンドウのスタイル。 この値は、ウィンドウ用の特徴クラスによって提供されるスタイルと組み合わされます。 既定値を使用すると、スタイルに対するフル コントロールが特徴クラスに与えられます。 使用可能な値の一覧については、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
[入力] メッセージ固有の追加情報。
戻り値
メッセージ処理の結果。
解説
既定では、DefWindowProc
は CallWindowProc 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 で宣言) を使用して、メッセージを適切なハンドラーに送信します。 必要に応じて、WindowProc
は DefWindowProc を呼び出して、追加のメッセージ処理を行います。 最終メッセージが処理されない場合、WindowProc
では次のことを行います。
ウィンドウがサブクラス化されていない場合、サブクラス化の解除を実行します。
m_hWnd
を消去します。ウィンドウが破棄される前に OnFinalMessage を呼び出します。
WindowProc
をオーバーライドして、メッセージを処理するための別のメカニズムを提供することができます。