如何在窗口消息中发送浮动

时间:2010-03-23 09:33:58

标签: c++ winapi

使用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与运算符的地址结合使用:
    float f = 42.0f;
    ::PostWindowMessage(WM_SOME_MESSAGE, *reinterpret_cast<WPARAM*>(&f), 0);
    
  • 使用联合:
    union { WPARAM wParam, float f };
    f = 42.0f;
    ::PostWindowMessage(WM_SOME_MESSAGE, wParam, 0);
    

其中哪些是优先考虑的?还有其他更优雅的方法来实现这个目标吗?

4 个答案:

答案 0 :(得分:3)

使用reinterpret_cast< WPARAM &>(f)。此强制转换不仅限于指针,它也适用于引用。

答案 1 :(得分:2)

您可以使用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;
}

答案 2 :(得分:0)

我更喜欢工会。这是最清楚,最容易理解的。它也可能具有最少量的未定义行为。

答案 3 :(得分:0)

我会采用一种简单的方法来获取指向float的指针,将其转换为指向UINT的指针,然后取消引用结果指针:

WPARAM wParam = *((UINT*)(&f));

要将其转换回来,你会做相反的事情。在指针级执行强制转换可确保编译器不会尝试在您的背后进行任何“转换”。

float f = *((float*)(&wParam))