Binding win32 window to a D class
freeagle
freeagle at inmail.sk
Sat Sep 9 04:34:02 PDT 2006
Serg Kovrov wrote:
> Hello All,
>
> This one should be beaten to death already, but still I do not aware of
> fast/elegant way.
>
> Maybe we could collect all possible solutions on that matter for D in
> one place. Starting in this thread and hopefully move to a wiki page.
>
> As I understand for D there even less available techniques then for C++.
> In case of C++ I am aware of following:
>
> 1. using static method as window procedure and store pointer to class
> instance in with SetWindowLongPtr. when dispatching messages retrieve
> pointer to class with GetWindowLongPtr and call class method. This can't
> be used in D since our pointer might become invalid as GC could swap /
> compact memory. This is covered in "Garbage Collection" article -
> http://digitalmars.com/d/garbage.html
>
> 2. Same as above, but stores class reference in static array/hash and
> used SetWindowLongPtr/GetWindowLongPtr to store index to retrieve class
> from that static array. This actually works for D. But it is most slow
> technique since there we need to call GetWindowLongPtr and lookup for
> class pointer/reference on every windows message.
>
> 3. So called thunking. A hack to store pointer to class method in
> WNDCLASS.lpfnWndProc. Uses inline assembler substitute addresses at
> runtime. Should be faster than other techniques since there is no need
> to constantly call GetWindowLongPtr. Used in ATL/WTL. Could not be used
> in D for same reason as first solution.
>
> Thats seems all. The only available solution (from listed above) for D
> is #2.
>
> I hope there is other methods to solve this problem, and perhaps there
> are completely different approaches to organize win32 window management,
> and I'd like to discuss them here.
>
> Thanks
> --
> serg.
the second approach, without the need for get/setPtr:
class Windows
{
static Window[HWND] _windows;
.
.
.
int windowProc(HWND hwnd, uint message, WPARAM wParam, LPARAM lParam)
{
.
.
.
}
}
extern(Windows)
int
wndProc(HWND hwnd, uint message, WPARAM wParam, LPARAM lParam)
{
Window* wnd = hwnd in Window._windows;
if(wnd !is null)
{
return wnd.windowProc(hwnd, message, wParam, lParam);
}
else
{
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
More information about the Digitalmars-d-dwt
mailing list