我自己做了很多次自定义消息,最后都已失败告终~
但是很多时候又必须要用到自定义消息,所以很苦恼,到网上找了资料,照着做,还是做不出来!
问了别人,虽然是做出那种效果了,可是自己始终还是不明白为什么...
有没有高手指点一下小弟,小弟在此万分感激!
如果可以解决这一捆扰,必定亲自送上分数!
拜托大家啦!

解决方案 »

  1.   

    定义消息:
    #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);
    }
      

  2.   

    正如楼上所说:
    1.先定义一个消息 WM_MYMSG
    这是在告诉系统,说,我要做一些操作,和这个操作绑定的消息是WM_MYMSG,如果你们想让我做这个操作,就发WM_MYMSG给我。2.消息处理函数
    正是我要做的一些操作。
      

  3.   

    /**************************************************/
    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);
    }
      

  4.   

    你自己在进程中定义的关键有可能占用了,可以先使用RegisterWindowMessage注册一个全局消息字,然后再在消息泵里处理。
      

  5.   

    当我点查询的时候就发送消息:void CDlgInRecord::OnQuery() 
    {
    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);
    }
      

  6.   

    PostMessage发送消息到消息队列,消息从消息队列到窗口好像还一个translate的过程。
    SendMessage直接把消息发给相应窗口。
      

  7.   


    这楼说的是对的,我就啰嗦一句,WM_USER 是系统的宏,自定义的消息必须WM_USER + ,因为WM_USER以下的值被系统消息用了
      

  8.   

    #define WM_MYMSG WM_USER + 100//(注意这个号别与其他的重了)
    在你要响应的此消息的类里,
    。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);发送完消息后直接执行该语句后续的代码,不等待消息响应函数执行完毕
      

  9.   

    请问SendMessage函数什么地方是四个参数,什么地方是三个参数?
      

  10.   


    由CWnd或CWindow封装是3个参数。
      

  11.   

     m_ParkQur->PostMessage(WM_USER_REFRESH,(DWORD)2,0);
    =====================================
    m_ParkQur是什么啊?消息是发给它的,它应该是CDlgParkQuery类对象才行.
      

  12.   

    他的函数能够处理消息.应该不是消息定义出错了..
    改用sendmessage...直接处理消息看看...
      

  13.   

    m_ParkQur,就是CDlgParkQuery类的指针CDlgParkQuery *m_ParkQur;CDlgParkQuery::CDlgParkQuery(CWnd* pParent /*=NULL*/)
    : CDialog(CDlgParkQuery::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CDlgParkQuery)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
            *m_ParkQur=this;
    }