在: http://download.csdn.net/detail/dijkstar/5187631 下载源码;
假设界面上有许多相同的控件,执行同样的操作(如每一个都是点击动作),需要给每一个写一个处理函数吗?
解决办法一是使用ON_CONTROL_RANGE,二是在PreTranslateMessage 中处理;
第一种方法: 使用ON_CONTROL_RANGE:
以下针对图中的check型按钮
首先保证这些相同控件的ID号数值是连续的(手工在resource.h头文件检查)!
头文件中声明控件变量数组:
CButton m_cCheck[6];
要处理的函数声明(部分):
// Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CTestDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //}}AFX_MSG afx_msg void OnChecksRange(UINT nID); afx_msg void OnButtonsRange(UINT nID); DECLARE_MESSAGE_MAP()
void CTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP // // 手工关联控件变量和控件 // int i = 0; for (i=0; i<6; i++) { DDX_Control(pDX, IDC_CHECK1+i, m_cCheck[i]); } for (i=0; i<4; i++) { DDX_Control(pDX, IDC_BUTTON1+i, m_cButton[i]); } } BEGIN_MESSAGE_MAP(CTestDlg, CDialog) //{{AFX_MSG_MAP(CTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_CONTROL_RANGE(BN_CLICKED, IDC_CHECK1, IDC_CHECK6, OnChecksRange) ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON4, OnButtonsRange) END_MESSAGE_MAP()
最后函数体实现:
void CTestDlg::OnChecksRange(UINT nID) { CString str; str.Format("正在点击Check控件: %d ", nID); //在主窗口上显示正在点击的控件ID号 SetWindowText(str); return; }
针对图中的Button型控件,原理检测是鼠标点击落在按钮之上:
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message == WM_LBUTTONDOWN) { int i; CRect rc; CPoint pt; GetCursorPos(&pt); for (i=0; i<4; i++) { m_cButton[i].GetWindowRect(&rc); if (rc.PtInRect(pt)) { CString str; str.Format("第 %d 个按钮按下", i+1); AfxMessageBox(str); // return FALSE; } } } return CDialog::PreTranslateMessage(pMsg); }
ON_COMMAND_RANGE 的处理和上述是一样的,下面来看:ON_UPDATE_COMMAND_UI_RANGE
创建一个基于单文档的工程(不要创建基于对话框的工程,因为不会映射UPDATE_COMMAND_UI消息),参照原有的菜单项,在里面继续添加一些子菜单(最好另起一列),保证这些菜单项的ID数值号是连续的(手工打开resource.h查看);
在消息映射中添加:
BEGIN_MESSAGE_MAP(CTestView, CView) ON_CONTROL_RANGE(ID_菜单项1, ID_菜单项X, OnFunc) END_MESSAGE_MAP()
添加处理函数
void CTestView::OnFunc(CCmdUI *pCmdUI) { pCmdUI->SetCheck(1); }
可以看到连续的菜单项被改变