簡體   English   中英

如何在窗口消息中發送浮動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM