我在Petzold的《windows程序设计》中看到“Windows程序中所有按钮都基于相同的窗口类,与该窗口类关联的窗口过程位于一个Windows动态链接库中,它可以对所有传递到按钮窗口的消息进行处理。”。也就是说,单击不同的按钮都会调用同一个窗口过程进行处理,那么我们自己写的事件处理函数是怎样被调用的呢? 怎样辨别被单击的是哪一个按钮呢? 因为是初学者,请高手不吝赐教,讲详细一些。    多谢!

解决方案 »

  1.   

    HOOK->AfxWndProc->.....OnCommand()->消息映射表->自己写的事件处理函数
      

  2.   

    The parent window of the button receives the BN_CLICKED notification code through the WM_COMMAND message. BN_CLICKED    WPARAM wParam
        LPARAM lParam;
        
    ParameterswParam
    The low-order word contains the button's control identifier. The high-order word specifies the notification message. 
    lParam
    A handle to the button. 
      

  3.   

    感觉你的理解有些混乱。按钮属于控件。控件就是它的属性(比如窗口类别)及事件处理函数等系统都已经准备好了,你拿来用就行。你可以比较下创建一个全新窗口和创建一个控件的差异。因此才会有:“与该窗口类关联的窗口过程位于一个Windows动态链接库中,它可以对所有传递到按钮窗口的消息进行处理”"我们自己写的事件处理函数"你是指主窗口回调函数中响应WM_COMMAND处理按钮点击事件的代码呢,还是指你给按钮设置了窗口子类化后,所设置的回调函数呢?如果是前者,那很好理解呀,系统发来WM_COMMAND,告你某个按钮被点击了(系统给你按钮id),你做下一步处理就行。如果你指的是后者,那么,即然你设置了窗口子类化,那么系统必然后调用你给控件所设置的窗口过程。楼主啊,我大弄不清你到底想问什么,你以后提问尽量说的详细些。
      

  4.   

    谢谢您的回答。概念的确比较混乱,"我们自己写的事件处理函数"指的是点击一个按钮后我们添加的处理函数。如果说不同按钮对应的是同一个窗口类,那么它们也就对应同一个窗口过程。所以,点击这几个不同的按钮就都会调用这个窗口过程进行处理。那么,我们自己针对不同按钮写的不同处理函数是怎样在这个窗口过程中被调用的呢?(可能我理解有误,请赐教!)
      另外,关于创建控件和创建全新窗口的差异尚未学习,请大致讲解下,不胜感激!
    =============================
    你的理解确实有错,当我们点击按钮时,内部的处理过程你没有理解。当你点击按钮,按钮的处理函数会收到WM_LBUTTONDOWN消息,这里所说的按钮的处理函数也就是上文所说的内置的,系统给我们写好的处理函数,所有的按钮用的都是同一个。
    内置的处理函数处理收到的WM_LBUTTONDOWN消息,它会根据按钮的ID和HWND,向按钮所在父窗口发送WM_COMMAND消息,而我们为不同按钮所写的处理函数其实就是针对WM_COMMAND消息来写的。换句话说,我们对按钮的响应,其实是对WM_COMMAND消息的响应, 而不是写了按钮的处理函数,所有的按钮的处理函数都是同一个,而且动作也是一样的,就是向父窗口发WM_COMMAND消息。
      

  5.   

    如果说不同按钮对应的是同一个窗口类,那么它们也就对应同一个窗口过程。所以,点击这几个不同的按钮就都会调用这个窗口过程进行处理。那么,我们自己针对不同按钮写的不同处理函数是怎样在这个窗口过程中被调用的呢?(可能我理解有误,请赐教!)
      另外,关于创建控件和创建全新窗口的差异尚未学习,请大致讲解下,不胜感激!
    点击这几个不同的按钮就都会调用这个窗口过程进行处理你是不是潜意识里以为:点击了这些按钮后,调用了这个窗口过程就一切都结束了?人家说"处理",但没说"处理完"。这个窗口过程还要给控件的父窗口,就是应用程序的主窗口发送WM_COMMAND,而你写的按钮处理过程就是放在主窗口回调函数里WM_COMMAND之后。关于创建控件和创建全新窗口的差异windows系统上凡是看得见的东西都是窗口。窗口类决定了窗口基础外形。窗口过程决定了窗口的功能。而控件是系统已经做好了的窗口,窗口类、过程系统已经替你做好了。你拿来用就行。当然系统也充许你进行扩展,这就属于高级用法了。创建一个全新窗口,你需要指定窗口类、窗口过程等。而创建控件你只需指定控件名称、给你控件制定一个ID号就行。具体的看《windows程序设计》
      

  6.   

    窗体 都有一个默认系统处理函数winproc  当有消息发送到窗口时候,窗口处理函数会先查找你定义的代码,看你是否写了该消息的窗口处理函数,如果有,执行你的代码,如果没有,执行窗口默认的系统处理函数winproc!