将c++囫囵吞枣的看完后,我迫不及待的想一窥MFC殿堂。但几乎是不可避免的,我遇见了称之为消息映射(message map)的止步石!
我想不完全了解这个东西,对于后面只会走更多的错路。
在此我仅献上100分作为我的诚意,当然这是对应有的确有帮助的人,欢迎大家讨论

解决方案 »

  1.   

    比如在有菜单的单文本稳当下,视图类的CPP文件有以下代码:BEGIN_MESSAGE_MAP(CMenuView, CView)
    ON_WM_CONTEXTMENU()
    //{{AFX_MSG_MAP(CMenuView)
    ON_COMMAND(IDM_TEST, OnTest)
    ON_WM_RBUTTONDOWN()
    ON_COMMAND(IDM_SHOW, OnShow)
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    END_MESSAGE_MAP()这就消息映射,当视图类接受到“IDM_TEST”之类的消息时,就会调用右边OnTest函数。
      

  2.   

    简单理解,就是建立消息和消息处理函数之间的关联在响应消息时,调用对应的函数建议先学学 WINDOWS API 的内容
      

  3.   

    在MFC的框架结构下,“消息映射”是通过巧妙的宏定义,形成一张消息映射表格来进行的。这样一旦消息发生,Framework就可以根据消息映射表格来进行消息映射和命令传递。实际上消息映射是对虚函数的一种延续,消息映射其实完全由虚函数来实现,但是如果所有的消息由虚函数来实现会使整个虚函数表过大,不易于函数的自动映射和执行,影响其效率,所以采用了这种消息映射的方式。从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。这些队列消息以外的绝大多数消息是非队列消息。
      

  4.   

    消息映射就是消息和处理函数的一个对应关系
     Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。   
        
        
      消息的分类   
        
      队列消息和非队列消息     
      从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。   
        
      这里,对消息队列阐述如下:   
        
      Windows维护一个系统消息队列(System   message   queue),每个GUI线程有一个线程消息队列(Thread   message   queue)。   
        
      鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。   
        
      除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。   
        
      这些队列消息以外的绝大多数消息是非队列消息。   
        
        
      系统消息和应用程序消息   
      从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。   
        
      系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。
      

  5.   

    嗯...
    这个时候我也在网上查找了下相关资料,算是在脑子里有个雏形了
    但楼上的那位仁兄,你说的API是不是在学MFC编程之前至少应该了解Windows API是怎样做的?
    那么有相关API资料或书籍的推荐吗?
      

  6.   

    我觉得在学MFC之前看下<<windows程序设计>>(微软出的一本书,很厚),效果会好点,消息映射里面到底是怎样做的我懂,但我想最终还是转换到下面的结构去处理消息了..LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    {
    switch (message) 
    {
    case WM_COMMAND:
         break;
    case WM_PAINT:
           break;
    case WM_DESTROY:
    PostQuitMessage(0);
         break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }不知我说的对不对,高手指正和补充..
      

  7.   

    如果你是初学,你只需要用就好了.至于里面的细节,现在没必要太关心.
    如果你真想关心,直接看MFC的源代码比在这里问来得快得多.
    装好Visual Studio后.就已经装了MFC和ATL的源代码了.EXPRESS版本除外.借某大师一句话:源代码前,了无秘密.