虽然自己也会定义和使用消息,可是有一点始终不大明白,什么时候需要使用自定义消息???
我用C++兴建一个函数,然后直接调用不好吗?
请指教!

解决方案 »

  1.   

    给你一个例子:
    在VC++ 6.0下利用消息实现内部进程通讯 
    信息产业部电子第二十二研究所 郎锐  
     
       内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0通过消息来实现内部进程通信。 
    一、Windows消息机制 
    Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(message queue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为: 
    typedef struct tagMSG{ 
    HWND hwnd; 
    UINT message; 
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD time; 
    POINT pt; 
    }MSG; 
    其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32 API有对应的函数: 
        
    PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。 
       
    二、主控程序的实现 
    (1)新建一工程文件:Sender,选取MFC AppWizard(exe)。 
    (2)第二步选取Single document(单文档)。 
    (3)其余几步均为确省值。 
    (4)添加三个菜单"命令一"、"命令二"、"命令三"及与之对应的函数: 
    OnSendComm1() 

    CString str="Receiver"; 
    CWnd *pWnd=CWnd::FindWindow(NULL,str); 
    if(pWnd) 
    pWnd->SendMessage(WM_COMM,0,0); 

    OnSendComm2() 

    CString str="Receiver"; 
    CWnd *pWnd=CWnd::FindWindow(NULL,str); 
    if(pWnd) 
    pWnd->SendMessage(WM_COMM,0,1); 

    OnSendComm3() 

    CString str="Receiver"; 
    CWnd *pWnd=CWnd::FindWindow(NULL,str); 
    if(pWnd) 
    pWnd->SendMessage(WM_COMM,1,0); 

    (5)在SenderView.h中添加自定义消息:#define WM_COMM WM_USER+100编译完成即可。 
       
    三、底层工作程序的实现 
    (1)新建工程Receiver、仍是单文档。 
    (2)在CReceiverApp类的InitInstance()函数末尾添加: 
    m_pMainWnd->SetWindowText("Receiver"); 
    用以指定底层工作程序的窗口标题,以便主控程序能根据标题获取到此窗口的窗口句柄。 
    (3)在MainFrm.h中添加自定义消息:#define WM_COMM WM_USER+100。 
    (4)添加自定义消息WM_COMM的消息映射: 
    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
    //{{AFX_MSG_MAP(CMainFrame) 
    // NOTE - the ClassWizard will add and remove mapping macros here. 
    // DO NOT EDIT what you see in these blocks of generated code ! 
    ON_WM_CREATE() 
    //}}AFX_MSG_MAP 
    ON_MESSAGE(WM_COMM,OnSendMsg) 
    END_MESSAGE_MAP() 
    (5)完成消息响应函数OnSendMsg() 
    void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam) 

    if(wParam==0 && lParam==0) 
    AfxMessageBox("主控程序发送命令一!"); 
    if(wParam==0 && lParam==1) 
    AfxMessageBox("主控程序发送命令二!"); 
    if(wParam==1 && lParam==0) 
    AfxMessageBox("主控程序发送命令三!"); 

    我们便可以通过辨别消息的两个消息参数来区分主控程序发送的是哪一个命令从而可以执行相应的操作。执行主控程序和底层工作程序由于本程序采用的是SendMessage()所以当主控程序发送消息给底层工作程序时,底层工作程序弹出响应的模式对话框,在没有关闭对话框前此消息未处理完,SendMessage()也就没有执行完,所以主控程序呈阻塞状态,如改用PoseMessage()则不会发生阻塞,具体选用哪个函数还应根据实际要求灵活掌握。 
       
    结论: 通过上面的实例可以看出利用消息进行进程间通信不失为一种便捷的方法,进程间的数据交换量不大却能完成相当的功能,上下层次有着明显的接口,上层和底层只通过这个接口进行通讯,因此只要对上下层程序制定好规范详尽的协议便可编制出协调性很好的软件控制系统。 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
      

  2.   

    在线程中需要与某个Wnd通信时,使用自定义消息非常方便,不信可以试试!
      

  3.   

    太多情况下需要用消息了。比如说一个函数中要处理消息,要在线程开始时启动这个函数,就不能加在InitInstance中,只有随后发消息~~
      

  4.   

    当你的程序中的线程之间需要某种协调的时候,举个winsock例子,通常主线程负责窗口相关的处理,一个独立的线程负责侦听端口,当收到信息时,需要通知主线程弹出一个窗口以显示信息,这时就可以自定义一个消息,发给主线程。
      

  5.   

    主要是用在两个窗体的通讯比较困难的时候,如果一个窗口能直接控制另一个窗口,那就不必发消息了,如果消息不是标准的windows消息当然就要字定义消息了!
      

  6.   

    使用函数从某种意义上说使一种“有阻塞”的调用,应为调用者要到被调用者返回
    才可以继续执行。
    而消息则是一种“无阻塞”的调用,发个消息,立即可以继续执行,岂不很爽,一切交给Windows的消息队列去排队吧。