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);}
如果有问题大家请在下面留言讨论。
- MFC Button Control事件获取的两种方法
- MFC Button Control事件获取的两种方法
- button事件的两种处理方法
- Android中button实现onclicklistener事件的两种方法
- Button点击事件实现页面跳转的两种方法
- 为Button点击事件注册监听器的两种方法
- Android ListView内的Button添加事件的两种方法
- 解决TextView数据不能更新的问题以及Android Button事件响应函数的两种方法
- [Android][Button]Button注册点击事件的4种方法
- Button点击事件的四种方法
- mfc 对话框 split button control
- 事件:事件的两种方法
- MFC 记录button控件的鼠标事件
- MFC保存文本文件的两种方法(包含如何获取工作路径)
- MFC 创建快捷方式的两种方法
- MFC加载图片的两种方法
- android button的两种响应点击的方法
- Android 实现button点击效果的两种方法
- 控制器切换(网易新闻效果)
- ARM第一部分-S5PV210的内存什么的地址映射详解
- 各种内部排序算法
- C++ auto类型说明符
- linux-tar(转)
- MFC Button Control事件获取的两种方法
- Fragment用法
- ARM第一部分-CPU和外部存储器的接口
- UVA-101 The Blocks Problem 栈
- hdoj--1950 Bridging signals(LIS with O(nlogn))
- 关于URL编码
- Lock与synchronized 的区别
- ARM第一部分-S5PV210启动过程详解1
- 带头结点的链栈