我自己做了很多次自定义消息,最后都已失败告终~
但是很多时候又必须要用到自定义消息,所以很苦恼,到网上找了资料,照着做,还是做不出来!
问了别人,虽然是做出那种效果了,可是自己始终还是不明白为什么...
有没有高手指点一下小弟,小弟在此万分感激!
如果可以解决这一捆扰,必定亲自送上分数!
拜托大家啦!
但是很多时候又必须要用到自定义消息,所以很苦恼,到网上找了资料,照着做,还是做不出来!
问了别人,虽然是做出那种效果了,可是自己始终还是不明白为什么...
有没有高手指点一下小弟,小弟在此万分感激!
如果可以解决这一捆扰,必定亲自送上分数!
拜托大家啦!
#define WM_CUSTOMMSG (WM_USER+1)发送消息:
SendMessage(目标窗口句柄, WM_CUSTOMMSG, 自定义参数1, 自定义参数2);接收消息:
LRESULT 窗口类::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_CUSTOMMSG)
{
响应消息
return 1;
}
return 基类::WindowProc(message, wParam, lParam);
}
1.先定义一个消息 WM_MYMSG
这是在告诉系统,说,我要做一些操作,和这个操作绑定的消息是WM_MYMSG,如果你们想让我做这个操作,就发WM_MYMSG给我。2.消息处理函数
正是我要做的一些操作。
m_ParkQur->PostMessage(WM_USER_REFRESH,(DWORD)2,0);
/**************************************************/我传递过去的参数明明是2,但是消息处理函数显示出来的却永远都是1.这到底是什么原因啊???void CDlgParkQuery::OnRefresh(WPARAM wParam, LPARAM lParam)
{
int n=(int)wParam;
CString str;
str.Format("%d",n);
MessageBox(str);
}
{
CDlgParkQuery dlg;
CString m_str,str;
if(IDOK==dlg.DoModal())
{
/**************************************************/
m_ParkQur->PostMessage(WM_USER_REFRESH,(DWORD)2,0);
/**************************************************/ m_str = dlg.temp;
str="SELECT ComputerNo, ParkNo, CardNo, CardType, CardIndate, CardAmount, CarNo, \
CarType, CarStyle, CarColor, MasterName, MasterID, MasterTel, MasterAddr, \
ParkPos, InTrackName, InDateTime, InPicname, InOperatorName, InStyle, \
OutFlag \
FROM InRecord_View where "+m_str;
MessageBox(str);
/*重新绑定数据集*/
m_GridRs.CreateInstance(_uuidof(Recordset));
m_GridRs-> CursorLocation = adUseClient;
if(m_GridRs->GetState()==adStateOpen)
{
m_GridRs->Close();
} if(!m_hDataBase.OpenRecordSet(m_GridRs,str))
{
AfxMessageBox("没有成功打开表");
}
m_DataGrid.SetRefDataSource(NULL);
m_DataGrid.SetRefDataSource((LPUNKNOWN)m_GridRs->GetDataSource());
m_DataGrid.ReBind();
m_DataGrid.Refresh();
}
}响应消息的函数如下:void CDlgParkQuery::OnRefresh(WPARAM wParam, LPARAM lParam)
{
int n=(int)wParam;
CString str;
str.Format("%d",n);
MessageBox(str);
}
SendMessage直接把消息发给相应窗口。
这楼说的是对的,我就啰嗦一句,WM_USER 是系统的宏,自定义的消息必须WM_USER + ,因为WM_USER以下的值被系统消息用了
在你要响应的此消息的类里,
。cpp的MSGMAP里加上:ON_MESSAGE(WM_MYMSG,OnMyMsg)
.h里afx_msg void OnMyMsg(WPARAM,LPARAM);
最后时实现在。CPP里加上XXX::OnMyMsg(WPARAM wParam,LPARAM lParam){}在发送消息的时候,可以选择SendMessage(WM_MYMSG,XX,XXX)这会等待你的消息响应函数执行结束,即类化阻塞的
PostMessage(WM_MYMSG,XX,XX);发送完消息后直接执行该语句后续的代码,不等待消息响应函数执行完毕
由CWnd或CWindow封装是3个参数。
=====================================
m_ParkQur是什么啊?消息是发给它的,它应该是CDlgParkQuery类对象才行.
改用sendmessage...直接处理消息看看...
: CDialog(CDlgParkQuery::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgParkQuery)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
*m_ParkQur=this;
}