Вот разработка предложения RbMm, которое я сам использую в своем собственном коде. Умный указатель здесь мало что может предложить, поэтому в его использовании действительно нет особого смысла. Обратите внимание, что для краткости я использовал приведение в стиле C, но вы можете использовать reinterpret_cast
, если хотите.
class MyWindowData { ... };
MyWindowData *window_data = new MyWindowData;
HWND hWnd = CreateWindow (... ... ..., (LPARAM) window_data);
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_NCCREATE:
CREATESTRUCT *cs = (CREATESTRUCT *) lParam;
SetWindowLongPtr (hWnd, GWLP_USERDATA, cs->lpCreateParams);
break;
case NC_DESTROY:
MyWindowData *window_data = (MyWindowData *) GetWindowLongPtr (hWnd, GWLP_USERDATA);
SetWindowLongPtr (hWnd, GWLP_USERDATA, 0);
delete window_data;
break;
}
// return something here;
}
Затем вы можете выполнить:
MyWindowData *window_data = (MyWindowData *) GetWindowLongPtr (hWnd, GWLP_USERDATA);
, чтобы извлеките MyWindowData
в любое время, когда вам это нужно, но проверьте, не возвращается ли ноль в случае, если WM_NCCREATE
не является первым сообщением, полученным вашим WNDPROC
согласно комментариям.