クイックサニティチェック:ファンクターを使用してウィンドウをサブクラス化することは可能ですか?win procでデータを利用できるようにしたいという状況に遭遇していますが、GWLP_USERDATAはすでに使用されています。ファンクターは良い代替手段のように思えますが、私はそれを機能させるのに苦労しています。
基本は次のとおりです。
class MyWinProc { // Win Proc Functor
public:
MyWinProc(ExternalClass* obj, HWND window) :
obj(obj), window(window) {
oldWinProc = SubclassWindow(window, this); // Apply Subclass
}
virtual ~MyWinProc() {
SubclassWindow(window, oldWinProc); // Remove Subclass
}
LRESULT CALLBACK operator()(HWND, UINT, WPARAM, LPARAM) {
switch( uMsg ) {
case WM_MOUSEMOVE: {
obj->onMouseMove(/*etc*/);
break;
}
}
return CallWindowProc(oldWinProc, hWnd, uMsg, wParam, lParam);
}
private:
ExternalClass* obj;
HWND window;
WNDPROC oldWinProc;
};
すべてうまくいっているように見えますが、メッセージポンプでDispatchMessage()を押すと、「違反書き込み場所0x00000000にアクセス」します。これは明らかに良い兆候ではありません。上記のコードへの呼び出しを削除すると、人生は再び幸せになります。:(それで、これは可能でさえありますか、それとも私はそれを完全に間違った方法で行っていますか?