[英]How do I send floats in window messages
使用c ++強制轉換運算符在windows消息中發送float的最佳方法是什么?
我問的原因是我首先遇到的方法不起作用。 為了記錄我正在使用標准的win32函數來發送消息:
PostWindowMessage(UINT nMsg, WPARAM wParam, LPARAM lParam)
什么行不通:
static_cast<WPARAM>()
不起作用,因為WPARAM
是對UINT_PTR
並且將執行從float到int的數值轉換,從而有效地截斷float的值。 reinterpret_cast<WPARAM>()
不起作用,因為它用於指針並且因編譯錯誤而失敗。 我現在可以想到兩個解決方法:
reinterpret_cast
與運算符的地址結合使用: \n float f = 42.0f;\n :: PostWindowMessage(WM_SOME_MESSAGE,* reinterpret_cast <WPARAM *>(&f),0);\n
\n union {WPARAM wParam,float f};\n f = 42.0f;\n :: PostWindowMessage(WM_SOME_MESSAGE,wParam,0);\n
哪些是優先考慮的? 有沒有其他更優雅的方式來實現這一目標?
使用reinterpret_cast< WPARAM &>(f)
。 此強制轉換不僅限於指針,它也適用於引用。
你可以使用memcpy:
#include <memory.h>
int main() {
float f = 1.0;
int n;
memcpy( &n, &f, sizeof(f) );
}
我不認為這有一個優雅的解決方案,但無論你做什么,我都會將它包裝在一個函數中,以明確我的目標:
int FloatToInt( float f ) {
int n;
assert( sizeof(n) == sizeof(f) );
memcpy( &n, &f, sizeof(f) );
return n;
}
我更喜歡工會。 這是最清楚,最容易理解的。 它也可能具有最少量的未定義行為。
我將采用一種簡單的方法來獲取指向float
的指針,將其轉換為指向UINT
的指針,然后取消引用生成的指針:
WPARAM wParam = *((UINT*)(&f));
要將其轉換回來,你會做相反的事情。 在指針級別執行強制轉換可確保編譯器不會嘗試在您的背后進行任何“轉換”。
float f = *((float*)(&wParam))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.