Question

Dans les applications Windows je travaille, nous avons une coutume cadre qui se trouve directement au-dessus de Win32 (ne demandez pas).Lorsque nous créons une fenêtre, notre pratique normale consiste à mettre this dans la fenêtre de l'utilisateur de la zone de données via SetWindowLong(hwnd, GWL_USERDATA, this), qui nous permet d'avoir une MFC-comme rappel ou une solution étroitement intégrée WndProc, en fonction.Le problème est que cela ne fonctionnera pas sur Win64, depuis LONGTEMPS, n'est que de 32 bits de large.Ce qui est une meilleure solution à ce problème qui fonctionne sur les versions 32 et 64 bits des systèmes?

Était-ce utile?

La solution

SetWindowLongPtr a été créé pour remplacer SetWindowLong dans ces instances.C'est LONG_PTR paramètre vous permet de stocker un pointeur 32 bits ou 64 bits de compilations.

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

Rappelez-vous que les constantes ont changé aussi, ainsi, l'utilisation ressemble maintenant à:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

Aussi, ne pas oublier que maintenant pour récupérer le pointeur, vous devez utiliser GetWindowLongPtr:

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

Et l'utilisation ressemblerait (encore une fois, avec le changement des constantes):

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

Autres conseils

L'autre alternative est SetProp/RemoveProp (Lorsque vous êtes sous-classement d'une fenêtre qui utilise déjà GWLP_USERDATA)

Une autre bonne alternative est d'ATL style médiateur de la WNDPROC, pour plus d'info sur ce point, voir

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top