上一節(jié)VS2010/MFC編程入門教程中雞啄米講了按鈕控件Button、Radio Button和Check Box的基本用法,,本節(jié)就繼續(xù)講按鈕控件的內(nèi)容,,通過一個實例讓大家更清楚按鈕控件在實際的軟件開發(fā)中如何使用。
因為Button控件在前面的例子中涉及到了,,比較簡單,,本文就不作深入分析了,而是重點講解單選按鈕Radio Button,、復選框Check Box的使用,。
按鈕控件實例的功能
首先介紹此實例實現(xiàn)的功能。此實例用來根據(jù)網(wǎng)站類型選擇網(wǎng)站,,并將選擇的網(wǎng)站的名稱顯示到編輯框中,。網(wǎng)站類型有“門戶”,、“論壇”和“博客”三種,為單選按鈕,。網(wǎng)站有六個:雞啄米,、新浪、天涯論壇,、韓寒博客,、網(wǎng)易和鳳凰網(wǎng)論壇,均為復選框,。
當選中某種網(wǎng)站類型即點了某個單選按鈕時,,其對應的網(wǎng)站的復選框就激活,其他則禁用,,不允許選擇,,且為非選中狀態(tài)。例如,,如果選中了“門戶”單選按鈕,,則“新浪”、“網(wǎng)易”復選框激活,,允許用戶選擇,,而其他復選框則禁用。
按鈕控件實例的實現(xiàn)
雞啄米下面為大家詳細闡述此實例的編寫步驟,。
1. 創(chuàng)建一個基于對話框的MFC工程,,名稱設為“Example23”。
2. 在自動生成的主對話框IDD_EXAMPLE23_DIALOG的模板中,,刪除“TODO: Place dialog controls here.”靜態(tài)文本框,,添加兩個Group Box,屬性Caption分別改為“網(wǎng)站類型”,、“網(wǎng)站”,。
3. 在Group Box“網(wǎng)站類型”中加入三個Radio Button,Caption分別設為“門戶”,、“論壇”和“博客”,,ID分別設為IDC_PORTAL_RADIO、IDC_FORUM_RADIO和IDC_BLOG_RADIO,。
4. 在Group Box“網(wǎng)站”中加入六個Check Box,,Caption分別設為“雞啄米”、“新浪”,、“天涯論壇”,、“韓寒博客”、“網(wǎng)易”和“鳳凰網(wǎng)論壇”,,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下面,,添加一個靜態(tài)文本框和一個編輯框。靜態(tài)文本框的Caption設為“選擇的網(wǎng)站:”,。編輯框的ID設為IDC_WEBSITE_SEL_EDIT,屬性Read Only改為True,,使此編輯框為只讀狀態(tài),,不允許用戶編輯。
6. 將“OK”按鈕的Caption修改為“確定”,,“Cancel”按鈕的Caption修改為“退出”,。到此,對話框模板就修改好了,,如下圖:
7. 為“門戶”,、“論壇”和“博客”三個單選按鈕分別添加點擊消息的消息處理函數(shù)CExample23Dlg::OnBnClickedPortalRadio()、CExample23Dlg::OnBnClickedForumRadio()和CExample23Dlg::OnBnClickedBlogRadio(),。
在某個單選按鈕被點擊之后,,我們可以先將六個網(wǎng)站復選框都禁用且置為非選中狀態(tài),而后將選擇的網(wǎng)站類型對應的網(wǎng)站復選框激活,。為了代碼復用,,我們將置所有復選框為禁用且非選中狀態(tài)的操作寫到一個函數(shù)里,此函數(shù)為CExample23Dlg::InitAllCheckBoxStatus(),,然后就可以在三個單選按鈕的消息處理函數(shù)中調用InitAllCheckBoxStatus(),,實現(xiàn)復選框狀態(tài)的初始化。
三個消息處理函數(shù)及InitAllCheckBoxStatus()函數(shù)的實現(xiàn)如下:
C++代碼
- void CExample23Dlg::OnBnClickedPortalRadio()
- {
- // TODO: Add your control notification handler code here
- // 如果選擇了“門戶”單選按鈕,,則激活復選框“新浪”和“網(wǎng)易”,,其他復選框禁用并非選中
- InitAllCheckBoxStatus();
- m_check2.EnableWindow(TRUE);
- m_check5.EnableWindow(TRUE);
- }
-
-
- void CExample23Dlg::OnBnClickedForumRadio()
- {
- // TODO: Add your control notification handler code here
- // 如果選擇了“論壇”單選按鈕,則激活復選框“天涯論壇”和“鳳凰網(wǎng)論壇”,,其他復選框禁用并非選中
- 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);
- }
-
- // 初始化所有復選框的狀態(tài),,即全部禁用,,全部非選中
- 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. 程序運行后,,我們希望網(wǎng)站類型默認選擇為“門戶”,則修改對話框初始化函數(shù)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. 點擊“確定”后,將選擇的網(wǎng)站名字顯示到編輯框中,那么需要修改“確定”按鈕(原來的OK按鈕)的消息處理函數(shù)CExample23Dlg::OnBnClickedOk()如下:
C++代碼
- void CExample23Dlg::OnBnClickedOk()
- {
- // TODO: Add your control notification handler code here
- CString strWebsiteSel; // 選擇的網(wǎng)站
-
- // 若選中“雞啄米”則將其加入結果字符串
- 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("韓寒博客 ");
- }
- // 若選中“網(wǎng)易”則將其加入結果字符串
- if (1 == m_check5.GetCheck())
- {
- strWebsiteSel += _T("網(wǎng)易 ");
- }
- // 若選中“鳳凰網(wǎng)論壇”則將其加入結果字符串
- if (1 == m_check6.GetCheck())
- {
- strWebsiteSel += _T("鳳凰網(wǎng)論壇 ");
- }
-
- // 將結果字符串顯示于“選擇的網(wǎng)站”后的編輯框中
- SetDlgItemText(IDC_WEBSITE_SEL_EDIT, strWebsiteSel);
-
- // 為了避免點“確定”后對話框退出,,將OnOk注掉
- //CDialogEx::OnOK();
- }
10. 到此程序編寫完成,。運行程序彈出結果對話框,選擇網(wǎng)站后界面如下圖:
按鈕控件的內(nèi)容就這些了,。掌握了按鈕控件的基本用法,又動手編寫了這個實例后,相信大家對按鈕控件已經(jīng)很熟悉了,。雞啄米歡迎大家繼續(xù)來學習交流。