利用自定义消息处理函数的WPARAM或LPARAM参数传递指针
2008-04-29 23:35
417 查看
有自定义消息:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#define WM_TEST WM_USER+121
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
消息处理函数:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
afx_msg void OnTest(WPARAM wParam,LPARAM lParam);
该消息是一个主线程向辅助线程发送数据的消息。
主线程中发送消息的代码:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_param.pDoc=pDoc;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_param.pSpecAnlyz=m_pSpecAnlyz;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// CWinThread* pThread=AfxBeginThread(ThreadTest,static_cast<LPVOID>(&m_param));
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_pTestThread=(CTestThread*)AfxBeginThread(RUNTIME_CLASS(CTestThread));
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Sleep(200);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 必须先把&m_param转化为void*指针,然后才可以进一步强制转化为WPARAM
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_pTestThread->PostThreadMessageW(WM_TEST,(WPARAM)((void*)&m_param),1);// 发送测试消息
m_param为自定义类型,其成员为指针变量,因此 m_param无法强制转化为WPARAM。但是m_param的地址指针和WPARAM一样,都是4个字节,因此可以将m_param的地址指针起那个只转换为WPARAM。在VC.NET2005中,直接转换编译报错。考虑到void * 之后,先将&m_param转化为void*指针,然后才可以进一步强制转化为WPARAM。
同样的,在OnTest中,必须先将wParam强制转换为void * ,然后进一步转换为其他类型。
PS:网上有高手指出,局部指针变量最好不要作为wParam或 lParam传递,因为当消息响应时改变量可能已经不在了。
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#define WM_TEST WM_USER+121
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
消息处理函数:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
afx_msg void OnTest(WPARAM wParam,LPARAM lParam);
该消息是一个主线程向辅助线程发送数据的消息。
主线程中发送消息的代码:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_param.pDoc=pDoc;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_param.pSpecAnlyz=m_pSpecAnlyz;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// CWinThread* pThread=AfxBeginThread(ThreadTest,static_cast<LPVOID>(&m_param));
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_pTestThread=(CTestThread*)AfxBeginThread(RUNTIME_CLASS(CTestThread));
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Sleep(200);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 必须先把&m_param转化为void*指针,然后才可以进一步强制转化为WPARAM
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
m_pTestThread->PostThreadMessageW(WM_TEST,(WPARAM)((void*)&m_param),1);// 发送测试消息
m_param为自定义类型,其成员为指针变量,因此 m_param无法强制转化为WPARAM。但是m_param的地址指针和WPARAM一样,都是4个字节,因此可以将m_param的地址指针起那个只转换为WPARAM。在VC.NET2005中,直接转换编译报错。考虑到void * 之后,先将&m_param转化为void*指针,然后才可以进一步强制转化为WPARAM。
同样的,在OnTest中,必须先将wParam强制转换为void * ,然后进一步转换为其他类型。
PS:网上有高手指出,局部指针变量最好不要作为wParam或 lParam传递,因为当消息响应时改变量可能已经不在了。
相关文章推荐
- 为何在自定义消息处理函数中无法利用wParam或lParam传递指针?
- 利用自定义消息处理函数的WPARAM或LPARAM参数传递指针
- 利用自定义消息处理函数的WPARAM或LPARAM参数传递指针
- 为何在自定义消息处理函数中无法利用wParam或lParam传
- 利用自定义消息处理函数的WPARAM或LPARAM参数传递指针
- 在PostMessage或SendMessage中通过WPARAM或者LPARAM将数组传递给消息处理函数
- 自定义消息中如果需要定义WPARAM和LPARAM,该怎么使用和分配?
- MFC中,我从一个对话框,同时在按钮的消息处理函数中利用DoModal()函数一级一级的创建许多模态对话框,那么怎样从某个子对话框返回第一个对话框呢?
- MFC中自定义消息方法及如何得到消息处理函数的返回值
- 使用VS2012 MFC自定义消息时,处理函数不能返回void类型。
- vc自定义消息处理函数与定时器
- MFC 菜单处理及消息截获(利用虚函数的特性实现)
- Qt5_自定义处理Windows消息函数
- VC++自定义消息处理函数2
- 在MFC中手动添加消息处理函数PreTranslateMessage和自定义消息
- vc 添加自定义消息及消息处理函数分5步
- 通过WPARAM wParam或者LPARAM lParam将数组传递到消息处理函数
- vc自定义消息处理函数与定时器
- 在MFC中手动添加消息处理函数PreTranslateMessage和自定义消息
- 自定义消息中如果需要定义WPARAM和LPARAM,该怎么使用和分配?