您的位置:首页 > 编程语言

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

2014-08-02 18:01 495 查看
一 、

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

它们默认的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下载地址:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐