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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM