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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章