LIST CONTROL

 

2. 关于list control 的高级应用--- 条目编辑

 论坛中搜索一下, 你会发现不少类似的提问: 我如何编辑list control 的条目? 如何直接编辑list control... 等等;list control 可用来做数据库表的视图, 十分有用.

但报表风格的list control 只能编辑第一列, 其余的该死的微软没为vc 做到. 它怕VB 卖不出. 于是C++ 程序员只好DIY. 主要思想是在list control 中动态创建一个控件, 动态移动该控件到相应位置. 这些方法早有人讨论过了, 本文也是基于如上思想的, 但注重于可扩充性与使用的方便.

List control 这头主要是重载OnLButtonDown 方法, 计算出被点中的条目. 这里重要的函数是SubItemHitTest 和GetSubItemRect, 看msdn 上有相关说明. 用户点中后, 就要负责显示控件了: 如果之前选中了其他, 就要验证之前的改动是否成功. 不成功就要回到原来的地方, 成功就应用修改并移到新位置. 看代码:

static     const UINT IDCHAILD="3000";

void CValidateList::OnLButtonDown(UINT nFlags, CPoint point)

{

              CListCtrl::OnLButtonDown(nFlags, point);

       LVHITTESTINFO hi;

    hi.pt = point;

       if(SubItemHitTest(&hi) != -1 )// 没有点中条目就不管

       {if(m_col==-1||//-1 还没被选过

                     true==(m_col+m_validate)->Validate (m_row))

              {

m_row = hi.iItem, m_col= hi.iSubItem;//m_row,m_col 成

// 员分别跟踪选中的行列

}

((m_col+m_validate))->Move (_GetRect(),m_row);

       }

}

 

WinBlast* CValidateList::SetValidate( WinBlast*in)// 设置验证的

// 控件群,in 对应第一列,in+1 第二列……

{

       WinBlast*ret=m_validate;

       m_validate=in;

       int counts="GetHeaderCtrl"()->GetItemCount();;

       RECT rect;

     memset(&rect,0,sizeof(rect));

       for(int i="0";i< span>

         (in+i)->Create (this,rect,IDCHAILD+i,i);

       m_col=-1;// 没有被选中的

       return ret;

}

 

 

RECT CValidateList::_GetRect()// 内部使用, 得到相应显示位置

{

       CRect ret;

GetSubItemRect(m_row,m_col,LVIR_BOUNDS,ret);

return ret;

}

 

void CValidateList::NoSelect()// 置未选中状态

{

m_col=-1;// 没有被选中的

}

看到了WinBlast*ret=m_validate 吧.WinBlast 是用来修改和验证数据的控件看它的实现:

class WinBlast 

{

       int m_col;// 跟踪列, 为什么要这个? 因为你可以让一种控件对

// 不同列用不同的验证策略

CWnd* m_win;// 你的控件窗口

       CListCtrl *m_parent;// 用它获得文本

public:

       WinBlast(){m_win=NULL;}

       ~WinBlast(){m_win->DestroyWindow();delete m_win;}

 

virtual     bool Create( CWnd* pParentWnd,

              const RECT& rect, UINT nID,

              int col)

       {

              m_col=col;m_parent=(CListCtrl *)pParentWnd;

              m_win=new CEdit;

                    return  ((CEdit*)m_win)->

                     Create(ES_NOHIDESEL,rect,pParentWnd,nID);

              }

       void Move(const RECT &rect,int row)// 最重要的函数但前面

// 两个动作是必作的,SetText 为虚, 你在那做你喜欢的

; {

              m_win->ShowWindow(SW_SHOW);

              m_win->MoveWindow(&rect);

              SetText(row);

       }

       virtual bool Validate(int row)// 验证, 虚函数. 这里永远返回true

       {

              m_win->ShowWindow(SW_HIDE);

              CString set;

              m_win->GetWindowText(set);

              m_parent->SetItemText(row,m_col,set);

              return true;

       }

       virtual void SetText(int row)

       {

              m_win->SetWindowText(m_parent->GetItemText(row,m_col));

              ((CEdit*)m_win)->SetSel (0,-1);

              }

      

       };

实际使用通常是这样的:

       WinBlast*p=new WinBlast[sizeof(col)/sizeof(col[0])];//col 是

         // 列名字符数组,sizeof(col)/sizeof(col[0]) 计算列数

       m_test.SetValidate (p);//m_test 是CValidateList 类

你可以继承WinBlast, 重载Create 建立一个下拉框, 加入你喜爱的验证方法.

注意我的设计漏洞:CValidateList 应接收WinBlast**, 而不是WinBlast*----- 不理解这个漏洞其实也不要紧: 但要记住, 不改正的话你的WinBlast 后继类就不能加数据成员了.

 

3. 如何在 VC MFC 的 List Control 中实现拷贝功能?

Reference: http://zhidao.baidu.com/question/13639294.html

我在单文档视图中加入一个 List Control 控件 (Report 形式 ) ,并关联类 CListCtrl 的一个对象,往里面写数据什么的都行,但在界面上无法实现对报表数据的拷贝(快捷或右键都不行),想请教如何实现拷贝该报表显示的数据?

1 对 CListCtrl 创建 click 事件,记录 item

2 在视图所在的类创建虚函数 PreTranslateMessage

加入代码

if(pMsg->message == WM_KEYDOWN)

{

if(pMsg->wParam==13)// 这里 13 是表示回车键盘,你也可以改成其他的

{

copy();

}

}

3. 编写 copy 函数,取得 item 处的文本,保存只剪切板

 

4. 更改列表控件样式

创建列表控件 (List Control) (CListCtrl) 后,可以在任何时间更改它的窗口样式。通过更改窗口样式来更改控件使用的视图类型。例如,为了模拟“资源管理器”,您可以提供菜单项或工具栏按钮以在不同的视图(图标视图、列表视图等)之间切换控件。

例如,用户选择您的菜单项后,您可以调用 GetWindowLong 来检索控件的当前样式,然后调用 SetWindowLong 来重置样式。有关更多信息,请参见 Platform SDK 中的使用列表视图 (ListView) 控件。

可用样式在 Create 中列出。样式 LVS_ICON LVS_SMALLICONLVS_LIST LVS_REPORT 指定四种列表控件 (List Control) 视图。

扩展样式

除了列表控件 (List Control) 的标准样式之外,还有另一个称为扩展样式的样式集。Platform SDK 中的扩展列表视图样式讨论了这些样式,这些样式可提供自定义列表控件 (List Control) 行为的各种有用功能。若要实现某个样式的行为(如随意选择),请调用 CListCtrl::SetExtendedStyle 传递所需的样式。下面的示例说明该函数调用:

m_myListCtrl.SetExtendedStyle(LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE);

注意     要使随意选择起作用,还必须打开 LVS_EX_ONECLICKACTIVATELVS_EX_TWOCLICKACTIVATE

 

5. 在列表控件( List Control )中实现工作区

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

默认情况下,列表控件 (List Control) 按标准网格格式排列所有项。但也支持另一种方法:工作区。工作区将列表项排列到矩形组中。有关实现工作区的列表控件 (List Control) 的图像,请参见 Platform SDK 中的“使用列表- 视图控件”。

注意     工作区只有当列表控件 (List Control) 处于图标或小图标模式时才可见。但是,如果视图切换到报表或列表模式,将维持任何当前工作区。

工作区可用来显示空边框(在项的左侧、顶部和/ 或 右侧),或在通常不会有水平滚动条的时候显示水平滚动条。另一个普通用法是创建多个工作区,可以将项移动或放置到这些工作区。使用该方法可以在单一视图中创建具有不同意义的区域。然后用户可以将项放置到不同的区域以对它们分类。此类示例可以是一个文件系统的视图,它包含一个读/ 写文件区,一个只读文件区。如果将文件项移动到只读区,它将自动变为只读。将文件从只读区移动到读/ 写区会使文件成为可读/ 写的。

CListCtrl 为创建和管理列表控件 (List Control) 工作区提供几个成员函数。GetWorkAreas 和 SetWorkAreas 检索并设置CRect 对象(或 RECT 结构)数组,该数组存储当前实现的列表控件 (List Control) 工作区。另外,GetNumberOfWorkAreas 检索列表控件 (List Control) 的当前工作区数目(默认值为零)。

项和工作区

工作区创建后,工作区中的项成为其成员。同样,如果将一个项移动到某个工作区,则该项成为它所移动到的工作区的成员。如果某个项不在任何工作区中,则它自动成为第一个工作区(索引 0 )的成员。如果想创建项并将其放置到一个特定的工作区,则需要创建该项,然后调用 SetItemPosition 将项移动到所需工作区。下面的第二个示例说明该技术。

下面的示例在列表控件 (List Control) ( m_listctrl ) 中实现四个大小相等的工作区 ( rcWorkAreas ) ,每个工作区都有 10 像素宽的边框。

CRect curRect;

CSize size;

 

size= m_listctrl.ApproximateViewRect();

size.cx+= 100;

size.cy+= 100;

 

CRect rcWorkAreas[4];

 

rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);

rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);

rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);

rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);

 

//set work areas

m_listctrl.SetWorkAreas(4, rcWorkAreas);

调用 ApproximateViewRect 来获取在一个区域显示所有项所需要的总区域大小的估计值。之后,该估计值被分成四个区域并用 5 像素宽的边框填充。

下一个示例将现有列表项分配给每一组 ( rcWorkAreas ) 并刷新控件视图 ( m_listctrl ) 以实现此效果。

// set insertion points for each work area

CPoint     rgptWork[4];

for (int i = 0; i < 4; i++)

{

     rgptWork[i].x = rcWorkAreas[i].left + 10;

     rgptWork[i].y = rcWorkAreas[i].top + 10;

}

// now move all the items to the different quadrants

for (i = 0; i < 20; i++)

     m_listctrl.SetItemPosition(i, rgptWork[i % 4]);

 

// force the control to rearrange the shuffled items

m_listctrl.Arrange(LVA_DEFAULT);

 

6. 处理列表控件( List Control )中的通知消息

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

用户单击列标题、拖动图标、编辑标签等时,列表控件 (List Control) (CListCtrl) 将通知消息发送给它的父窗口。如果要进行某种响应,请处理这些消息。例如,用户单击列标题后,可能想基于单击的列的内容对项排序,如在 Microsoft Outlook 中所做的那样。

在视图或对话框类中处理列表控件 (List Control) 的 WM_NOTIFY 消息。基于正在处理的通知消息,用“属性”窗口创建带 switch 语句的 OnChildNotify 处理函数。

有关列表控件 (List Control) 可以发送到其父窗口的通知的列表,请参见 Platform SDK 中的列表视图 (ListView) 控件参考。

 

7. 虚拟列表控件

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

虚拟列表控件指具有 LVS_OWNERDATA 样式的列表视图 (ListView) 控件。该样式启用控件来支持项数达到DWORD (默认的项数只扩展到 int )。然而,该样式的最大便利是可以使内存中一次只有一个数据项子集。这使虚拟列表视图 (ListView) 控件可以将自己借给大型信息数据库使用,而在这类数据库中已存在特定的数据访问方法。

注意    MFC 除了在 CListCtrl 中提供虚拟列表功能外,还在 CListView 类中提供相同的功能。

在开发虚拟列表控件时应注意一些兼容性问题。有关更多信息,请参见 Platform SDK 中“ 列表 - 视图控件” 主题的“ 兼容性问题” 一节。

处理 LVN_GETDISPINFO 通知

虚拟列表控件维护非常少的项信息。除了项选择和焦点信息,所有项信息都由控件的所有者管理。框架通过 LVN_GETDISPINFO通知消息来请求信息。若要提供请求的信息,虚拟列表控件的所有者(或控件本身)必须处理该通知。使用“ 属性” 窗口可以很容易地完成此操作(请参见 将消息映射到函数 )。所得到的代码应类似于下面的示例(其中 CMyListCtrl 是虚拟列表控件对象,控件正在处理通知)。

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)

   ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)

END_MESSAGE_MAP()

LVN_GETDISPINFO 通知消息的处理程序中,必须检查正在请求的信息的类型。可能值是:

·                  LVIF_TEXT     必须填写 pszText成员。

·                  LVIF_IMAGE     必须填写 iImage成员。

·                  LVIF_INDENT     必须填写 iIndent成员。

·                  LVIF_PARAM     必须填写 lParam成员。

·                  LVIF_STATE     必须填写 state成员。

然后应将所有请求的信息提供给框架。

下面的示例摘自列表控件 (List Control) 对象的通知处理程序体,它通过为文本缓冲区和项的图像提供信息来说明一种可能的方法:

LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

LV_ITEM* pItem= &(pDispInfo)->item;

 

int iItemIndx= pItem->iItem;

 

if (pItem->mask & LVIF_TEXT) //valid text buffer?

{

    switch(pItem->iSubItem){

        case 0: //fill in main text

            lstrcpy(pItem->pszText,

                m_Items[iItemIndx].m_strItemText);

            break;

        case 1: //fill in sub item 1 text

            lstrcpy(pItem->pszText,

                m_Items[iItemIndx].m_strSubItem1Text);

            break;

        case 2: //fill in sub item 2 text

            lstrcpy(pItem->pszText,

                m_Items[iItemIndx].m_strSubItem2Text);

            break;

    }

}

 

if pItem->mask & LVIF_IMAGE) //valid image?

        pItem->iImage=

            m_Items[iItemIndx].m_iImageIndex;

缓存和虚拟列表控件

由于这种类型的列表控件 (List Control) 是提供给大的数据集的,因此建议您缓存请求的项数据以提高检索性能。框架提供缓存提示机制,通过发送LVN_ODCACHEHINT 通知消息来帮助优化缓存。但是,您必须使用一种稍有不同的方法来处理该通知。使用“ 属性” 窗口,重写列表控件 (List Control) 对象的OnChildNotify 函数。在该示例的情况下为 CMyListCtrl 。

在处理程序体中检查 LVN_ODCACHEHINT 消息,如果找到,则准备缓存。

下面的示例(摘自 OnChildNotify 函数体)执行此检查并调用 CMyListCtrl 类的 PrepCache 成员函数。

NMLVCACHEHINT* pcachehint="NULL";

 

if (message == WM_NOTIFY)

    {

        NMHDR* phdr = (NMHDR*)lParam;

 

        switch(phdr->code)

        {

        case LVN_ODCACHEHINT:

            pcachehint= (NMLVCACHEHINT*) phdr;

// Load the cache with the recommended range.

            PrepCache(pcachehint->iFrom, pcachehint->iTo);

            break;

        default:

            return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);

        }

        return FALSE;

    }

    else

        return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);

注意,如果消息类型不是 LVN_ODCACHEHINT ,则通知将传递给基类 (CListCtrl ) 。有关准备和维护缓存的更多信息,请参见 Platform SDK 中的“ 列表 - 视图控件” 主题的“ 缓存管理” 一节。

查找特定的项

当需要查找特定的列表控件项时,虚拟列表控件发送 LVN_ODFINDITEM 通知消息。列表视图 (ListView) 控件接收快捷键访问或接收LVM_FINDITEM 消息时发送该通知消息。搜索信息以 LVFINDINFO 结构的格式发送,该结构是NMLVFINDITEM 结构的成员。通过重写列表控件 (List Control) 对象的 OnChildNotify函数来处理该消息,并在处理程序体中检查 LVN_ODFINDITEM 消息。如果找到此消息,则执行相应的操作。

您应该准备好搜索与列表视图 (ListView) 控件给定的信息匹配的项。如果成功,则应返回项的索引;如果没有找到匹配项,则返回 -1 。

8. 销毁列表控件

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

如果嵌入 CListCtrl 对象作为视图或对话框类的数据成员,则当销毁其所有者时该对象也被销毁。如果使用 CListView ,则框架在销毁视图时销毁控件。

如果安排将一些列表数据存储在应用程序而不是列表控件 (List Control) 中,将需要安排对列表数据的解除分配。有关更多信息,请参见 Platform SDK 中的回调项和回调屏蔽。

另外,您要负责将您所创建的与此列表控件 (List Control) 对象关联的所有图像列表解除分配。

9. 列表控件( List Control )和列表视图

为方便起见, MFC 以两种方法封装列表控件 (List Control) 。可以按下列两种方式使用列表控件 (List Control) :

·                  通过在对话框类中嵌入 CListCtrl 对象来直接使用。

·                  通过使用类 CListView 来间接使用。

CListView 使得在 MFC 文档 / 视图结构中集成列表控件 (List Control) 变得容易,封装此控件与 CEditView 封装编辑控件 (Edit Control) 基本相同:控件填充 MFC 视图的整个表面区。(视图“ 是” 转换为CListView 的控件。)

CListView 对象从 CCtrlView 及其基类继承并添加一个检索基础列表控件 (List Control) 的成员函数。像视图一样使用视图成员处理视图。使用 GetListCtrl 成员函数获得对列表控件 (List Control) 的成员函数的访问权限。使用这些成员可以:

·                  添加、删除或操作列表中的“项”。

·                  设置或获取列表控件 (List Control) 属性。

若要获得对作为 CListView 基础的 CListCtrl 的引用,请从列表视图类调用 GetListCtrl

CListCtrl& ctlList = GetListCtrl();

该主题描述了使用列表控件 (List Control) 的两种方法。

10. 列表项和图象列表

列表控件 (List Control) (CListCtrl) 中的“ 项” 由图标、标签和可能的其他信息(在“ 子项” 中)组成。

列表控件项的图标包含在图像列表中。一个图像列表包含图标视图中使用的标准尺寸的图标。第二个可选图像列表包含控件的其他视图中所使用的相同图标的较小版本。第三个可选列表包含“ 状态” 图像(如复选框),用于在某些视图的小图标前面显示。第四个可选列表包含在列表控件 (List Control) 的单个标头项中显示的图像。

注意     如果列表视图 (ListView) 控件是用 LVS_SHAREIMAGELISTS样式创建的,则在图像列表不再使用时您要负责销毁这些图像列表。如果您将相同的图像列表分配给多个列表视图 (ListView) 控件,请指定该样式;否则,一个以上的控件可能会尝试销毁同一个图像列表。

有关列表项的更多信息,请参见 Platform SDK 中的列表视图图像列表和项和子项。另请参见“ MFC 参考” 中的 CImageList 类和该文章族中的使用 CImageList

若要创建列表控件 (List Control) ,需要在将新项插入到列表中时提供将要使用的图像列表。下面的示例将说明此过程,其中 m_pImagelist 是CImageList 类型的指针, m_listctrl 是一个 CListCtrl 数据成员。

// create, initialize, and hook up image list

m_pImageList = new CImageList();

ASSERT(m_pImageList != NULL);    // serious allocation failure checking

m_pImageList->Create(32, 32, TRUE,   4, 4);

m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST1));

m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST2));

m_listctrl.SetImageList(m_pImageList, LVSIL_NORMAL);

但是,如果不打算在列表视图或列表控件 (List Control) 中显示图标,则不需要图像列表。请参见 DAOVIEW 示例应用程序获取有关不带图标的列表视图的说明。

11. 回调项和回调屏蔽

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

对于列表视图 (ListView) 控件的每一项,列表视图 (ListView) 控件通常存储标签文本、项的图标的图像列表索引和用于项状态的一组位标志。可以将单个项定义为回调项,这在应用程序已经存储某个项的一些信息时很有用。

可以通过为 LV_ITEM 结构(请参见 CListCtrl::GetItem )的 pszTextiImage 成员指定适当值来将一个项定义为回调项。如果应用程序维护项或子项的文本,则为 pszText 成员指定LPSTR_TEXTCALLBACK 值。如果应用程序跟踪项的图标,则为 iImage 成员指定 I_IMAGECALLBACK 值。

除了定义回调项之外,还可以修改控件的回调屏蔽。该屏蔽是一组指定项状态的位标志,为这些项状态存储当前数据的是应用程序而不是控件。回调屏蔽适用于控件的所有项,这和回调项指定不同,后者适用于特定的项。默认情况下,回调屏蔽为 零,意思是控件跟踪所有项状态。若要更改此默认行为,请将屏蔽初始化为下列值的任意组合:

·                  LVIS_CUT     项被标记为进行剪贴操作。

·                  LVIS_DROPHILITED     项突出显示为拖放目标。

·                  LVIS_FOCUSED     项有焦点。

·                  LVIS_SELECTED     项被选定。

·                  LVIS_OVERLAYMASK     应用程序存储每一个项的当前覆盖图像的图像列表索引。

·                  LVIS_STATEIMAGEMASK     应用程序存储每一个项的当前状态图像的图像列表索引。

有关检索和设置该屏蔽的进一步信息,请参见 CListCtrl::GetCallbackMask 和 CListCtrl::SetCallbackMask 。

12. 创建列表控件

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

创建列表控件 (List Control) (CListCtrl) 的方式取决于是直接使用此控件还是代之以使用类 CListView 。如果使用CListView ,框架将视图构造成其文档 / 视图创建序列的一部分。创建列表视图也就创建了列表控件 (List Control) (二者相同)。控件在视图的 OnCreate 处理函数中创建。在这种情况下,通过调用 GetListCtrl 准备在控件中添加项。

在对话框中直接使用 CListCtrl

1.             在对话框编辑器中,向对话框模板资源添加“ List Control ”控件。指定其控件 ID 。

2.             使用 添加成员变量向导 添加带 Control 属性的 CListCtrl 类型的成员变量。可以使用该成员来调用 CListCtrl 成员函数。

3.             对于需要处理的任何列表控件 (List Control) 通知消息,使用“属性”窗口来映射对话框类中的处理函数,请参见将消息映射到函数

4.             在 OnInitDialog 中,设置 CListCtrl 的样式。请参见更改列表控件 (List Control) 样式 。虽然以后可以更改视图,但该操作可确定在控件中获得的“视图”类型。

在非对话框窗口中使用 CListCtrl

1.             在视图或窗口类中定义此控件。

2.                调用控件的 Create 成员函数,可能在 OnInitialUpdate 中,也可能与父窗口的 OnCreate 处理函数一样早(如果创建此控件的子类)。设置此控件的样式。

13. 创建图象列表

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

不论使用 CListView 还是使用 CListCtrl ,创建图像列表是一样的。

注意     只有在列表控件 (List Control) 包括 LVS_ICON样式时才需要图像列表。

使用 CImageList 类创建一个或多个图像列表(对于标准尺寸的图标、小图标和状态)。请参见 Platform SDK 中的 CImageList 以及列表视图图像列表。

为每一个图像列表调用 CListCtrl::SetImageList ;将指针传递给合适的 CImageList 对象。

 

14. 向控件添加列

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

注意     下列过程适用于 CListView 或 CListCtrl 对象。

列表控件 (List Control) 在报表视图中时显示列,提供一种组织每一列表控件项的各种子项的方法。这种组织是通过列表控件 (List Control) 中的列和列表控件项的相关子项之间的一一对应来实现的。有关子项的更多信息,请参见向控件添加项 。 Windows 95 和 Windows 98 资源管理器中的“ 详细信息” 视图提供了报表视图中列表控件 (List Control) 的示例。第一列列出文件夹、文件图标和标签。其他列列出文件大小、文件类型、上次修改日期等。

虽然可以在任何时间向列表控件 (List Control) 添加列,但只有控件的 LVS_REPORT 样式位打开时列才可见。

每一列有一个关联的标头项(请参见 CHeaderCtrl )对象,该对象标记列并允许用户调整列的大小。有关代码示例的信息,请参见 DAOVIEW 示例应用程序。

如果列表控件 (List Control) 支持报表视图,则需要为列表控件项中每一个可能的子项添加一列。要添加列,先准备 LV_COLUMN 结构,然后调用 InsertColumn 。添加必要的列(有时称标头项)后,可以使用属于嵌入式标头控件的成员函数和样式来对它们重新排序。有关更多信息,请参见排序标头控件中的项

注意     如果用 LVS_NOCOLUMNHEADER 样式创建列表控件 (List Control) ,则将忽略任何插入列的尝试。

 

15. 向控件添加项

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

若要向列表控件 (List Control) (CListCtrl) 添加项,请根据您所拥有的信息调用 InsertItem 成员函数的几种版本中的一种。一种版本采用您准备的 LV_ITEM 结构。因为LV_ITEM 结构包含大量成员,因此您对列表控件项的属性具有更强大的控制能力。

LV_ITEM 结构的两个重要成员(相对于报表视图)是 iItem iSubItem 成员。 iItem 成员是该结构正在引用的项的从零开始的索引, iSubItem 成员是子项的从一开始的索引(如果该结构包含有关某项的信息则从零开始)。用这两个成员确定每项的子项信息的类型和值,此信息在列表控件 (List Control) 位于报表视图中时显示。有关更多信息,请参见 CListCtrl::SetItem 。

其他成员指定项的文本、图标、状态和项数据。“ 项数据” 是与列表视图项关联的应用程序定义值。有关 LV_ITEM 结构的更多信息,请参见 CListCtrl::GetItem 。

其他版本的 InsertItem 采用一个或多个与 LV_ITEM 结构中的成员相对应的独立值,使您得以只初始化想要支持的成员。通常情况下,列表控件 (List Control) 管理列表项的存储,但使用“ 回调项” 可以将一些信息存储在应用程序中。有关更多信息,请参见本主题中的回调项和回调屏蔽 和 Platform SDK 中的回调项和回调屏蔽。

有关更多信息,请参见项和子项

16. 向 List Control 添加列利用 Cstring 的例子

//

       // create Columns ...

       //

       for( i="0" ; i

       {

              // create columns

              str.Format(IDS_COLUMN, i+1);

              colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);

              nCol++;

 

       }

关于str.Format:

例: CString str = "Some Data";

str.Format("%s%d", str, 123);   // Attention: str is also used in the parameter list.

IDS_COLUMN :字符串ID ,内容为Column %d

 

17. CListCtrl::SetItemText

BOOL SetItemText( int nItem , intnSubItem , LPTSTR lpszText );

Return Value

Nonzero if successful; otherwise zero.

Parameters

nItem

Index of the item whose text is to be set.

nSubItem

Index of the subitem, or zero to set the item label.

lpszText

Pointer to a string that contains the new item text.

Remarks

Changes the text of a list view item or subitem.

 

18. CListCtrl::InsertItem

int InsertItem( const LVITEM* pItem );

int InsertItem( int nItem , LPCTSTRlpszItem );

int InsertItem( int nItem , LPCTSTRlpszItem , int nImage );

int InsertItem( UINT nMask , intnItem , LPCTSTR lpszItem , UINTnState , UINT nStateMask , intnImage , LPARAM lParam );

Return Value

The index of the new item if successful or -1 otherwise.

Parameters

pItem

Pointer to an LVITEM structure that specifies the item’s attributes, as described in thePlatform SDK .

nItem

Index of the item to be inserted.

lpszItem

 Address of a string containing the item’s label, or LPSTR_TEXTCALLBACKif the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask .

nImage

Index of the item’s image, or I_IMAGECALLBACK if the item is a callback item. For information on callback items, seeCListCtrl::GetCallbackMask .

nMask

The nMask parameter specifies which item attributes passed as parameters are valid. It can be one or more of themask values described in LVITEM structure in the Platform SDK . The valid values can be combined with the bitwiseOR operator.

nState

Indicates the item's state, state image, and overlay image. See thePlatform SDK topics LVITEM for more information and List View Item States for a list of valid flags.

nStateMask

Indicates which bits of the state member will be retrieved or modified. SeeLVITEM in the Platform SDK for more information.

nImage

Index of the item’s image within the image list.

lParam

A 32-bit application-specific value associated with the item. If this parameter is specified, you must set thenMask attribute LVIF_PARAM .

Remarks

Inserts an item into the list view control.

 

19. 引用 &

程序参考:E:/ 唐进/ 工作/ 项目/VC2005 项目/testing/MFC/0328MauCtni/ 资源例程/ ××Print ListCtrl on multiple pages/listPrint_demo/listPrintView.cpp(111): CListCtrl &refCtrl = GetListCtrl();

 

void CListPrintView::OnFill()

{

       CWaitCursor wait;

       CListCtrl       &refCtrl = GetListCtrl();// 此处为引用

       int                  i,

                            j,

                            nCol=0,

                            colId,

                            iActualItem;

       CString          str;

 

       if( m_bFilled )

       {

              AfxMessageBox(IDS_STUPID);

              return;

       }

对于

CListView::GetListCtrl

CListCtrl& GetListCtrl( ) const;

Return Value

A reference to the list control associated with the view.

Remarks

Call this member function to get a reference to the list control associated with the view.

经典例子:

void CListPrintView::OnFill()

{

       CWaitCursor wait;

       CListCtrl       &refCtrl = GetListCtrl();// 此处犹为重要

       int                  i,

                            j,

                            nCol=0,

                            colId,

                            iActualItem;

       CString          str;

 

       if( m_bFilled )

       {

              AfxMessageBox(IDS_STUPID);

              return;

       }

 

       m_bFilled      = TRUE;

 

       // speed up !

       SetRedraw(FALSE);

 

       //

       // create Columns ...

       //

       for( i="0" ; i

       {

              // create columns

              str.Format(IDS_COLUMN, i+1);

              colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);

              nCol++;

 

       }

       m_ColSortOrder.SetSize(nCol);

 

       // ... and fill in text

       for( j="0"; j

       {

              str.Format(IDS_CELL, i+1, j+1);

              iActualItem = refCtrl.InsertItem(j, str);

             

              for( i="0" ; i

              {

                     str.Format(IDS_CELL, i+1, j+1);

                     refCtrl.SetItemText(iActualItem, i, str);

              }

       }

 

 

       DWORD dwStyle = refCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);

       dwStyle |= LVS_EX_HEADERDRAGDROP| LVS_EX_GRIDLINES;

       dwStyle |= LVS_EX_FULLROWSELECT;

 

       refCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwStyle);

 

       SetRedraw(TRUE);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值