MFC控件編程:靜態控件、按鈕控件(一般按鈕、單選按鈕和複選按鈕)、組合框控件、列表框控件、動畫控件

一 、

         靜態控件包括: 圖片、靜態文本、分組框控件。

                 它們默認的ID都是IDC_STATIC。一般這些控件只起顯示作用,如果要操作這些控件需要修改ID以保證ID的唯一性。

                 圖片控件的使用:

                 

                 新建一個對話框程序,拖放一個Picture控件,添加一個bmp圖片資源(IDB_BITMAP1)和圖片控件相關聯,選中Picture控件設置他的樣式如下:

                

             運行結果:

               

                

         按鈕控件包括:一般按鈕、單選按鈕、複選按鈕。

                 它們所對應的控件類都是CButton類, 對控件的操作一般都是通過與之相關的類提供的函數完成的。

         組合框控件,對應的控件類是CComboBox, 可以接收用戶的輸入,也可以在多個選項中選擇一項,還可以通過屬性頁的方式添加控件的數據項。

                 CComboBox類的常用函數:

     

                    GetCout ();   // 獲取數據項的數量
                    GetCurSel(); // 獲取當前選擇項  
                    SetCurSel() ; // 設置當前選擇項
                    GetLBText ();   // 根據索引獲取選項字符串
                    AddString()/InsertString/DeleteString/FindString // 添加/插入/刪除/查找  數據項
                    ResetContent(); //重置數據項

        列表框控件: 對應CListBox類,可以在多個選項中選擇一項也可以選擇多項。只能通過代碼添加數據項。常用的函數與組合框類似。

        列表框控件的使用:

         

       新建一個對話框程序,拖放兩個List Box控件,四個按鈕控件。 這裏實現一個通過單擊相應按鈕交換左右兩個列表框控件的數據

       爲左邊的列表框控件關聯一個控件變量:m_wndListBoxLeft,爲右邊的列表框控件添加一個控件變量:m_wndListBoxRight,

       界面如下:

         

       添加一個列表框初始化函數InitListBox爲列表框添加數據並在OnInitDIalog函數中調用:

      

void CCListBoxDlg::InitListBox()
{
	m_wndListBoxLeft.AddString ("上海");
        m_wndListBoxLeft.AddString ("北京");
	m_wndListBoxLeft.AddString ("深圳");
	m_wndListBoxLeft.AddString ("杭州");

}
按鈕對應的響應函數如下:

 

void CCListBoxDlg::OnBtnOneright() 
{
	// TODO: Add your control notification handler code here
        int nItem = m_wndListBoxLeft.GetCurSel ();
        if (nItem == LB_ERR)
	{
		MessageBox ("No Item Selected!");
		return;
	}
	CString str;
	m_wndListBoxLeft.GetText (nItem, str);
	m_wndListBoxRight.AddString (str);
	m_wndListBoxLeft.DeleteString (nItem);	
}


void CCListBoxDlg::OnBtnAllright() 
{
	// TODO: Add your control notification handler code here
	int nCount = m_wndListBoxLeft.GetCount ();
	for (int i = 0; i < nCount; ++i)
	{
		CString str;
		m_wndListBoxLeft.GetText (i, str);
		m_wndListBoxRight.AddString (str);
	}
	// 清空左邊列表框,注意不要在循環裏做
	m_wndListBoxLeft.ResetContent ();
}

         動畫控件:對應CAnimateCtrl類播放簡單的AVI幀動畫。

                               函數:  

                     Open(); // 打開指定文件
                     Play();  // 播放
                     Stop(); // 停止 

二、 一個播放簡單動畫的例子

       程序的運行截圖:

     

  界面設計如下:

                            

   最大的那個是Animate控件,“打開”按鈕用來選擇要播放的文件,打開按鈕左邊爲編輯框用來顯示打開的文件的路徑,

   右邊一個ListBox控件用來顯示所有代開的播放文件名,一個CheckBox控件用來設置是否循環,一個Combo Box控件用來設置循環次數

   兩個Radido按鈕用來設置播放狀態:播放、停止

   爲 Animate控件關聯一個控件類型的變量m_wndAnimateCtrl,爲List Box控件關聯一個控件類型的變量m_wndListCtrl方便後面對它們的操作

   這裏先介紹下CFileDialog類的使用:

   CFileDialog是微軟封裝好的一個用於文件打開和保存的類,使用該類不需要創建對話框資源與之關聯,只需構造一個對象即可

   構造函數:

CFileDialog( 
    BOOL bOpenFileDialog,        //標識打開或者另存爲對話框
    LPCTSTR lpszDefExt = NULL,   //默認的文件後綴 
    LPCTSTR lpszFileName = NULL, //默認的文件名稱 
    DWORD dwFlags = ,            //窗口的風格
    LPCTSTR lpszFilter = NULL,   //過濾字符串
    CWnd* pParentWnd = NULL      //父窗口,通常設置爲NULL
   );
 需要注意的是:過濾字符串的格式
    1 每個數據項之間用|隔開,整個字符串以||結尾
    2 每個數據項分爲顯示的部分和過濾的部分。這兩部分也以 | 分隔。
        比如這裏想代開avi文件或所有類型文件:       "視頻文件(*.avi)|*.avi|所有文件(*.*)|*.*||";

   CFileDialog兩個常用函數:

   CFileDialog::GetPathName() // 獲取打開的文件的路徑
   CFileDialog::GetFileName() // 獲取文件名稱

另外:爲了保存和列表框(CListBox)/組合框相關聯的數據,調用SetItemData/GetItemData函數來設置和獲取附加數據。

具體功能函數實現如下:

/******************************************************************
   打開視頻文件,添加不重複的視頻文件到播放列表中,保存文件路徑
*******************************************************************/
void CMFCPalyerDlg::OnBtnOpenfile() 
{
	// TODO: Add your control notification handler code here
	// 文件類型過濾器
	char szFilter[] = "視頻文件(*.avi)|*.avi|所有文件(*.*)|*.*||";
	CFileDialog dlg (TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL);
	if (IDCANCEL == dlg.DoModal ())
		return;

        m_strPath = dlg.GetPathName ();
	if (LB_ERR == m_wndListBox.FindString (-1, dlg.GetFileName ()))
	{
		int nIndex = m_wndListBox.AddString (dlg.GetFileName ());

		// 把列表框項對應的路徑信息存入附加附加數據
		CString *pStrPath = new CString;
		*pStrPath = dlg.GetPathName ();
		m_wndListBox.SetItemData (nIndex, (DWORD)pStrPath);
	}
        Play();
	UpdateData (FALSE);
}

/************************************************************************
     當勾選"循環"複選框式啓用組合框控件供用戶選擇循環次數,否則禁用組合框
*************************************************************************/
void CMFCPalyerDlg::OnCheck() 
{
	// TODO: Add your control notification handler code here
	if (m_check.GetCheck ())
		m_wndComboBox.EnableWindow ();
	else
        m_wndComboBox.EnableWindow (FALSE);	
}

/***************************************************************************************
   播放視頻文件函數,注意:這裏的播放路徑和循環次數由成員變量:m_strPath,m_loopcount決定
****************************************************************************************/
void CMFCPalyerDlg::Play()
{
	 // 打開視頻文件
	m_wndAnimateCtrl.Open (m_strPath);
	// 播放
	m_wndAnimateCtrl.Play (0, -1, m_loopcount);

}

/**************************************************************************
   播放按鈕
***************************************************************************/
void CMFCPalyerDlg::OnPlay() 
{
	// TODO: Add your control notification handler code here	
	Play();
}
/***************************************************************************
   停止按鈕
****************************************************************************/
void CMFCPalyerDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	m_wndAnimateCtrl.Stop ();
	
}

/**************************************************************************
   相應列表框控件LBN_DBLCLK(鼠標雙擊)事件播放選中文件
***************************************************************************/
void CMFCPalyerDlg::OnDblclkList1() 
{
	// TODO: Add your control notification handler code here
	int nItem = m_wndListBox.GetCurSel ();
    CString *pStrPath = (CString*)m_wndListBox.GetItemData (nItem);
	m_strPath = *pStrPath;
	Play ();
}

/*********************************************************************************
   通過組合框控件選擇設置(CBN_SELCHANGE)播放循環次數(改變成員變量m_loopcount的值)
**********************************************************************************/
void CMFCPalyerDlg::OnSelchangeCombo1() 
{
	// TODO: Add your control notification handler code here
	int nSel = m_wndComboBox.GetCurSel ();
	if (CB_ERR == nSel)
		return;
	switch (nSel)
	{
	case 0:// 1 次
		m_loopcount = 1;
		break;
	case 1:// 2 次
		m_loopcount = 2;
		break;
	case 2:// 一直
		m_loopcount = -1;
		break;
	}
}


運行效果如下:


Demo下載地址:點擊打開鏈接

 

發佈了93 篇原創文章 · 獲贊 67 · 訪問量 100萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章