在: 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()
cpp文件中消息映射:
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;
}
第二种方法: 使用PreTranslateMessage
针对图中的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);
}
可以看到连续的菜单项被改变