Quelle est la meilleure façon d'envoyer un flottant dans un message Windows à l'aide d'opérateurs de casting C++?Comment envoyer des flottants dans les messages de la fenêtre
La raison pour laquelle je pose la question est que l'approche qui m'est apparue en premier ne fonctionnait pas. Pour mémoire j'utilise la fonction standard de win32 pour envoyer des messages:
PostWindowMessage(UINT nMsg, WPARAM wParam, LPARAM lParam)
Ce qui ne fonctionne pas:
- En utilisant
static_cast<WPARAM>()
ne fonctionne pas depuisWPARAM
est typedef àUINT_PTR
et fera une conversion numérique de float à int, tronquant effectivement la valeur du float. L'utilisation dereinterpret_cast<WPARAM>()
ne fonctionne pas car elle est destinée à être utilisée avec des pointeurs et échoue avec une erreur de compilation.
Je peux penser à deux solutions de contournement au moment:
- En utilisant
reinterpret_cast
conjointement avec l'adresse de l'opérateur:float f = 42.0f; ::PostWindowMessage(WM_SOME_MESSAGE, *reinterpret_cast<WPARAM*>(&f), 0);
- L'utilisation d'un syndicat:
union { WPARAM wParam, float f }; f = 42.0f; ::PostWindowMessage(WM_SOME_MESSAGE, wParam, 0);
Lequel de ceux-ci sont préférés? Y a-t-il une autre manière plus élégante d'accomplir ceci?
Je ne recommanderais pas d'envoyer des pointeurs aux temporaires via quelque chose appelé "PostWindowMessage" car il est supposé être asynchrone. –
Le pointeur est déréférencé lors de l'appel (l'étoile avant la distribution), aucune adresse temporaire n'est envoyée à PostWindowMessage –
@Kirill Je n'émets pas de pointeurs sur les temporaires. Je prends l'adresse du flottant, en jetant cette adresse à un pointeur vers un WPARAM et en résolvant cette adresse dans un WPARAM qui est passé par la valeur. Les pointeurs sont seulement utilisés pour tromper le compilateur en ne convertissant pas la valeur. –