MFC 列表,日曆,及動畫控制元件
阿新 • • 發佈:2019-01-02
新建基於對話方塊的應用程式。
1.列表控制元件
新建一個列表控制元件,屬性改為報表(report),在列表控制元件下建兩個靜態文字框,用來顯示選中的項。為列表控制元件新增一個變數m_list;
在標頭檔案中新增一個pubilic影象列表控制元件
// 影象控制元件
CImageList m_imageList;
在初始化區域中編寫程式碼
// TODO: 在此新增額外的初始化程式碼 srand(time(NULL)); CString title[3] = { L"性別", L"年齡", L"名字" }; // 插入標題 for (int i = 0; i < 3; i++){ m_list.InsertColumn(i, title[i], LVCFMT_CENTER); } // 設定標題寬度 m_list.SetColumnWidth(0, 70); m_list.SetColumnWidth(1, 50); m_list.SetColumnWidth(2, 80); // 設定列表風格 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 設定顏色 m_list.SetBkColor(RGB(255, 179, 179)); m_list.SetTextBkColor(RGB(255, 125, 180)); m_list.SetTextColor(RGB(255, 21, 21)); // 插入圖片 CBitmap bm; m_imageList.Create(24, 24, ILC_COLOR32, 3, 3); bm.LoadBitmapW(IDB_BITMAP1); // 載入圖片 m_imageList.Add(&bm, RGB(0, 255, 0)); // 新增圖片 bm.DeleteObject(); // 釋放資源 bm.LoadBitmapW(IDB_BITMAP2); // 載入圖片 m_imageList.Add(&bm, RGB(0, 255, 0)); // 新增圖片 m_list.SetImageList(&m_imageList, LVSIL_SMALL); // 插入輸出資料 CString firName[15] = { L"謝", L"宋", L"唐", L"許", L"韓", L"馮", L"鄧", L"曹", L"彭", L"曾", L"肖", L"田", L"董", L"袁", L"潘" }; CString senName[15] = { L"林", L"", L"言", L"", L"", L"", L"於", L"", L"", L"時", L"", L"", L"酒", L"江", L"被" }; CString thrName[15] = { L"趙", L"錢", L"順", L"李", L"周", L"董", L"路", L"萬", L"凡", L"峰", L"平", L"江", L"志", L"仇", L"山" }; for (int i = 0; i < 5; i++){ CString age; int sex = rand() % 2; age.Format(L"%d", rand() % 20 + 20); m_list.InsertItem(0, sex ? L"男": L"女",!sex); // 在這裡插入圖片sex 0,1 m_list.SetItemText(0, 1, age); m_list.SetItemText(0, 2, firName[rand() % 15] + senName[rand() % 15] + thrName[rand() % 15]); }
執行結果為:
雙擊圖形列表控制元件程式設計:
將下面右邊的靜態文字框ID設為IDC_STATIC_SHOW
執行結果void CListCalendarAnimateDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: 在此新增控制元件通知處理程式程式碼 // 遍歷 for (int i = 0; i < m_list.GetItemCount(); i++){ if (m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED){ // 如果選中 CString sex = m_list.GetItemText(i, 0); CString age = m_list.GetItemText(i, 1); CString name = m_list.GetItemText(i, 2); CString str = L"性別:" + sex + L" 年齡:" + age + L" 姓名:" + name; SetDlgItemText(IDC_STATIC_SHOW, str); } } *pResult = 0; }
新增控制元件,如圖所示:
姓名編輯框ID設為IDC_EDIT_NAME
,年齡編輯框設為IDC_EDIT_AGE.
性別單選按鈕,先選中'男',"女",設定Group為True.
給姓名編輯框新增變數m_name,
年齡編輯框新增變數m_age,
性別單選按鈕新增變數value型的int型的m_sex.
設定女單選框的Group屬性值為FALSE.
雙擊新增資料按鈕程式設計:
此時便可以新增資料了void CListCalendarAnimateDlg::OnBnClickedButtonAdddata() { // TODO: 在此新增控制元件通知處理程式程式碼 UpdateData(TRUE); // 將控制元件中的值傳給成員變數 if (m_name.IsEmpty()){ // 如果姓名編輯框為空 AfxMessageBox(L"姓名不能為空", MB_ICONERROR); GetDlgItem(IDC_EDIT_NAME)->SetFocus(); // 設定焦點到編輯框 return; } if (m_age.IsEmpty()){ // 如果年齡編輯框為空 AfxMessageBox(L"請輸入年齡.", MB_ICONERROR); GetDlgItem(IDC_EDIT_AGE)->SetFocus(); // 設定焦點到年齡編輯框 return; } int num = m_list.GetItemCount(); // 獲取現在選項個數 m_list.InsertItem(num, !m_sex ? L"男" : L"女", m_sex); // 插入性別和點陣圖 m_list.SetItemText(num, 1, m_age); // 插入年齡 m_list.SetItemText(num, 2, m_name); // 插入姓名 m_age = m_name = L""; // 將姓名,年齡設為空 UpdateData(FALSE); // 將成員變數的值傳給控制元件 }
新增一個控制風格的單選按鈕
如圖所示:
設定風格,報表的ID分別為IDC_RADIO_LIST,IDC_RADIO_REPORT
設定好group屬性後,給給列表radio新增一個變數m_style
在初始化區域:
// 顯示風格初始化
m_style.SetCheck(TRUE);
m_list.ModifyStyle(LVS_ICON | LVSIL_SMALL | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_LIST, TRUE);
分別雙擊列表radio和報表radio程式設計:
void CListCalendarAnimateDlg::OnBnClickedRadioList()
{
// TODO: 在此新增控制元件通知處理程式程式碼
m_list.ModifyStyle(LVS_ICON | LVSIL_SMALL | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_LIST, TRUE);
}
void CListCalendarAnimateDlg::OnBnClickedRadioReport()
{
// TODO: 在此新增控制元件通知處理程式程式碼
m_list.ModifyStyle(LVS_ICON | LVS_LIST | LVSIL_SMALL, LVS_REPORT, TRUE);
}
執行結果:
2.新增日曆控制元件
新增控制元件,如圖所示:
給日曆控制元件新增變數 m_monthCalCtrl
給年,月,日編輯框新增變數m_year,m_month,m_day
在Dlg.cpp檔案中,的建構函式中新增程式碼
CListCalendarAnimateDlg::CListCalendarAnimateDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CListCalendarAnimateDlg::IDD, pParent)
, m_name(_T(""))
, m_age(_T(""))
, m_sex(0)
, m_year(0)
, m_month(0)
, m_day(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
// 新增的程式碼
CTime tm = CTime::GetCurrentTime(); // 獲取系統時間
m_year = tm.GetYear();
m_month = tm.GetMonth();
m_day = tm.GetDay();
}
雙擊設定,新增程式碼:
void CListCalendarAnimateDlg::OnBnClickedButton2()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE); // 將控制元件的資料傳遞給成員變數
CTime tm(m_year, m_month, m_day,0,0,0);
m_monthCalCtrl.SetCurSel(tm);
}
在初始化區域中新增:
// 日曆控制元件
m_monthCalCtrl.SetFirstDayOfWeek(0); //設定一星期的第一天
執行結果為:
3.新增動畫控制元件
如圖所示
給動畫控制元件Animation Control 新增變數m_animate
設定停止,播放的ID為IDC_BUTTON_STOP,IDC_BUTTON_PLAY
新增一個avi視訊資源,並匯入:
在初始化區域新增程式碼:
// 動畫控制元件
m_animate.Open(IDR_AVI1);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); // 使播放按鈕不能按下
分別雙擊停止和播放程式設計:void CListCalendarAnimateDlg::OnBnClickedButtonPaly()
{
// TODO: 在此新增控制元件通知處理程式程式碼
m_animate.Play(0, -1, -1); // 播放視訊
GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE); // 播放按鈕使不能
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE); // 停止按鈕使能
}
void CListCalendarAnimateDlg::OnBnClickedButtonStop()
{
// TODO: 在此新增控制元件通知處理程式程式碼
m_animate.Stop(); // 暫停播放
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); // 停止按鈕使不能
GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE); // 播放按鈕使能
}
執行結果