通用控件被包含在: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,"<jane@126.com>"); //修改第0条数据的其他信息。 m_list1.SetItemText(0,1,"<nina@126.com> "); 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);
|
|