Я рекомендую установить переменную thread_local
непосредственно перед вызовом CreateWindow
и прочитать ее в вашем WindowProc
, чтобы узнать переменную this
(я предполагаю, что вы контролируете WindowProc
).
Таким образом, у вас будет ассоциация this
/ HWND
в самом первом сообщении, отправленном вам в окно.
При других подходах, предложенных здесь, скорее всего, вы пропустите некоторые сообщения: отправленные до WM_CREATE
/ WM_NCCREATE
/ WM_GETMINMAXINFO
.
class Window
{
// ...
static thread_local Window* _windowBeingCreated;
static thread_local std::unordered_map<HWND, Window*> _hwndMap;
// ...
HWND _hwnd;
// ...
// all error checking omitted
// ...
void Create (HWND parentHWnd, UINT nID, HINSTANCE hinstance)
{
// ...
_windowBeingCreated = this;
::CreateWindow (YourWndClassName, L"", WS_CHILD | WS_VISIBLE, x, y, w, h, parentHWnd, (HMENU) nID, hinstance, NULL);
}
static LRESULT CALLBACK Window::WindowProcStatic (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
Window* _this;
if (_windowBeingCreated != nullptr)
{
_hwndMap[hwnd] = _windowBeingCreated;
_windowBeingCreated->_hwnd = hwnd;
_this = _windowBeingCreated;
windowBeingCreated = NULL;
}
else
{
auto existing = _hwndMap.find (hwnd);
_this = existing->second;
}
return _this->WindowProc (msg, wparam, lparam);
}
LRESULT Window::WindowProc (UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
// ....