2007年5月26日土曜日

附:树视图控件的状态标志

TVIS_BOLD 项标签文本(ItemText)是粗体

TVIS_CUT 所选择的项作为粘贴复制操作

TVIS_DROPHILITED 所选择的项作为拖拽标志

TVIS_EXPANDED 子项列表当前是展开的。也就是子项是可见的。此值仅用于父项。

TVIS_EXPANDEDONCE子项列表已经至少展开了一次。如果父项有此状态,并对TV_EXPAND消息作出了响应,就不会为该父项产生 TVN_ITEMEXPANDING和TVN_ITEMEXPANDED 通知消息。把 TVE_COLLAPSE 和 TVE_COLLAPSERESET同 TVM_EXPAND一起使用就会使此状态重置。此值仅用于父项。

TVIS_EXPANDPARTIAL 部分展开树视图项。在此状态中,只是部分并不是全部的子项是可见的,而且会显示父项的加号。

TVIS_SELECTED 此项被选中了。项的外观取决于是否有焦点。会使用系统颜色画出所选择的项。

要设置或获取项的覆盖图像索引或者状态图像索引,必须在stateMask成员中指定以下标志:(这些值也可以用于去掉不感兴趣的状态位)

TVIS_OVERLAYMASK 用来指定项覆盖图像索引的位掩码。

TVIS_STATEIMAGEMASK 用来指定项状态图像的位掩码。

TVIS_USERMASK 同TVIS_STATEIMAGEMASK相同。



stateMask

表示state成员的有效位。如果要获取项状态,则在stateMask成员中设置相应位来指示state成员所返回的值;如果想要设置项状态,则在stateMask成员中设置相应位来指示想在sate成员中设置的位。如果要设置或获取项覆盖图像索引,则设置TVIS_OVERLAYMASK位;如果要设置或获取项状态索引,则设置TVIS_STATEIMAGEMASK位。



pszText

以NULL结尾的字符串地址,如果TVITEM结构要求项属性,那么它代表项标签文本(Item Text)。如果此成员的值是LPSTR_TEXTCALLBACK,那么父窗口负责存储项标签文本的名称。此种情况下,当树控件需要显示项标签、对项标签排序、编辑项标签或者当项标签改变时需要发送TVN_SETDISPINFO通知消息时,它会给父窗口发送TVN_GETDISPINFO通知消息。

如果TVITEM正在接收项属性时,此成员表示接收到的项标签文本的缓冲区地址。



cchTextMax

由pszText指向的缓冲区地址的字节大小。如果用TVITEM设置项属性,此成员被忽略。

说明:通常在向树控件添加项时指定项标签文本。InsertItem 成员函数能传递 TVITEM 结构。该结构定义了项的属性,项属性中有一个包含标签文本的字符串。树控件分配存储各项的内存,其中大部分内存都被项标签文本占用。如果应用程序保存了树控件中字符串的副本,就可以减少控件所需的内存空间,方法是在 TV_ITEM 的 pszText 成员中或者在 lpszItem 参数中指定 LPSTR_TEXTCALLBACK 值,而不是将实际字符串传递给树控件。每当需要重绘某项时,LPSTR_TEXTCALLBACK 使树控件从应用程序中检索该项的标签文本。为了检索标签文本,树控件发送 TVN_GETDISPINFO 通知消息,该消息包括 NMTVDISPINFO 结构的地址。必须通过设置所含结构的适当成员来响应该通知消息。

树控件使用从创建树控件的进程堆分配的内存。树控件最多可以包含的项数取决于堆中可用的内存量。每个项占用 64 字节。

iImage

当树控件的项结点是非选中状态时所使用的图标在图像列表中的索引值。如果此成员的值是I_IMAGECALLBACK,则父窗口负责存储该索引值。在此情况下,当树控件需要显示项图像时它向父窗口发送TVN_GETDISPINFO通知消息来获得索引值。



iSelectedImage

当树控件的项结点是选中状态时所使用的图标在图像列表中的索引值。如果此成员的值是I_IMAGECALLBACK,则父窗口负责存储该索引值。在此情况下,当树控件需要显示项图像时它向父窗口发送VN_GETDISPINFO通知消息来获得索引值。



cChildren

表示树控件项是否有相关的子结点的标志位。此成员可以是以下值之一:

0 —— 表示此项没有子结点。

1 —— 表示此此项有一个或多个子结点。

I_CHILDRENCALLBACK —— 父窗口会始终跟踪确定此项是否有子结点。此时,如果树控件需要显示项时,它会给父窗口发送TVN_GETDISPINFO通知消息,决定此项是否有子结点。如果树控件含有TVS_HASBUTTONS风格,则它使用此成员来决定是否显示按钮以表明存在子结点。也可以使用此成员来强制树控件显示按钮,尽管没有在此项之下插入任何子结点。这样可以最小化由于在此项之下插入了子结点所占用的控件内存。



lParam

同控件相关的32位值。





下面这段代码显示了如何用此结构插入树控件项,同时也演示了如何为项插入图像。

HICON hIcon[8];

int n;

m_imageList.Create(16, 16, 0, 8, 8); // 32, 32 for large icons

hIcon[0] = AfxGetApp()->LoadIcon(IDI_WHITE);

hIcon[1] = AfxGetApp()->LoadIcon(IDI_BLACK);

hIcon[2] = AfxGetApp()->LoadIcon(IDI_RED);

hIcon[3] = AfxGetApp()->LoadIcon(IDI_BLUE);

hIcon[4] = AfxGetApp()->LoadIcon(IDI_YELLOW);

hIcon[5] = AfxGetApp()->LoadIcon(IDI_CYAN);

hIcon[6] = AfxGetApp()->LoadIcon(IDI_PURPLE);

hIcon[7] = AfxGetApp()->LoadIcon(IDI_GREEN);

for (n = 0; n < 8; n++) {

m_imageList.Add(hIcon[n]);

}

CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(IDC_TREEVIEW1);

pTree->SetImageList(&m_imageList, TVSIL_NORMAL);

TV_INSERTSTRUCT tvinsert;

tvinsert.hParent = NULL;

tvinsert.hInsertAfter = TVI_LAST;

tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE |

TVIF_TEXT;// | TVIF_STATE;

tvinsert.item.hItem = NULL;

tvinsert.item.state = 0;

//tvinsert.item.state = TVIS_EXPANDED;

tvinsert.item.stateMask = 0;

//tvinsert.item.stateMask = TVIS_OVERLAYMASK;

tvinsert.item.cchTextMax = 6;

tvinsert.item.iSelectedImage = 1;

tvinsert.item.cChildren = 0;

tvinsert.item.lParam = 0;

// top level

tvinsert.item.pszText = "Parent1";

tvinsert.item.iImage = 2;

HTREEITEM hDad = pTree->InsertItem(&tvinsert);

tvinsert.item.pszText = "Parent2";

HTREEITEM hMom = pTree->InsertItem(&tvinsert);

// second level

tvinsert.hParent = hDad;

tvinsert.item.pszText = "Children1-1";

tvinsert.item.iImage = 3;

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText = "Children1-2";



pTree->InsertItem(&tvinsert);

// second level

tvinsert.hParent = hMom;

tvinsert.item.pszText = "Children2-1";

tvinsert.item.iImage = 4;

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText = "Children2-2";

pTree->InsertItem(&tvinsert);

tvinser.item.pszText = "Children2-3";

HTREEITEM hOther = pTree->InsertItem(&tvinsert);

// third level

tvinsert.hParent = hOther;

tvinsert.item.pszText = "Children2-3-1";

tvinsert.item.iImage = 7;

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText = "Children2-3-2";

pTree->InsertItem(&tvinsert);

―――――――――――――――――――――――――――――――――――

即:

+Parent1

--Children1-1

--Children1-2

+Parent2

--Children2-1

--Children2-2

+Children2-3

--Children2-3-1

--Children2-3-2

0 件のコメント: