ウィンドウプロシージャをウィンドウに添付する際に問題があります。子クラスからWNDPROC関数を呼び出す
BaseWindow
と呼ばれるベースクラスがあり、GWPL_USERDATA
を使用して、子クラスのHandleMessage()
という仮想関数を呼び出します。
しかし、カスタムウィンドウクラスを作成せずにウィンドウプロシージャを変更しようとすると、子プロセスから長い型エラーが発生します。
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BaseWindow *pThis = NULL;
if (uMsg == WM_NCCREATE)
{
CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
pThis = (BaseWindow*)pCreate->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);
pThis->m_hwnd = hwnd;
}
else
{
pThis = (BaseWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
}
if (pThis)
{
return pThis->HandleMessage(uMsg, wParam, lParam);
}
else
{
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{return 0;};
PlayList Class : BaseWindow
SetWindowLong(m_hwnd, GWL_WNDPROC,(long) HandleMessage); //Error
LRESULT PlayList::HandleMessage(UINT message,WPARAM wParam,LPARAM lParam) //Need to attach this window procedure
{}
子手続きが静的である場合、それは動作しますが、しかし、私はその手順で非静的メンバを使用します。
は、ここでは、コードです。
共通のコントロールをサブクラス化したいのですが、この基本クラスを使用しています(多くのコードが冗長であるため)可能ですか? MSDNからhttp://pastebin.com/ME8ks7XK
私がウィンドウクラスを作成して登録すると、handlemessage()がうまく動作しますが(この特定のウィンドウはシステムクラス[listbox]をサブクラス化しています)、なぜ私はそれを使いたくないのですか? CreateWindowEx()でBeacauseをベースクラスの子として欲しいので、全体のコードを繰り返す必要はありません(例えば、pos、size、currはベースクラスに存在するハンドルなど) –
これは不可能ですが、 WindowsのAPIはCで、仮想C++メソッドの呼び出し方法はわかりません。あなたは巨大な車輪を再発明していることを知っていますか? APIをラップするC++クラスライブラリは豊富です。 –
または私はこの1つのウィンドウ(または他のサブクラスのシステムクラス)に例外を作らなければならないでしょう、他の解決策がありますか? –