通用控件被包含在:COMCTL32.DLL
控件变量类型:
Value:关联值类型。→获得pulic变量(int & CString)
UpdateData(FALSE):可以向控件传递数据
UpdateData(TRUE):可以从控件获得数据
Control:通过GetSafeHwnd()得到控件句柄。→获得控件的实例,可调用控件支持函数。
Check Box
添加一个control变量(m_check)
//获取复选框选中状态
BOOL bCheck = m_check..GetCheck();
Edit control
添加一个value变量,初始化在OnInitDialog()中赋值。
使用UpdateData(FALSE)、UpdateData(TRUE)与控件交互。
List Box
//添加列信息
CString str;
m_ctllist.AddString(str);
//删除列信息
int nItem;
nItem = m_ctllist.GetCurSel();
if (n_ltem == LB_ERR)
{
return;
}
m_ctllist.DeleteString(nItem);
//获取信息条数
m_ctllist.GetCount();
//获取信息内容
int n; //第几行
CString s;
m_ctllist.GetText(n,s);
List Control (列表控件)
MFC中使用CListCtrl类来封装列表控件的各种操作
列表控件可以看作是功能增强的ListBox,提供了四种风格,LVS_ICON(大图标) LVS_SMALLICON(小图标) LVS_LIST(列表) LVS_REPORT(报表)。(在控件属性中的View中进行设置)。
为列表控件添加一个控制变量(m_list),通过其对相应函数进行调用。
报表风格 LVS_REPORT
SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //加网格
//List title (报表风格就必须先设置列表控件中的列信息)
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);
iCol为列的位置(列号),从零开始
lpszColumnHeading为显示的列名
nFormat为显示对齐方式
nWidth为显示宽度
nSubItem为分配给该列的列索引
int SetColumnWidth(int nCol,int nWidth); //设置列宽
CRect rect;
m_list.GetClientRect(rect); //获得当前客户区信息
m_list.SetColumnWidth(0,rect4.Width()/4);
m_list.SetColumnWidth(1,rect4.Width()/4);
m_list.SetColumnWidth(2,rect4.Width()/4);
m_list.SetColumnWidth(3,rect4.Width()/4);
//List content
插入显示数据
int InsertItem( int nItem, LPCTSTR lpszItem ); //可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符
BOOL SetItemText(int nItem, int nSubItem, LPTSTR lpszText ); //可以设置每列的显示字符。nItem为设置的项的位置(行号),nSubItem为列位置(列号),lpszText为显示字符。
获取显示数据
CString GetItemText( int nItem, int nSubItem ); //用于得到某项的显示字符
删除显示数据
BOOL DeleteItem(int nItem); //用于删除某一项
BOOL DeleteAllItems( ); //将删除所有项
相关操作
void SetItemCount( int iCount ); //用于得到添加进列表中项的数量
//界面
得到/修改控件的状态
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr ); //用于得到/设置显示的字符颜色
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr ); //用于得到/设置显示的背景颜色
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent); //用于设置背景位图
示例:
1.添加ListControl 控件,属性中的Appearance属性页下的View选择Report。
并设置其对应的控制变量如:m_list。
2.初始化,即设置list title
m_list.InsertColumn(0,_T("From"),LVCFMT_LEFT);
m_list.InsertColumn(1,_T("To"),LVCFMT_LEFT);
m_list.InsertColumn(2,_T("Sbuject"),LVCFMT_LEFT);
m_list.InsertColumn(3,_T("Date"),LVCFMT_LEFT);
CRect rect;
m_list.GetClientRect(rect);
m_list.SetColumnWidth(0,rect4.Width()/4);
m_list.SetColumnWidth(1,rect4.Width()/4);
m_list.SetColumnWidth(2,rect4.Width()/4);
m_list.SetColumnWidth(3,rect4.Width()/4);
这部分初始化操作,最好放在对话框类的OnInitDialog()函数里,自动初始化。
3.插入数据
//插入第一个数据,即第0条数据。先插入,然后在修改其他的信息。
m_list.InsertItem(0,"<[email protected]>");
//修改第0条数据的其他信息。
m_list1.SetItemText(0,1,"<[email protected]> ");
m_list1.SetItemText(0,2,"ok");
m_list1.SetItemText(0,3,"2009-01-01");
4.删除所有数据
m_list.DeleteAllItems();
补充:
<1>列可与一个结构体关联
//添加一个项目
int nItem = m_list.InsertItem(m_list.GetItemCount(), _T("content"));
//创建自定义结构(不能使用局部变量)
ITEMDATA *pData = new ITEMDATA;
//设置项目数据
m_list.SetItemData(nItem, (DWORD)pData);
//获取项目数据
ITEMDATA *pData = (ITEMDATA *)m_list.GetItemData(nItem);
//删除MyListCtrl中的项目前
delete (ITEMDATA *)m_list.GetItemData(nItem);
<2>带有CheckBox的CListCtrl中Check状态的获取
a. 建立测试工程
新建一个对话框工程,并添加一个CListCtrl控件,并关联一个成员变量m_List。
b. 设置LVS_EX_CHECKBOXES风格
ListView_SetExtendedListViewStyle(m_List.GetSafeHwnd(), m_List.GetExStyle() | LVS_EX_CHECKBOXES);
c.为listctrl添加测试项
在OnInitDialog()中添加如下代码:
m_List.InsertColumn(0,"Name",LVCFMT_LEFT,150);
m_List.InsertColumn(1,"Sex",LVCFMT_LEFT,200);
m_List.InsertItem(0, "jane");
m_List.InsertItem(1, "nina");
d.添加控件通知消息
为ListCtrl控件添加LVN_ITEMCHANGED消息。系统生成如下代码:
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}
e.在LVN_ITEMCHANGED消息处理函数中添加代码如下:
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */
)
{
TRACE("Item %d is checked\n", pNMLV->iItem);
}
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */
)
{
TRACE("Item %d is unchecked\n", pNMLV->iItem);
}
else
{
TRACE("Item %d does't change the check-status\n", pNMLV->iItem);
}
*pResult = 0;
}
f.调试
在debug环境下,改变checkbox的选中状态,查看输出信息。
progress control(进度指示器)
m_progress->GetPos(); //获取进度条的当前位置
m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限
m_progress->OffsetPos(int nPos); //用指定的增量推进进度条控件的当前位置,重绘进度条反映新位置
m_progress->SetBkColor(COLORREF clrNew); //设定进度条的背景颜色
m_progress->SerPos(int nPos); //设定进度条控件的当前位置,重绘进度条反映新位置
m_progress->SetRange(int min,int max); //设定进度条控件的范围的下限和上限
m_progress->SetRange32(int min,int max); //设定进度条控件的范围的下限和上限
m_progress->SetStep(int nStep); //指定进度条控件的步进增量
m_progress->StepIt(); //通过步进增量,推进进度条控件的当前位置,重绘进度条反映新位置
应用:
CProgressCtrl *m_progress; //头文件中声明
在OnInitDialog初始化
{
m_progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
m_progress->SetRange(0,1000);
m_progress->SetPos(0);
UINT m_timer =(UINT) SetTimer(1,200,NULL);
}
采用在定时器的消息处理函数WM_TIMER内添加不断更新进度条界面的方法
OnTimer (nIDEvent)
{
pos = pos + 50;
if(pos>500)
pos = 0;
m_Progress->SetPos(pos);
}
或者采用在某种循环体内添加不断更新进展条界面的方法
Tab control
1、添加上一个Tab Control 控件
为这个控件添加一个变量,如:m_tabctrl
2、创建两个新的对话框资源,其属性作如下修改:
Border:none //边界为空,这样它就没了标题栏
Style :Child // 这样这个模板就可以当作另一个窗口的子窗口了。
可在上面加一些控件,具体操作跟普通对话框没有区别。
完成后从这两个对话框模板生成两个新的对话框类。
3、在主对话框中为新添加进来的两个类增加两个变量:
如:CDialog1 m_mm1;
CDialog2 m_mm2;
4、在主对话框的OnInitDialog()函数中添加如下类似的代码:
TCITEM item;
item.mask = TCIF_TEXT;
//标签控件增加两个标签页面,文本是标题
item.pszText = "Fist";
m_tabctrl.InsertItem (0,&item);
item.pszText ="Second";
m_tabctrl.InsertItem (1,&item);
m_mm1.Create (IDD_DIALOG1,&m_tabctrl);
m_mm2.Create (IDD_DIALOG2,&m_tabctrl);
//设置这两个对话框在Z顺序中的位置,显示或隐藏状态
m_mm1.SetWindowPos (NULL,10,30,400,100,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,400,100,SWP_HIDEWINDOW );
5、在主对话框中为标签控件添加一个标签选择改变(TCN_SELCHANGE)的控件通知消息,以便在用户选择标签时通知主对话框。在主对话框的编辑界面右击标签控件,选择添加一个事件可以完成这个操作。
在事件处理中添加如下代码,如下例:
void CtabdialogDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
//为了不使显示的子对话框覆盖标签控件的显示,要获得标签控件的尺寸后再设置各页面的尺寸
CRect r;
m_tabctrl.GetClientRect (&r);
//选择标签页
switch(m_tabctrl.GetCurSel())
{
case 0:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW );
break;
case 1:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW );
break;
}
*pResult = 0;
}
或者:
m_Tab.InsertItem(0,"第一页");
m_Tab.InsertItem(1,"第二页");
m_Tab.InsertItem(2,"第三页");
m_Tab.InsertItem(3,"第四页");
m_PageA.Create(IDD_PROPPAGE_A,&m_Tab);
m_PageB.Create(IDD_PROPPAGE_B,&m_Tab);
m_PageC.Create(IDD_PROPPAGE_C,&m_Tab);
m_PageD.Create(IDD_PROPPAGE_D,&m_Tab);
m_PageA.ShowWindow(SW_SHOW);
m_PageB.ShowWindow(SW_HIDE);
m_PageC.ShowWindow(SW_HIDE);
m_PageD.ShowWindow(SW_HIDE);