1. 程式人生 > 其它 >MFC常用控制元件

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