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