MFC控件编程:静态控件、按钮控件(一般按钮、单选按钮和复选按钮)、组合框控件、列表框控件、动画控件

来源:互联网 发布:seo蜘蛛精有什么用 编辑:程序博客网 时间:2024/05/17 07:22

一 、

         静态控件包括: 图片、静态文本、分组框控件。

                 它们默认的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 hereint 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 hereif (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 herePlay();}/***************************************************************************   停止按钮****************************************************************************/void CMFCPalyerDlg::OnStop() {// TODO: Add your control notification handler code herem_wndAnimateCtrl.Stop ();}

/**************************************************************************   相应列表框控件LBN_DBLCLK(鼠标双击)事件播放选中文件***************************************************************************/void CMFCPalyerDlg::OnDblclkList1() {// TODO: Add your control notification handler code hereint 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 hereint 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下载地址:点击打开链接

 

0 0