Pregunta

En las aplicaciones de Windows en las que trabajo, tenemos un marco personalizado que se encuentra directamente encima de Win32 (no preguntes).Cuando creamos una ventana, nuestra práctica normal es poner this en el área de datos de usuario de la ventana mediante SetWindowLong(hwnd, GWL_USERDATA, this), lo que nos permite tener una devolución de llamada similar a MFC o un sistema estrechamente integrado WndProc, dependiendo.El problema es que esto no funcionará en Win64, ya que LONG tiene sólo 32 bits de ancho.¿Cuál es una mejor solución a este problema que funcione en sistemas de 32 y 64 bits?

¿Fue útil?

Solución

EstablecerVentanaLongPtr fue creado para reemplazar EstablecerVentanaLong en estos casos.Su parámetro LONG_PTR le permite almacenar un puntero para compilaciones de 32 o 64 bits.

LONG_PTR SetWindowLongPtr(      
    HWND hWnd,
    int nIndex,
    LONG_PTR dwNewLong
);

Recuerde que las constantes también han cambiado, por lo que el uso ahora se ve así:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

Además, no olvides que ahora para recuperar el puntero, debes usar ObtenerVentanaLongPtr:

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

Y el uso sería así (nuevamente, con constantes modificadas):

LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;

Otros consejos

La otra alternativa es SetProp/RemoveProp (cuando subclases una ventana que ya usa GWLP_USERDATA)

Otra buena alternativa es el procesamiento estilo ATL de WNDPROC; para obtener más información al respecto, consulte

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top