MFC常用控制元件
按鈕控制元件
按鈕控制元件包括命令按鈕(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); };View Code
//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); }View Code
//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); }View Code
當滑鼠移到到動態建立的按鈕上時,文字變化。
單選按鈕(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"女");View Code
LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES設定了選中時的樣式為全行選中、並具有網格線
結果如下:
參考:https://blog.csdn.net/cao_jie_xin/article/details/99585010