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

如果有問題大家請在下面留言討論。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com