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