【转】VC6控件小记

2009-05-12 21:52

通用控件被包含在:COMCTL32.DLL

控件变量类型:

Value:关联值类型。→获得pulic变量(int & CString)

                     UpdateDataFALSE):可以向控件传递数据

                     UpdateDataTRUE):可以从控件获得数据

Control:通过GetSafeHwnd()得到控件句柄。→获得控件的实例,可调用控件支持函数。


Check Box


添加一个control变量(m_check)

//获取复选框选中状态
BOOL bCheck = m_check..GetCheck();


Edit control

添加一个value变量,初始化在OnInitDialog()中赋值。

使用UpdateDataFALSE)、UpdateDataTRUE)与控件交互。

   


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);

原文地址:https://www.cnblogs.com/vic_lu/p/2030092.html