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

来源:互联网 发布:大数据时代日语 编辑:程序博客网 时间:2024/06/03 19:32

方法一:直接为每一个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);}

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

0 0