GetWindowLongPtr не возвращается, извлекает пользовательские данные - PullRequest
3 голосов
/ 22 февраля 2011

Раньше я создавал оболочку win32, но потерял файлы ... Так что я собираюсь создать их снова.Проблема в моем маршрутизаторе (процессор статического окна).
Вот мой код

CFramework *wnd = 0; 

// retrieve associated Window instance 
wnd = reinterpret_cast<CFramework *>(::GetWindowLongPtr(hWnd, GWL_USERDATA)); 

// call the windows message handler 
wnd->WndProc(hWnd, msg, wParam, lParam);

return true;

Когда я звоню GetWindowLongPtr, он не получает данные пользователя.
ОБНОВЛЕНИЕ:
Я также устал от этого кода, который использует SetWindowLongPtr

if ( msg == WM_CREATE ) 
   { 
       SetWindowLongPtr( hWnd, GWLP_USERDATA, (LONG)((CREATESTRUCT *)lParam)->lpCreateParams ); 
   } 

   Window *targetApp = (Window*)GetWindowLongPtr( hWnd, GWLP_USERDATA ); 

   if ( targetApp ) 
   { 
       return targetApp->WndProc( hWnd, msg, wParam, lParam ); 
   } 

   return DefWindowProc( hWnd, msg, wParam, lParam ); 

Я использовал свой второй код. ^^^^
Я поставил точку останова в SetWindow ... Кажется, это никогдаПозвони!

1 Ответ

2 голосов
/ 23 февраля 2011

Ваше окно может получать некоторые сообщения до WM_CREATE. Я сделал что-то подобное некоторое время назад, и были сообщения о размерах и позиционировании вместе с WM_NCCREATE, которые пришли до WM_CREATE. Таким образом, вы не должны ожидать увидеть значение в этих сообщениях.

Компилируете ли вы для 32-битной или 64-битной версии? Если он 64-битный, то приведение к LONG может ударить ваш указатель.

И, как сказал Руп в комментариях, вы должны быть уверены, что никто другой не использует WM_USERDATA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...