本人在做一个仪器操作软件的二次开发,但需要先把原来的软件功能实现。厂家提供一个demo,我依照demo来,创建一个对话框类CSettingDialog,包含二次开发包dll头文件,
 在CSettingDialog.h的protected下:
    afx_msg LRESULT DataReceived(WPARAM wParam, LPARAM lParam);//自定义消息响应函数 在CSettingDialog.cpp文件中:
    BEGIN_MESSAGE_MAP(CSettingDialog, CDialog)
//{{AFX_MSG_MAP(CSettingDialog)
ON_MESSAGE(WM_MEAS_READY, DataReceived)//关联消息WM_MEAS_READY,这个在二次开发包dll文件中有定义
         ......
//}}AFX_MSG_MAP
END_MESSAGE_MAP()LRESULT CSettingDialog::DataReceived(WPARAM wParam, LPARAM lParam)
{
 MessageBox("");
 return LRESULT();在二次开发包dll文件中:
#define WM_MEAS_READY       (WM_USER + 1)//自定义消息好像都是这么定义的,这里不能动在MainFrame.cpp中:
void CMainFrame::OnSetting() 
{
CSettingDialog dialog13;
dialog13.DoModal();
}然后运行,每次从仪器通过USB传过来数据时,都会弹出MessageBox,也就是触发DataReceived函数。但是如果没有打开这个对话框,则无法响应函数。
现在我需要接收数据后把数据用图表形式呈现在主界面上,而且是动态的,每接收一次数据图表就变化一次。由于没有打开对话框就不响应DataReceived函数(我试过在View类里创建一个CSettingDialog对象但没有DoMoal,结果也不响应),所以我打算直接在View类里面弄这个消息响应。于是我把原来的消息响应删除掉,
在091209View.h的protected下:
    afx_msg LRESULT ViewDataReceived(WPARAM wParam, LPARAM lParam);//自定义消息响应函数 在091209View.cpp文件中:
    BEGIN_MESSAGE_MAP(CSettingDialog, CDialog)
//{{AFX_MSG_MAP(CSettingDialog)
ON_MESSAGE(WM_MEAS_READY, ViewDataReceived)//关联消息WM_MEAS_READY,这个在二次开发包dll文件中有定义
         ......
//}}AFX_MSG_MAP
END_MESSAGE_MAP()LRESULT CSettingDialog::ViewDataReceived(WPARAM wParam, LPARAM lParam)
{
 MessageBox("");
 return LRESULT()
  然后运行,无论我怎么试,就是不弹出MessageBox("")。同样的方法,用在不同的类里,一个对话框类,一个View类,怎么就不行了呢?我该从哪里找原因,是View类的问题还是开发包的问题?厂家说用TChart来做图形显示的,但如果没接收数据用什么做都没用吧?请求高人指点,谢谢!

解决方案 »

  1.   

    说实话,没有搞懂你说的啥意思,什么叫没有打开这个对话框,则无法响应函数。
    消息发给谁,当然由谁响应消息,要搞清楚你用的dll开发包通信的机制,WM_MEAS_READY消息是如何传递出来的,由哪个窗口负责接收这个消息。另外要保证你没有自定义消息的值也是wm_user+1
      

  2.   


    谢谢。我意思是在View类某个函数里写“CSettingDialog dialog13;”没有写“dialog13.DoModal();”,我希望在没有弹出dialog13的情况下仍然能在接收数据时触发DataReceived,实际上没有。
        另外,必须由一个窗口来接收消息的吗?View和MainFrame一定不可以?我刚才试了下,用在MainFrame也不可以,不知道为什么。
      

  3.   

    你在对话框里做的消息响应,当然对话框弹出来才会接收到消息,view也是可以的,
      

  4.   

    应该是你的dll发送消息的时候,他的消息发给的窗口是谁自定义消息,你可以自己试在dlg程序a的上面在弹出一个dlg界面b,b的上面有自定义控件,然后这个自定义控件发自定义消息出来就要指定消息发给谁,是发送他的父窗口B呢,还是发给爷爷窗口A呢....
      

  5.   

    你怎么试的,把消息发送给了view窗口或是frame窗口了吗??
      

  6.   

    我在厂家提供的demo整个工程搜索“WM_MEAS_READY”,就只能搜到两处,第一个是
    #define WM_MEAS_READY (WM_USER + 1)
    第二个是ON_MESSAGE(WM_MEAS_READY, DataReceived)所以,我只能知道它接收到WM_MEAS_READY这个消息就触发DataReceived函数,而不知道这个消息从哪里来,这个消息的类型是什么。我用CString的Format方法把WM_MEAS_READY转换成整型,值是1025。
      请问有什么方法可以知道它从哪里来吗?来一次数据就触发一次,那消息是不是从仪器那里来的啊?我是菜鸟,对这个问题好茫然,谢谢!
      

  7.   

    谢谢你的回答。可是如果我不打开这个对话框,就不能接收消息啊,如果打开了对话框来接收消息,虽然能接收,但是不能用OnDraw了(用Invalidate都没反应)。而且我们最终实现的是不打开对话框也能在客户区作图。谢谢!
      

  8.   

    那你把你在那个对话框中的include的东西,全放到你的view里面嘛
    你在include里面怎么操作的就全搬到view里面来啊
      

  9.   

    你的CSettingDialog dialog13;就发送消息??窗口都没有创建出来,你可以用非模态对话框,不ShowWindow(SW_SHOW)出来
      

  10.   

    你找一下代码有没有把你那对话框CSettingDialog的指针或是句柄传给谁了,要不然这个对话框咋接收的消息呢。你上面两处只是定义消息和消息映射,可能你的消息是在dll里面发送的。