编程平台是VS2010
LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
{
int nTmpt = 0;
for(int i=0 ;i <=(int)wParam;i++)
{
nTmpt = nTmpt+i;
}
Sleep(500);
::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
return 0;
}// CCalculateThread 消息处理程序BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
//AFX_MSG_MAP(CCalculateThread)
//ON_THREAD_MESSAGE(WM_CALCULATE,&CCalculateThread::OnCalculate)
ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
END_MESSAGE_MAP()出错:
1>ClCompile:
1> 所有输出均为最新。
1> CalculateThread.cpp
1>c:\users\venuslee\documents\visual studio 2010\projects\multithread7\multithread7\calculatethread.cpp(51): error C2440: “static_cast”: 无法从“LONG (__thiscall CCalculateThread::* )(UINT,LONG)”转换为“void (__thiscall CWinThread::* )(WPARAM,LPARAM)”
1> 在匹配目标类型的范围内没有具有该名称的函数
1>
1>生成失败。
1>
1>已用时间 00:00:00.72
LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
{
int nTmpt = 0;
for(int i=0 ;i <=(int)wParam;i++)
{
nTmpt = nTmpt+i;
}
Sleep(500);
::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
return 0;
}// CCalculateThread 消息处理程序BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
//AFX_MSG_MAP(CCalculateThread)
//ON_THREAD_MESSAGE(WM_CALCULATE,&CCalculateThread::OnCalculate)
ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
END_MESSAGE_MAP()出错:
1>ClCompile:
1> 所有输出均为最新。
1> CalculateThread.cpp
1>c:\users\venuslee\documents\visual studio 2010\projects\multithread7\multithread7\calculatethread.cpp(51): error C2440: “static_cast”: 无法从“LONG (__thiscall CCalculateThread::* )(UINT,LONG)”转换为“void (__thiscall CWinThread::* )(WPARAM,LPARAM)”
1> 在匹配目标类型的范围内没有具有该名称的函数
1>
1>生成失败。
1>
1>已用时间 00:00:00.72
解决方案 »
- MFC对话框的窗口过程
- basetsd.h文件问题
- 一个CAsyncSocket的简单问题,, 高手来帮看看
- 如何关闭其它程序开放的端口??
- 如何得到一个窗口中工具栏的句柄?
- 只有lib文件和.h头文件,没有Dll文件,可以调用lib文件么?
- 用vc做dll,类的几个数据成员是CComBSTR类型,但是编译器给我一个警告.....
- 初学者想学SDK,该看什么书?
- 兄弟们,帮各忙呀:)
- gdi+从资源文件里读取的和从磁盘文件里读取的相同图片显示不一样
- ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)为什么不对呢
- 激活窗口并显示为图标与活动窗口分别是什么意思?
BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
//{{AFX_MSG_MAP(CMyThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_THREAD_MESSAGE(WM_MYMESSAGE, OnFun)
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMyThread message handlersLRESULT CMyThread::OnFun(WPARAM wp, LPARAM lp)
{
return 0;
}
ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)他说类型转换无效
当然,UINT,LONG 参数也得改为 WPARAM,LPARAM
改为
void CCalculateThread::OnCalculate(UINT wParam,LONG lParam) LONG CCalculateThread::OnCalculate(UINT wParam, LONG lParam)
{
int nTempt=0;
for(int i=0;i<(int)wParam;i++)
{
nTempt = nTempt+ i;
}
Sleep(500);
::PostMessageW((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTempt,NULL);
return 0;//返回类型void,这里改为return;
}
的确要改为 ON_THREAD_MESSAGE同时将消息函数返回值改为 void 型式我这样通过了 VS2010 Win7 64Bit
楼主搞定了都不说 严重鄙视!
的确要改为 ON_THREAD_MESSAGE同时将消息函数返回值改为 void 型式我这样通过了 VS2010 Win7 64Bit
楼主搞定了都不说 严重鄙视!
C++微软的孽种
本人使用java从来未遇到如此多的问题
关于此问题ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
我给出以下解决方法
1.定义消息:
在"C实验ON_MESSAGEDlg"类的头文件中加入如下代码:
#define WM_CUSTOMIZE WM_USER+100
头文件中加入Customize的声明:
afx_msg LRESULT Customize(WPARAM wParam, LPARAM lParam); 2.cpp文件中加入消息的注册
ON_MESSAGE(WM_CUSTOMIZE, Customize) 3.加入消息响应函数实现
LRESULT C实验ON_MESSAGEDlg::Customize(WPARAM wParam, LPARAM lParam)
{
CString strTittle;
strTittle.Format("自定义消息参数:x=%d,y=%d",wParam,lParam);
//SetWindowText(strTittle);
setMessage(strTittle);
return 1;
}
void C实验ON_MESSAGEDlg::setMessage(LPCTSTR newInfo)
{
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowTextA(newInfo);
}
4.显式地发送消息:
在主框架的“帮助”主菜单中加入“自定义消息”子菜单,其ID设为ID_CUSTOMIZE,通过类向导响应该命令,函数名默认。其函数体如下:
void C实验ON_MESSAGEDlg::OnCustomize()
{
// TODO: 在此添加命令处理程序代码
HWND pdlg;
POINT pos;
//将消息参数定义为屏幕坐标值
GetCursorPos(&pos);
pdlg=this->GetSafeHwnd();
/::SendMessage(pdlg,WM_CUSTOMIZE,(UINT)pos.x,pos.y);
::PostMessage(pdlg, WM_CUSTOMIZE, (UINT)pos.x, pos.y);
}
//农机调度项目中代码:
void CWebServer::PostMsgToOwner(SERVER_INFO serverInfo)
{
//向所属窗体发送通知消息
if ( ::IsWindow(m_ownerHWND) )
{
LPARAM lParam = 0;
WPARAM wParam = 0;
if (serverInfo == SERVER_STARTED)
{
//用户只能配置客户端数、不需要知道临时并发数
lParam = MAKEWPARAM(m_cocurrentConstantClientNumber, m_serverConstantConnectPort);
wParam = MAKEWPARAM(0, serverInfo);
}
else
{
wParam = MAKEWPARAM(0, serverInfo);
}
::PostMessage(m_ownerHWND, WM_USER_SERVERINFO, wParam, lParam);
}
}
ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏