我在对话框上放了一组单选按钮,并建立了一个对象指针数组给这组按钮编号。可是我不想一一对每个按钮都进行消息映射。我想建立一个总的windowpro()消息过程处理函数对这组按钮的单击消息进行统一处理,并在windowpro()中识别是哪个按钮的消息。请问这个windowpro该如何写?不用窗口子类化能行吗?我对窗口子类化不太理解。先谢了!!!

解决方案 »

  1.   

    本来用SDK的话用SetClassLong可以修改一个窗口的窗口过程,但是MFC的消息运行机制要求所用窗口的窗口过程都是一个叫AfxWindProc的函数,如果SetClassLong不知道会不会出问题。你可以试试看。其实如果只是简单的按键消息,可以通过ON_COMMAND_RAGE来处理,因为按钮被按下时都是通过WM_COMMAND消息来通知父窗口的
      

  2.   

    : webber84(***闭关修炼中***) 
    是的,我只是想对每个按钮的按键消息进行处理,但对每个按钮的消息进行消息映射,麻烦仅仅是小事,更重要的事我要做的程序对按钮消息的处理是动态的,处理代码随时都可能变化,因此我想静态的写每个按钮的消息映射不能凑效。我在sdk中见过SetClassLong ,可是在mfc中不知道该如何使用,特别是针对我现在的这个程序,不知您能否给我讲的详细一些,谢谢!!
      

  3.   

    如果你只是想处理按键的话就比较简单了:
    BOOL CAboutDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
    {
      if(HIWORD(wParam)==BN_CLICKED)
    {
    UNIT nId=LOWORD(wParam);  //被按下按钮的ID。
                      HWND hCtl=(HWND) lParam;  //被按下按钮的HWND。     
    }
    return CDialog::OnCommand(wParam, lParam);
    }
    按钮被按下以后会用BN_CLICKED做参数向父窗口发送WM_COMMAND消息,你只要在父窗口中处理这个消息就是了。 至于你说动态改变处理方式的问题,你只要设置一个变量来指明当前采用哪种处理方式,在OnCommand中调用相应的处理例程就行了。
      

  4.   

    : webber84(***闭关修炼中***) 
    谢谢,现在太晚了,我明天试试看。谢谢!!
      

  5.   

    还有更简单的方法!
    你可以实现像vb里面的控件数组那样的机制,只要你够OOP!!
    写程序只要适当的变动一下就行了!
      

  6.   

    你可以用GetFocus和GetCtrlID来判断
    也可以先声明数组,然后用
    m_lbl[ 0 ].SubclassDlgItem( IDC_STATIC1, this );
    m_lbl[ 1 ].SubclassDlgItem( IDC_STATIC2, this );
    m_lbl[ 2 ].SubclassDlgItem( IDC_STATIC3, this );
    还可以用
    afx_msg void OnFunction(UINT nID);
    ON_COMMAND_RANGE(ID_FIRST,ID_LAST,OnFunction)
      

  7.   

    : JennyVenus() 
    我试过了,便已能通过,可是执行出现问题。
    afx_msg void OnFunction(UINT nID);
    ON_COMMAND_RANGE(ID_FIRST,ID_LAST,OnFunction)
    以上的代码能直接拿来用吗?能不能讲的详细点?还有 m_lbl[ 2 ].SubclassDlgItem( IDC_STATIC3, this );
    是什么意思?
    : webber84(***闭关修炼中***) 
    你的方法我试过了,可以的,谢谢!