上一節講了按鈕控件Button、Radio Button和Check Box的基本用法,本節繼續講按鈕控件的內容,通過一個實例讓大家更清楚按鈕控件在實際的軟件開發中如何使用。
因為Button控件在前面的例子中涉及到了,比較簡單,本文就不作深入分析了,而是重點講解單選按鈕Radio Button、復選框Check Box的使用。
按鈕控件實例的功能
首先介紹此實例實現的功能。此實例用來根據網站類型選擇網站,並將選擇的網站的名稱顯示到編輯框中。網站類型有“門戶”、“論壇”和“博客”三種,為單選按鈕。網站有六個:博客園、新浪、天涯論壇、韓寒博客、網易和鳳凰網論壇,均為復選框。
當選中某種網站類型即點了某個單選按鈕時,其對應的網站的復選框就激活,其他則禁用,不允許選擇,且為非選中狀態。例如,如果選中了“門戶”單選按鈕,則“新浪”、“網易”復選框激活,允許用戶選擇,而其他復選框則禁用。
按鈕控件實例的實現
下面為大家詳細闡述此實例的編寫步驟。
1、創建一個基於對話框的MFC工程,名稱設為“MFCButtonDemo”。
2、在自動生成的主對話框IDD_MFCBUTTONDEMO_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_CHECK1、IDC_CHECK2、IDC_CHECK3、IDC_CHECK4、IDC_CHECK5和IDC_CHECK6。然后為每個復選框添加CButton類型的變量m_check1、m_check2、m_check3、m_check4、m_check5和m_check6.
5、在兩個Group Box下面,添加一個靜態文本框和一個編輯框。靜態文本框Caption設為“選擇的網站:”。編輯框的ID設為IDC_WEBSITE_SEL_EDIT,屬性Read Only改為True,使此編輯框為只讀狀態,不允許用戶編輯。
6、將“取消”按鈕的Caption修改為“退出”。到此,對話框模板就修改完成了,如下圖:
7、為“門戶”、“論壇”和“博客”三個單選按鈕分別添加點擊消息的消息處理函數CMFCButtonDemoDlg::OnBnClickedPortalRadio()、CMFCButtonDemoDlg::OnBnClickedForumRadio()和CMFCButtonDemoDlg::OnBnClickedBlogRadio()。
在某個單選按鈕被點擊之后,我們可以先將六個網站復選框都禁用且置為非選中狀態,而后將選擇的網站類型對應的網站復選框激活。為了代碼復用,我們將置所有復選框為禁用狀態且非選中狀態的操作寫在一個函數里,此函數為CMFCButtonDemoDlg::InitAllCheckBoxStatus(),然后就可以在三個單選按鈕的消息處理函數中調用InitAllCheckBoxStatus(),實現復選框狀態的初始化。
三個消息處理函數及InitAllCheckBoxStatus()函數的實現如下:
C++代碼:
void CMFCButtonDemoDlg::OnBnClickedPortalRadio() { // TODO: 在此添加控件通知處理程序代碼 // 如果選擇了“門戶”單選按鈕,則激活復選框 // “新浪”和“網易”,其他復選框禁用並非選中 InitAllCheckBoxStatus(); m_check2.EnableWindow(TRUE); m_check5.EnableWindow(TRUE); } void CMFCButtonDemoDlg::OnBnClickedForumRadio() { // TODO: 在此添加控件通知處理程序代碼 // 如果選擇了“論壇”單選按鈕,則激活復選框 // “天涯論壇”和“鳳凰網論壇”,其他復選框禁用並非選中 InitAllCheckBoxStatus(); m_check3.EnableWindow(TRUE); m_check6.EnableWindow(TRUE); } void CMFCButtonDemoDlg::OnBnClickedBlogRadio() { // TODO: 在此添加控件通知處理程序代碼 // 如果選擇了“博客”單選按鈕,則激活復選框 // “博客園”和“韓寒博客”,其他復選框禁用並非選中 InitAllCheckBoxStatus(); m_check1.EnableWindow(TRUE); m_check4.EnableWindow(TRUE); } void CMFCButtonDemoDlg::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、程序運行后,我們希望網站類型默認選擇為“門戶”,則修改對話框初始化函數CMFCButtonDemoDlg::OnInitDialog()為:
C++代碼:
BOOL CMFCButtonDemoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 將“關於...”菜單項添加到系統菜單中。 // IDM_ABOUTBOX 必須在系統命令范圍內。 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); } } // 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動 // 執行此操作 SetIcon(m_hIcon, TRUE); // 設置大圖標 SetIcon(m_hIcon, FALSE); // 設置小圖標 // TODO: 在此添加額外的初始化代碼 // 默認選中“門戶”單選按鈕 CheckDlgButton(IDC_PORTAL_RADIO, 1); OnBnClickedPortalRadio(); return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }
9、點擊“確定”后,將選擇的網站名字顯示到編輯框中,那么需要重載“確定”按鈕(原來的OK按鈕)的消息處理函數CMFCButtonDemoDlg::OnOk()如下:
C++代碼:
void CMFCButtonDemoDlg::OnOK() { // TODO: 在此添加專用代碼和/或調用基類 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); }
10、到此程序編寫完成。運行程序彈出結果對話框,選擇網站后界面如下圖:
按鈕控件的內容就這些了。