如何将 LPARAM 值转换为我传递的类型

Posted

技术标签:

【中文标题】如何将 LPARAM 值转换为我传递的类型【英文标题】:how to convert LPARAM value to the type I passed 【发布时间】:2018-03-26 05:26:04 【问题描述】:

在我的 c++ 代码中,我定义了一条消息来通知其他类执行某些操作。代码如下:

在 mainFrm.h 中:

...
afx_msg LRESULT OnHandleDialog(WPARAM wParam, LPARAM lParam);
...

在 mainFrm.cpp 中

LRESULT CMainFrame::OnHandleDialog(WPARAM wParam, LPARAM lParam)

    switch (wParam)
    
        case Define::myCondition:
        
            myFunction->doSomethingHere(static_cast<bool>(lParam)); //there is  warning C4800: 'LPARAM' : forcing value to bool 'true' or 'false' (performance warning)         
            return 0;
        

    
    return 0;


BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
...
    ON_MESSAGE(WM_DEFINED_DIALOG, OnHandleDialog) //My Message Mapping here
....
END_MESSAGE_MAP()

在另一个文件中,MyCode.h

void sendDefinedMsg(DWORD_PTR wParam, DWORD_PTR data = 0)

    pNotifyWnd->PostMessage(WM_DEFINED_DIALOG, wParam, data);

在另一个文件中,Mycode.cpp

sendDefinedMsg( myCondition, false);
....
sendDefinedMsg( myCondition, true);
....

所以,你可以在上面的代码中看到,我想在这里获取message参数:

myFunction->doSomethingHere(static_cast<bool>(lParam));

问题是:无论我将LPARAM lParam 转换为什么,使用static_cast&lt;bool&gt;reinterpret_cast&lt;bool&gt;(bool)。他们都给我一个警告:

警告 C4800: 'LPARAM' : 强制值为 bool 'true' 或 'false'(性能警告)

所以我的问题是:我应该如何将lParam 转换为我原来传递的参数true/false

【问题讨论】:

warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning) 的可能重复项 - 尝试doSomethingHere(lParam != 0) LPARAM 是指针类型,实际上经常被用作指针,编译器认为将其转换为整数类型是一个可能的错误。它经常是,只是不在这里。将它与 nullptr 进行比较会让它感到高兴。或者使用消息破解宏,LOWORD(lparam) 搞定。 【参考方案1】:

我对代码进行了以下更改以实现我的目标:

在另一个文件中,Mycode.cpp

sendDefinedMsg( myCondition, static_cast<DWORD_PTR>(0));
....
sendDefinedMsg( myCondition, static_cast<DWORD_PTR>(1));
....

在消息处理代码中,有以下一些变化:

bool curValue = static_cast<DWORD_PTR>(lParam) == 0 ? false : true;
myFunction->doSomethingHere(curValue);

然后警告消失了,值是正确的。

其实现在传真/假应该没问题。也许有人告诉我如何传递其他类型的值,例如。字符串或整数等。

【讨论】:

我的建议doSomethingHere(lParam != 0)doSomethingHere(lParam != nullptr) 有什么问题?您的投射基本上是将LONG_PTR 更改为ULONG_PTR,如果不涉及符号比较,则没有必要 - 要传递字符串,以const wchar_t* buf = L"123"; 开头,然后将其传递为::PostMessage(hwnd, WM_USER + 1, 0, reinterpret_cast&lt;LPARAM&gt;(buf)); @BarmakShemirani 我的想法只是在我的 PostMessage 函数中 void sendDefinedMsg(DWORD_PTR wParam, DWORD_PTR data = 0, 参数是 DWORD_PTR 而不是 LPARAM。所以我想也许保持参数类型与参数【参考方案2】:

我只输入时没有警告:

bool curValue = lParam;

【讨论】:

以上是关于如何将 LPARAM 值转换为我传递的类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将列中的连接值转置为行

如何将指针转换为我在 C++ 中输入的类型?

无法将 '[String : AnyObject]?.Type' 类型(又名 'Optional<Dictionary<String, AnyObject>>.Type)的值转

如何在Scala中用列表值转置地图

包装类

如何将特定值传递给转换器参数?