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..