程序布置如下:有两个类,一个类派A生于对话框,另一个类B手动添加。B类的作用是向外设发送和接受信息,B类接收信息是通过消息映射(不是我要问的消息映射)。程序本设想:当B类接收一个信息后,B类发出一个PostMessage命令,同时也发送出刚接收的数据,然后想在A类的程序中增加相应的处理函数,实现对接收数据的处理。
程序如下:
在A类的.h文件中,添加
afx_msg LRESULT ON_BCAN_Receive(WPARAM iParam1, LPARAM iParam2);
在A类的.cpp文件中添加了
ON_MESSAGE(WM_BCAN_ONReceive, ON_BCAN_Receive)   // 在MESSAGE_MAP()中
和消息响应函数
LRESULT CSMKTESTERView::ON_BCAN_Receive(WPARAM wParam, LPARAM lParam)
{
MessageBox(_T("WM OK"));
return 0;}在B类的.cpp程序中,添加了:
PostMessage(WM_BCAN_ONReceive,0,0);   //如果该条命令添加在A类的.cpp文件中,消息映射可以运作。补充:使用的开发工具为vs2008
请问达人,不能实现消息传递的问题在哪里?
谢谢!
  

解决方案 »

  1.   

    PostMessage(WM_BCAN_ONReceive,0,0);需要向指定的句柄发送消息
    可以传入a的指针
      

  2.   

    BOOL PostMessage(
      HWND hWnd,      // handle of destination window
      UINT Msg,       // message to post
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    );
    你要发消息给A类对应的窗口,需要指定A的窗口句柄
      

  3.   

    ::PostMessage(HWND_A, WM_BCAN_ONReceive,0,0);
    用API函数PostMessage();第一个参数指定为A窗口的HWND窗口句柄
      

  4.   

    这个问题你取决于你是怎么实例化A类和B类对象;
    你可以考虑在B类中定义一个成员函数(变量),将A的句柄传进去
    如果A类是主窗口,也可以AfxGetMainWnd()->m_hWnd获得A的窗口句柄
      

  5.   


    构造函数参数传递
    首先创建A  A a;
    然后创建B  B b(&a) //构造参数传递,B中保存A对象指针,这是最常用的
      

  6.   


    能否在详细一些。 B b(&a)是什么意思?
    我确实要在A类中创建 B b;这样一个对象。
      

  7.   

    你既然在A类中创建的B对象
    你直接在B中定义一个public类型的句柄参数HWND HWND_A;
    将A的句柄直接赋值给它
    B对象.HWND_A = m_hWnd;
      

  8.   

    实现一个带A参数B的构造函数 即可比如:
    #include "A.h"class B{
      B();  //这是默认构造函数
      B(A *pa); //带参数构造函数
      ~B(); //析构函数
    }
      

  9.   

    这种方法是可以在A类的得到 B类的句柄,但是我利用POSTMESSAGE是在B类.ccp文件中,也就是说:我要求在B类中得到A类的句柄。
      

  10.   

    我就是把ON_MESSAGE()放在A类中啊,不能实现信息的传递。
      

  11.   

    A类是对于窗体的类,B类是我自己添加的类。
    B(A *pa); //带参数构造函数
    这样操作的话,是不是逻辑混乱了。
      

  12.   

    语句PostMessage(hwnd_Tester,WM_BCAN_ONReceive,true,2);
    报错如下:
    error C2660: 'CWnd::PostMessageW' : function does not take 4 arguments
    是什么原因?
      

  13.   

    vs2008 F1 help的提示为
    BOOL PostMessage( UINT message,  WPARAM wParam = 0,  LPARAM lParam = 0 ) 
      

  14.   


    你这个是CWnd::PostMessage
    BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );现在要用的是系统的API
    ::PostMessage
      

  15.   

    虽然SDK比较复杂,但还是主张学WINDOWS编程的话,先了解一下SDK比较好。特别是关于UI的,MFC封装了一些,虽然比较接近,但还是隐藏了一些东西。
      

  16.   

    如果B类是在A类对象中定义可以传指针;
    还可以afxGetApp()->GetMainWind()...