请教如何写一个单选按钮组的总的WindowPro()统一处理所有按钮的消息。up有分,不够再补!谢谢!! 我在对话框上放了一组单选按钮,并建立了一个对象指针数组给这组按钮编号。可是我不想一一对每个按钮都进行消息映射。我想建立一个总的windowpro()消息过程处理函数对这组按钮的单击消息进行统一处理,并在windowpro()中识别是哪个按钮的消息。请问这个windowpro该如何写?不用窗口子类化能行吗?我对窗口子类化不太理解。先谢了!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本来用SDK的话用SetClassLong可以修改一个窗口的窗口过程,但是MFC的消息运行机制要求所用窗口的窗口过程都是一个叫AfxWindProc的函数,如果SetClassLong不知道会不会出问题。你可以试试看。其实如果只是简单的按键消息,可以通过ON_COMMAND_RAGE来处理,因为按钮被按下时都是通过WM_COMMAND消息来通知父窗口的 : webber84(***闭关修炼中***) 是的,我只是想对每个按钮的按键消息进行处理,但对每个按钮的消息进行消息映射,麻烦仅仅是小事,更重要的事我要做的程序对按钮消息的处理是动态的,处理代码随时都可能变化,因此我想静态的写每个按钮的消息映射不能凑效。我在sdk中见过SetClassLong ,可是在mfc中不知道该如何使用,特别是针对我现在的这个程序,不知您能否给我讲的详细一些,谢谢!! 如果你只是想处理按键的话就比较简单了: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中调用相应的处理例程就行了。 : webber84(***闭关修炼中***) 谢谢,现在太晚了,我明天试试看。谢谢!! 还有更简单的方法!你可以实现像vb里面的控件数组那样的机制,只要你够OOP!!写程序只要适当的变动一下就行了! 你可以用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) : JennyVenus() 我试过了,便已能通过,可是执行出现问题。afx_msg void OnFunction(UINT nID);ON_COMMAND_RANGE(ID_FIRST,ID_LAST,OnFunction)以上的代码能直接拿来用吗?能不能讲的详细点?还有 m_lbl[ 2 ].SubclassDlgItem( IDC_STATIC3, this );是什么意思?: webber84(***闭关修炼中***) 你的方法我试过了,可以的,谢谢! list控件自绘 CFile类在回调函数中连续写入的问题 用C/C++开发数据库应用程序的编译器选择问题 请教关于键盘响应 属性页之间的数据传递 请问如何处理ShellExecute中的起始位置参数 怎样使CEdit能输入多行文本? 网络播放器的改写问题!!! Winsock I/O模型的选择? 求大神 送分100!一个关于MDI的问题,在线等待! 请问有什么命令或函数能让WIN2000从新启动吗?
是的,我只是想对每个按钮的按键消息进行处理,但对每个按钮的消息进行消息映射,麻烦仅仅是小事,更重要的事我要做的程序对按钮消息的处理是动态的,处理代码随时都可能变化,因此我想静态的写每个按钮的消息映射不能凑效。我在sdk中见过SetClassLong ,可是在mfc中不知道该如何使用,特别是针对我现在的这个程序,不知您能否给我讲的详细一些,谢谢!!
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中调用相应的处理例程就行了。
谢谢,现在太晚了,我明天试试看。谢谢!!
你可以实现像vb里面的控件数组那样的机制,只要你够OOP!!
写程序只要适当的变动一下就行了!
也可以先声明数组,然后用
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)
我试过了,便已能通过,可是执行出现问题。
afx_msg void OnFunction(UINT nID);
ON_COMMAND_RANGE(ID_FIRST,ID_LAST,OnFunction)
以上的代码能直接拿来用吗?能不能讲的详细点?还有 m_lbl[ 2 ].SubclassDlgItem( IDC_STATIC3, this );
是什么意思?
: webber84(***闭关修炼中***)
你的方法我试过了,可以的,谢谢!