繁体   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