如何将 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<bool>
或reinterpret_cast<bool>
或(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<LPARAM>(buf));
@BarmakShemirani 我的想法只是在我的 PostMessage 函数中 void sendDefinedMsg(DWORD_PTR wParam, DWORD_PTR data = 0, 参数是 DWORD_PTR 而不是 LPARAM。所以我想也许保持参数类型与参数【参考方案2】:
我只输入时没有警告:
bool curValue = lParam;
【讨论】:
以上是关于如何将 LPARAM 值转换为我传递的类型的主要内容,如果未能解决你的问题,请参考以下文章
无法将 '[String : AnyObject]?.Type' 类型(又名 'Optional<Dictionary<String, AnyObject>>.Type)的值转