按鈕控件
按鈕控件包括命令按鈕(Button)、單選按鈕(Radio Button)和復選框(Check Box)等。
按鈕控件會向父窗口發送通知消息,最常用的通知消息莫過於BN_CLICKED和BN_DOUBLECLICKED了。用戶在按鈕上單擊鼠標時會向父窗口發送BN_CLICKED消息,雙擊鼠標時發送BN_DOUBLECLICKED消息。
命令按鈕(Button)
在一個對話框中,Button可以定義一個默認按鈕,這只要選中按鈕屬性中的“Default”選項。如果在對話框活動的時候按下了Enter鍵,則等同於單擊了默認按鈕。
void CWindowDlg::OnBnClickedBtnTest1() { MessageBox(L"提示1"); } void CWindowDlg::OnBnClickedBtnTest2() { MessageBox(L"默認按鈕屬性設置為true"); }
//測試2按鈕的默認屬性設置為true,當在對話框中點擊enter鍵時,彈出對話框:默認按鈕屬性設置為true
動態生成一個Button控件的方式如下:
頭文件中定義CButton對象
CButton m_btnTest1;
執行CButton::Create 創建一個CButton對象:
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
int CWindowDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ m_btnTest1.Create(L"哈哈哈", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 100, 100, 160), this, IDC_BTN_HELLO1); //pParentWnd指示擁有按鈕的父窗口(this為當前對話框對象),不能為NULL; //nID指定與按鈕關聯的ID號,用於按鈕控件的事件處理( IDC_BTN_HELLO1)
}
stdadx.h中定義IDC_BTN_HELLO1宏
#define IDC_BTN_HELLO1 1000
運行后對話框顯示的Button按鈕結果如下:
如果想讓按鈕有其他動作,比如當鼠標移動到按鈕上時,按鈕文本信息會變化。實現如下:
1.自定義繼承自CButton的子類CMyButton
2.執行CButton::Create 創建一個CButton對象
3.為按鈕IDC_BTN_HELLO綁定消息處理函數OnBnClickedBtnHello並更改文本

#pragma once #include "afxwin.h" class CMyButton : public CButton { public: CMyButton(); ~CMyButton(); DECLARE_MESSAGE_MAP() afx_msg void OnMouseMove(UINT nFlags, CPoint point); };

//MyButton.cpp #include "stdafx.h" #include "MyButton.h" CMyButton::CMyButton() { } CMyButton::~CMyButton() { } BEGIN_MESSAGE_MAP(CMyButton, CButton) ON_WM_MOUSEMOVE() END_MESSAGE_MAP() void CMyButton::OnMouseMove(UINT nFlags, CPoint point) { this->SetWindowText(L"11111"); CButton::OnMouseMove(nFlags, point); }
//WindowDlg.h public: CMyButton m_btnTest; //測試按鈕

int CWindowDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialogEx::OnCreate(lpCreateStruct) == -1) return -1; //第一種方法 m_btnTest.Create(L"Hello1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 100, 100, 160), this, IDC_BTN_HELLO); //第二種方法 //人 = 軀體(m_btnTest) + 靈魂(hWnd) //HWND hWnd = ::CreateWindow(L"Button", L"Hello", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 100,100, 60, m_hWnd, (HMENU)IDC_BTN_HELLO, AfxGetInstanceHandle(), NULL); //m_btnTest.Attach(hWnd); }
當鼠標移到到動態創建的按鈕上時,文本變化。
單選按鈕(Radio Button)
單選按鈕使用時,一般是多個組成一組,組中每個單選按鈕的選中狀態具有互斥關系,即同組的單選按鈕只能有一個被選中。
單選按鈕有選中和未選中兩種狀態,為選中狀態時單選按鈕中心會出現一個藍點,以標識選中狀態。
如下定義IDC_RADIO1,IDC_RADIO2,IDC_RADIO3,默認選中IDC_RADIO1
BOOL CWindowDlg::OnInitDialog() { CDialogEx::OnInitDialog(); ... // ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//性別男 選中
}
復選框(Check Box)
復選框其實就是把一個編輯框和一個列表框組合到了一起,分為三種: 簡易(Simple)組合框、下拉式(Dropdown)組合框和下拉列表式(Drop List)組合框。
以下拉式為例:
這里設置類型跟數據分別如下:
然后在OnInitDialog方法中通過GetDlgItem獲取該復選框指針后對其進行操作如下:
CComboBox* pCombBox = (CComboBox*)GetDlgItem(IDC_COMBO1); pCombBox->AddString(L"菲律賓"); pCombBox->InsertString(1, L"越南"); pCombBox->DeleteString(2); pCombBox->SetCurSel(0);//設置當前第一條選中
編輯框
MFC為編輯框提供了CEdit類。編輯框的所有操作都封裝到了CEdit類中。一般如果我們要防止別人在編輯框中進行輸入,可以設置編輯框的屬性 Read Only。
例如:默認為編輯框顯示:HelloWorld
在OnInitDialog()方法中調用
SetDlgItemText(IDC_EDIT2, L"HelloWorld");
結果如下:
列表框控件(ListBox)
提供 Windows 列表框功能。
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST1); pListBox->AddString(L"C++"); pListBox->AddString(L"Python"); pListBox->AddString(L"Java"); pListBox->AddString(L"前端"); pListBox->AddString(L"安卓"); pListBox->AddString(L"iOS");
列表視圖控件(Listcontrol)
1.將列表視圖控件IDC_LIST2從工具箱中拖動值設計界面,並選擇相關屬性:視圖為“Report”
2.獲取列表控件,設置整行選取風格,綁定顯示數據

//獲取列表控件 CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST2); //整行選取風格 pListCtrl->SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); pListCtrl->InsertColumn(0, L"編號", LVCFMT_LEFT,100); pListCtrl->InsertColumn(1, L"姓名", LVCFMT_LEFT,200); pListCtrl->InsertColumn(2, L"性別", LVCFMT_LEFT,150); pListCtrl->InsertItem(0, L"1"); pListCtrl->SetItemText(0, 1, L"張三"); pListCtrl->SetItemText(0, 2, L"男"); pListCtrl->InsertItem(1, L"2"); pListCtrl->SetItemText(1, 1, L"李四"); pListCtrl->SetItemText(1, 2, L"女");
LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES設置了選中時的樣式為全行選中、並具有網格線
結果如下:
參考:https://blog.csdn.net/cao_jie_xin/article/details/99585010