ATLウィンドウクラスを事前に登録します
質問
私は、プロジェクトのATLとWTLの組み合わせを使用していますが、次のようになりますCWindowImpl
から自分のクラスを、派生しています:
class CMyControl : public CWindowImpl<CMyControl>
{
public:
DECLARE_WND_CLASS(_T("MyClassName"))
...
BEGIN_MSG_MAP(CMyControl)
...
END_MSG_MAP()
};
これは、すべて良いです、と私はコントロールのインスタンスを作成するためにCMyControl::Create
を使用する場合、それはフードの下のように正常に動作し、CWindowImpl::Create
機能は、(MyClassName
と呼ばれるこのケースでは)のWin32クラスを登録します。
しかし、それはこの動作がある - インスタンスが作成されたときのWin32クラスが登録されている - それは私に頭痛を引き起こしています。私は、私は、Win32のCreateWindowEx
コールを使用して、ウィンドウを生成する他のサードパーティのライブラリとクラス名を使用することができますので、アップフロントクラスを登録することができるようにしたいが、私はこれを行うための簡単な方法を見つけることができません。現在、私はstatic
クラス名としてCreateWindowEx
を使用することによってこの問題を回避し、それに私のクラスを添付するCMyWindow::SubclassWindow
を使用していますが、これはその場しのぎでます。
誰もが、実際にウィンドウを作成せずCWindowImpl
派生クラスを登録する方法を知っているので、私は成功しCreateWindowEx
するクラス名を渡すことができますか?私はこの問題に遭遇して最初にすることはできませんようATLウィンドウでこれを行うための標準的な方法があったと思ったのでしょう。
解決
何をしようとしていることは動作しません。 ATL / WTLウィンドウの作成はATLクラスを経由する必要があるためです。クラスは、そののこののPTRウィンドウでサンク。このサンクはWNDPROCになり、のこののオブジェクトインスタンスのPTRます。
でWNDPROCのHWNDパラメータを置き換えます あなたはATLのウィンドウは、ボンネットの下に働いていた方法を知っていた場合は、だから、要するに、あなたはこれをしようとするよう努めていないでしょう。あなたはウィンドウクラスを登録することができました場合は、CreateWindowEx関数の呼び出しは、ウィンドウの作成に成功します。しかしWNDPROCサンクは作成されず、そこにあなたのウィンドウを関連付けるために何のオブジェクトインスタンスないだろうし、あなたのメッセージハンドラのどれも呼ばないだろう。あなたはCWindowImplを使用して、ウィンドウを作成することができるかどうか代わりに、参照::それが作成されると、ATLコントロールのHWNDを作成し、サードパーティのライブラリを渡します。
他のヒント
あなたが使用することができます:
WNDPROC pUnusedWndSuperProc;
pUnusedWndSuperProc = NULL;
CMyControl::GetWndClassInfo().Register(&pUnusedWndSuperProc);
あなただけのウィンドウのインスタンスを作成し、隠し、それを維持していない理由は、けれども...私はよく分かりません。オーバーヘッドのその少しが、それは(...あなたがしたい最後のことは、「サンク」といくつかの予期しない、または異常な問題であり、かなり複雑なものである)ウィンドウロジックの根性をいじくる回避ます。
あなたは、Win32 APIを呼び出すことができます RegisterClassEx 直接機能。