On Wednesday, 22 May 2013 at 21:22:52 UTC, Diggory wrote:
On Wednesday, 22 May 2013 at 20:25:40 UTC, Simen Kjaeraas wrote:
On 2013-05-22, 21:30, D-sturbed wrote:

Hello, is there a way to wrap a WindowProc (so "LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) nothrow") in a class and to link it to a WindowClass without puting it as "static" ?

Because defacto every datum used in the WindowProc must also be static. The problem technically is that if "static" is not specified, the compiler won't allow this: "MyWinClass.lpfnWndProc = &TheWindowProcInMyClass".

I've also tried this: "MyWinClass.lpfnWndProc = (&TheWindowProcInMyClass).funcptr" but, while it compiles, it drastically fails at the run-time...

Not possible, no. What you *can* do is have some way to translate from hwnd to class instance, and fetch the right instance inside the static
wndProc to call a member function on that.

If you are only going to have one window you can store the "this" pointer in a global variable.

If you want to have multiple windows each with messages going to an instance of a class, you need to do the following: - Specify the "this" pointer as the lpParam argument to CreateWindow
- Hook up a static WndProc function
- Have the static function handle a WM_NCCREATE message as follows: - Cast the "lParam" parameter to a CREATESTRUCT* and retrieve the "this" pointer from the "lpCreateParams" member. - Use "SetWindowLongPtr" to set the GWLP_USERDATA property of the window "hwnd" to the "this" pointer
- Have the static function handle all messages as follows:
- Use "GetWindowLongPtr" to get the GWLP_USERDATA property of the window "hwnd" to get the "this" pointer - Pass the message on to a non-static WndProc in the class using the discovered "this" pointer

You also need to make sure that there is a separate reference to the class instance for as long as the window exists, because the garbage collector will not scan the window properties and so may think the object is garbage otherwise.

Yes I'm in the "multiple Window case", every window is wraped in a class and has its own message handler. I know that Win, in its callback system, often lets you retrieve a pointer to something, and I haven't get it was possible in this case...(which is you seem to describe). I will try this tomorrow.

Reply via email to