I have been working on a library for building win32 windows. MFC and WTL were both great designs at the time that they were introduced, but C++ has moved on.
My goals for this library:
- I wanted to enable the building of window controls like the common controls in windows
- I wanted to draw a distinct line between the window implementation and window usage
- I wanted to remove the window message map from the implementation
- I wanted to eliminate virtual functions from the implementation
- I wanted to enable exception based implementations without requiring them
Code Walkthrough
template<typename WindowClassTag> struct traits { typedef decltype(window_class_traits(WindowClassTag())) type; };
traits
encapsulates the lookup of a type that provides traits. the lookup is done using ADL (argument dependent lookup) using the WindowClassTag to cause the compiler to find the window_class_traits
function that is in the same namespace as the provided WindowClassTag. The type returned from this is arbitrary as long as it has the typedefs that window_class
makes reference to.
template<typename WindowClassTag> LRESULT CALLBACK WindowCallback( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
This is the WNDPROC
implementation where all the magic happens.
template<typename WindowClassTag> class window_class { public: typedef WindowClassTag tag; typedef typename traits<tag>::type traits;
start of the declaration of window_class
including some simple typedefs to shorten usage inside window_class
static ATOM Register(); template<typename T> static ATOM Register(T && t);
overloads of the static Register
function. when called these will register the window class.
private: ~window_class(); window_class(); window_class(window_class&); window_class& operator=(window_class&); };
the end of window_class
which prevents any instances of window_class
from being made, this is a static only class.
The next post will show the Register implementations..
No comments:
Post a Comment