方法一:直接为每一个Button添加相应函数
[此处前提是你工程已经建立完毕]
1. 在MFC UI设计框中拖入一个 Button ;
2. 修改Button 的ID
选中Button,单击右键,选择属性,会看到有一个ID项;
【这里说下,MFC中每一个控件都有一个ID,部分控件的ID是一样的,如果我们需要单独控制这些控件,必须给他取一个不同名字的ID】
Button的ID,一般以IDC_BUTTON开头,为了区分其他类型控件,我们一般会把前面部分保留,在其后面追加特有的名字,不如我们拖入一个Button,他的功能是“+”;那么我们就可以将其命名为IDC_BUTTON_ADD。
3. 直接双击该Button,系统会自动为你生成一个响应函数;
当我们在点击这个Button的时候,系统会自动来执行这个函数。
4. 在生成的函数中加入我们需要的逻辑代码。
但是这里有一些弊端,如果我们需要操作的Button按键有很多,一个一个点显然不是很方便,那么有没有好的办法解决这一问题呢?当然有,下面方法二可以对这一问题进行有效解决。
方法二:通过重载OnCommand函数来获取Button响应
当我们完成上面方法一的第2步时,我们可以通过对OnCommand函数的覆盖来完成对Button时间的响应。
这里简单科普下什么是覆盖?
就拿我们所建立的这个工程来说,我们的工程类CCalculatorDlg继承了CDialogEx,而CDialogEx中有一个虚函数OnCommand();
// CCalculatorDlg 对话框
class CCalculatorDlg : public CDialogEx
{
// 构造
public:
CCalculatorDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_CALCULATOR_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
};
class CDialogEx : public CDialog
{
//...
protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
//...
};
如果我们在CDialogEx的子类CCalculatorDlg中重新定义声明该函数,那么系统就会执行CCalculatorDlg中的OnCommand。
OnCommand函数作为所有事件响应都要经过的一个函数,那么我们在该函数中判断,是否是我们需要的控件发生了事件响应,就方便很多了。
OK,回归到上面关于Button事件的响应。(1.2步与方法一一样)
3. 添加BOOL CCalculatorDlg::OnCommand(WPARAM wParam, LPARAM lParam)
项目->类向导->(注意类名选择)虚函数->找到OnCommand->选中,添加函数,编辑代码即可。
<code class="hljs css has-numbering"><span class="hljs-tag"></span></code><pre name="code" class="cpp">BOOL CCalculatorDlg::OnCommand(WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 return CDialogEx::OnCommand(wParam, lParam); }这是系统自动生成的代码,我们需要在此添加逻辑代码。
4.添加逻辑代码
BOOL CCalculatorDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch (wParam){
case IDC_BUTTON_ADD:
AfxMessageBox(_T("+"));
break;
}
return CDialogEx::OnCommand(wParam, lParam);
}
wParam即是响应事件的ID,我们可以通过对wParam的判断,就可以断定是不是我们想要检测的Button事件发生。
下面是采用了方法二的计算器按键代码实现:void CCalculatorDlg::OnDisplay(CString in)
{
m_Input += in;
m_CShow.SetWindowTextW(m_Input);
}
BOOL CCalculatorDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch (wParam){
case IDC_BUTTON0:OnDisplay(_T("0")); break;
case IDC_BUTTON1:OnDisplay(_T("1")); break;
case IDC_BUTTON2:OnDisplay(_T("2")); break;
case IDC_BUTTON3:OnDisplay(_T("3")); break;
case IDC_BUTTON4:OnDisplay(_T("4")); break;
case IDC_BUTTON5:OnDisplay(_T("5")); break;
case IDC_BUTTON6:OnDisplay(_T("6")); break;
case IDC_BUTTON7:OnDisplay(_T("7")); break;
case IDC_BUTTON8:OnDisplay(_T("8")); break;
case IDC_BUTTON9:OnDisplay(_T("9")); break;
case IDC_BUTTON_POINT:OnDisplay(_T(".")); break;
case IDC_BUTTON_ADD:OnDisplay(_T("+")); break;
case IDC_BUTTON_DEC:OnDisplay(_T("-")); break;
case IDC_BUTTON_MUL:OnDisplay(_T("*")); break;
case IDC_BUTTON_DIV:OnDisplay(_T("/")); break;
case IDC_BUTTON_LEFT:OnDisplay(_T("(")); break;
case IDC_BUTTON_RIGHT:OnDisplay(_T(")")); break;
case IDC_BUTTON_EQU:
OnDisplay(_T("="));
showResult(); break;
case IDC_BUTTON_DEL:
m_Input.Delete(m_Input.GetLength() - 1);
m_CShow.SetWindowTextW(m_Input); break;
case IDC_BUTTON_CLEAR:
m_Input = "";
m_CShow.SetWindowTextW(m_Input); break;
default:
break;
}
return CDialogEx::OnCommand(wParam, lParam);
}
原文链接:点击打开链接