通过向控件发送TVM_INSERTITEM消息,将项目添加到树视图控件。该消息包括指向TV_INSERTSTRUCT结构的指针,指定父项,插入新项后的项以及定义项的属性的TV_ITEM结构。属性包括项目的标签,其选定的和未选择的图像以及32位应用程序定义的值。
本节中的示例基于文本文件中的信息创建内容表。该示例包括两个功能。第一个函数在文件中搜索标题。当它找到一个,它提取标题的文本和指示标题的级别的值,然后将它们传递到第二个函数。标题假定为以下形式:[【heading】].【n】,其中【标题】是标题的文本,【n】表示标题级别。该示例忽略大于第四级的标题级别。
第二个功能将一个项目添加到树视图控件,使用标题文本作为项目的标签和标题级别来确定新项目的父项目。将一级标题添加到树视图控件的根目录中,将二级标题作为上一级别的子项添加,依此类推。该函数根据是否有任何子项目将图像分配给项目。如果一个项目有子项目,它将获取一个表示封闭文件夹的图像。否则,它会获取表示文档的图像。一个项目对于选定状态和非选择状态都使用相同的图像。
// InitTreeViewItems - 从指定的文件中提取标题
//将它们传递给将其添加到树视图控件的函数。
//如果成功返回TRUE,否则返回FALSE。
// hwndTV - 树视图控件的句柄
// lpszFileName - 与标题的文件名
BOOL InitTreeViewItems(HWND hwndTV, LPSTR lpszFileName)
{
HANDLE hf; //文件的句柄
DWORD cbRead; //读取的字节数
char szItemText[128]; //标签树视图项目的文本
int nLevel; //标题级别
LPCH pch; //指向从文件读取的数据的指针
LPCH pchTmp; //临时指针
DWORD i, j; //计数器
//打开要解析的文件。
if ((hf = CreateFile(lpszFileName, GENERIC_READ,
FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL)) == (HANDLE) INVALID_HANDLE_VALUE)
return FALSE;
//解析文件寻找标题。
pch = (LPCH) LocalAlloc(LPTR, sizeof(char) * 2048);
pchTmp = pch;
do {
//读取一个文件块。
ReadFile(hf,pchTmp,sizeof(char)* 2048,& cbRead,
(LPOVERLAPPED) NULL);
//解析块寻找“[".
for (i = 0, j = 0; i < cbRead; i++) {
if ((i + 2) > cbRead) // break if end of chunk
break;
// Extract the heading text from between the brackets.
if ((*pchTmp == '.') && (*(pchTmp+1) == '[')) {
pchTmp = pchTmp + 2;
i += 2;
while (*pchTmp != ']'& &((i ++)< = cbRead))
szItemText[j++] = *pchTmp++;
szItemText[j] = '\0';
j = 0;
nLevel = atoi(pchTmp + 2);
//将项目添加到树视图控件。
AddItemToTree(hwndTV, (LPSTR) &szItemText, nLevel);
}其他
++pchTmp;
}
pchTmp = pch;
} while (cbRead != 0);
CloseHandle((HANDLE) hf);
return TRUE;
}
// AddItemToTree - 将项目添加到树视图控件。
//返回新增项目的句柄。
// hwndTV - 树视图控件的句柄
// lpszItem - 要添加的项目的文本
// nLevel - 要添加项目的级别
HTREEITEM AddItemToTree(HWND hwndTV,LPSTR lpszItem,int nLevel)
{
TV_ITEM tvi;
TV_INSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM) TVI_FIRST;
static HTREEITEM hPrevRootItem = NULL;
static HTREEITEM hPrevLev2Item = NULL;
HTREEITEM hti;
tvi.mask = TVIF_TEXT | TVIF_IMAGE
| TVIF_SELECTEDIMAGE | TVIF_PARAM;
//设置项目的文本。
tvi.pszText = lpszItem;
tvi.cchTextMax = lstrlen(lpszItem);
//假设项目不是父项目,所以给它一个
//文档图像。
tvi.iImage = g_nDocument;
tvi.iSelectedImage = g_nDocument;
//将标题级别保存在项目的应用程序定义中
//数据区。
tvi.lParam = (LPARAM) nLevel;
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
//根据指定的级别设置父项。
if (nLevel == 1)
tvins.hParent = TVI_ROOT;
else if (nLevel == 2)
tvins.hParent = hPrevRootItem;
其他
tvins.hParent = hPrevLev2Item;
//将项目添加到树视图控件。
hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0,
(LPARAM) (LPTV_INSERTSTRUCT) &tvins);
//保存项目的句柄。
if (nLevel == 1)
hPrevRootItem = hPrev;
else if (nLevel == 2)
hPrevLev2Item = hPrev;
//新项目是一个子项目。给父项a
//关闭文件夹位图以指示它现在有子项目。
if(nLevel > 1){
hti = TreeView_GetParent(hwndTV, hPrev);
tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = hti;
tvi.iImage = g_nClosed;
tvi.iSelectedImage = g_nClosed;
TreeView_SetItem(hwndTV, &tvi);
}
return hPrev;
}