MFC Button Control事件获取的两种方法

方法一:直接为每一个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->选中,添加函数,编辑代码即可。
这里写图片描述

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);
}

如果有问题大家请在下面留言讨论。

没有更多推荐了,返回首页