1. 程式人生 > >MFC 列表,日曆,及動畫控制元件

MFC 列表,日曆,及動畫控制元件

新建基於對話方塊的應用程式。

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);   // 播放按鈕使能
}

執行結果