VC下许多相同的控件事件处理方法(ON_CONTROL_RANGE、ON_COMMAND_RANGE、ON_UPDATE_COMMAND_UI_RANGE )

在: http://download.csdn.net/detail/dijkstar/5187631 下载源码;


假设界面上有许多相同的控件,执行同样的操作(如每一个都是点击动作),需要给每一个写一个处理函数吗?


VC下许多相同的控件事件处理方法(ON_CONTROL_RANGE、ON_COMMAND_RANGE、ON_UPDATE_COMMAND_UI_RANGE )_第1张图片


解决办法一是使用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);
}


可以看到连续的菜单项被改变



你可能感兴趣的:(VC下许多相同的控件事件处理方法(ON_CONTROL_RANGE、ON_COMMAND_RANGE、ON_UPDATE_COMMAND_UI_RANGE ))