In Win32 API a window has the pointer to a user defined version of WndProc function that handling its messages.
There are some ways to cover this low-level mechanism
Suggestion: make WndProc
virtual in your window base class. Request Windows to allocate extra memory for each window instance big enough to store a pointer (use cbWndExtra
). When creating a window, put a pointer to your windows class object into this extra memory associated with each window instance using SetWindowLongPtr
. In your static sWndProc
, retrieve this pointer using GetWindowLongPtr
and call your window base class function virtual WndProc
. In my opinion, it's more neat way than having a whole extra map object dedicated to dispatching WndProc
calls.
EDIT: Plus, you do realize, in your code you are trying to register Windows window class every time you create an object of your window class? If you create just one window this is technically fine, I guess, but even then it's error-prone design. Windows window class should be registered just once, not every time you create a window with this Windows window class.
EDIT: Also, in your code, if you are not processing Windows message in your WndProc
, you code will call DefWindowProc
twice for this message: first time in member function within switch
clause, second time in static sWndProc
. DefWindowProc
shouldn't be called twice on the same message.
EDIT: Sorry, I missed your actual question before somehow, I thought your post was about design, not about WM_CREATE
. In order to process WM_NCCREATE
, WM_NCCALCSIZE
or WM_CREATE
in a uniform way, you can set lpParam
in call to CreateWindowEx
to, again, pointer to the object of your window class. This parameter will be passed to your static sWndProc
as a member of CREATESTRUCT
with WM_NCCREATE
and WM_CREATE
. You can process, say, WM_NCCREATE
(first message to be sent) inside static sWndProc
, get this pointer to your object, use SetWindowLongPtr
to put it into window instance extra memory, and then use it to call member function WndProc
(just be careful about calling not fully created object of your windows class, if you call CreateWindowEx
from its constructor). This way, you don't need to worry about "low-level" Windows message dispatching anywhere else in your program. You, of course, will still need your member function WndProc
to dispatch messages to actual function calls.