上一節VS2010/MFC編程入門教程中講了按鈕控件Button、Radio Button和Check Box的基本用法,本節就繼續講按鈕控件的內容,經過一個實例讓你們更清楚按鈕控件在實際的軟件開發中如何使用。html
由於Button控件在前面的例子中涉及到了,比較簡單,本文就不做深刻分析了,而是重點講解單選按鈕Radio Button、複選框Check Box的使用。編程
Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所須要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。app
按鈕控件實例的功能函數
首先介紹此實例實現的功能。此實例用來根據網站類型選擇網站,並將選擇的網站的名稱顯示到編輯框中。網站類型有「門戶」、「論壇」和「博客」三種,爲單選按鈕。網站有:新浪、天涯論壇、網易和鳳凰網論壇,均爲複選框。網站
當選中某種網站類型即點了某個單選按鈕時,其對應的網站的複選框就激活,其餘則禁用,不容許選擇,且爲非選中狀態。例如,若是選中了「門戶」單選按鈕,則「新浪」、「網易」複選框激活,容許用戶選擇,而其餘複選框則禁用。this
按鈕控件實例的實現url
下面爲你們詳細闡述此實例的編寫步驟。.net
1. 建立一個基於對話框的MFC工程,名稱設爲「Example23」。code
2. 在自動生成的主對話框IDD_EXAMPLE23_DIALOG的模板中,刪除「TODO: Place dialog controls here.」靜態文本框,添加兩個Group Box,屬性Caption分別改成「網站類型」、「網站」。
3. 在Group Box「網站類型」中加入三個Radio Button,Caption分別設爲「門戶」、「論壇」和「博客」,ID分別設爲IDC_PORTAL_RADIO、IDC_FORUM_RADIO和IDC_BLOG_RADIO。
4. 在Group Box「網站」中加入六個Check Box,Caption分別設爲「新浪」、「天涯論壇」、「網易」和「鳳凰網論壇」,ID分別設爲IDC_CHECK一、IDC_CHECK二、IDC_CHECK三、IDC_CHECK四、IDC_CHECK5和IDC_CHECK6。而後爲每一個複選框添加CButton類型的變量m_check一、m_check二、m_check三、m_check四、m_check5和m_check6。
5. 在兩個Group Box下面,添加一個靜態文本框和一個編輯框。靜態文本框的Caption設爲「選擇的網站:」。編輯框的ID設爲IDC_WEBSITE_SEL_EDIT,屬性Read Only改成True,使此編輯框爲只讀狀態,不容許用戶編輯。
6. 將「OK」按鈕的Caption修改成「肯定」,「Cancel」按鈕的Caption修改成「退出」。到此,對話框模板就修改好了,以下圖:
7. 爲「門戶」、「論壇」和「博客」三個單選按鈕分別添加點擊消息的消息處理函數CExample23Dlg::OnBnClickedPortalRadio()、CExample23Dlg::OnBnClickedForumRadio()和CExample23Dlg::OnBnClickedBlogRadio()。
在某個單選按鈕被點擊以後,咱們能夠先將六個網站複選框都禁用且置爲非選中狀態,然後將選擇的網站類型對應的網站複選框激活。爲了代碼複用,咱們將置全部複選框爲禁用且非選中狀態的操做寫到一個函數裏,此函數爲CExample23Dlg::InitAllCheckBoxStatus(),而後就能夠在三個單選按鈕的消息處理函數中調用InitAllCheckBoxStatus(),實現複選框狀態的初始化。
三個消息處理函數及InitAllCheckBoxStatus()函數的實現以下:
C++代碼
void CExample23Dlg::OnBnClickedPortalRadio() { // TODO: Add your control notification handler code here // 若是選擇了「門戶」單選按鈕,則激活複選框「新浪」和「網易」,其餘複選框禁用並不是選中 InitAllCheckBoxStatus(); m_check2.EnableWindow(TRUE); m_check5.EnableWindow(TRUE); } void CExample23Dlg::OnBnClickedForumRadio() { // TODO: Add your control notification handler code here // 若是選擇了「論壇」單選按鈕,則激活複選框「天涯論壇」和「鳳凰網論壇」,其餘複選框禁用並不是選中 InitAllCheckBoxStatus(); m_check3.EnableWindow(TRUE); m_check6.EnableWindow(TRUE); } void CExample23Dlg::OnBnClickedBlogRadio() { // TODO: Add your control notification handler code here // 若是選擇了「博客」單選按鈕,則激活複選框「雞啄米」和「韓寒博客」,其餘複選框禁用並不是選中 InitAllCheckBoxStatus(); m_check1.EnableWindow(TRUE); m_check4.EnableWindow(TRUE); } // 初始化全部複選框的狀態,即所有禁用,所有非選中 void CExample23Dlg::InitAllCheckBoxStatus() { // 所有禁用 m_check1.EnableWindow(FALSE); m_check2.EnableWindow(FALSE); m_check3.EnableWindow(FALSE); m_check4.EnableWindow(FALSE); m_check5.EnableWindow(FALSE); m_check6.EnableWindow(FALSE); // 所有非選中 m_check1.SetCheck(0); m_check2.SetCheck(0); m_check3.SetCheck(0); m_check4.SetCheck(0); m_check5.SetCheck(0); m_check6.SetCheck(0); }
8. 程序運行後,咱們但願網站類型默認選擇爲「門戶」,則修改對話框初始化函數CExample23Dlg::OnInitDialog()爲:
C++代碼
BOOL CExample23Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // 默認選中「門戶」單選按鈕 CheckDlgButton(IDC_PORTAL_RADIO, 1); OnBnClickedPortalRadio(); return TRUE; // return TRUE unless you set the focus to a control }
9. 點擊「肯定」後,將選擇的網站名字顯示到編輯框中,那麼須要修改「肯定」按鈕(原來的OK按鈕)的消息處理函數CExample23Dlg::OnBnClickedOk()以下:
C++代碼
void CExample23Dlg::OnBnClickedOk() { // TODO: Add your control notification handler code here CString strWebsiteSel; // 選擇的網站 // 若選中「雞啄米」則將其加入結果字符串 if (1 == m_check1.GetCheck()) { strWebsiteSel += _T("雞啄米 "); } // 若選中「新浪」則將其加入結果字符串 if (1 == m_check2.GetCheck()) { strWebsiteSel += _T("新浪 "); } // 若選中「天涯論壇」則將其加入結果字符串 if (1 == m_check3.GetCheck()) { strWebsiteSel += _T("天涯論壇 "); } // 若選中「韓寒博客」則將其加入結果字符串 if (1 == m_check4.GetCheck()) { strWebsiteSel += _T("韓寒博客 "); } // 若選中「網易」則將其加入結果字符串 if (1 == m_check5.GetCheck()) { strWebsiteSel += _T("網易 "); } // 若選中「鳳凰網論壇」則將其加入結果字符串 if (1 == m_check6.GetCheck()) { strWebsiteSel += _T("鳳凰網論壇 "); } // 將結果字符串顯示於「選擇的網站」後的編輯框中 SetDlgItemText(IDC_WEBSITE_SEL_EDIT, strWebsiteSel); // 爲了不點「肯定」後對話框退出,將OnOk注掉 //CDialogEx::OnOK(); }
10. 到此程序編寫完成。運行程序彈出結果對話框,選擇網站後界面以下圖:
按鈕控件的內容就這些了。掌握了按鈕控件的基本用法,又動手編寫了這個實例後,相信你們對按鈕控件已經很熟悉了。