添加树状视图项

【勇芳软件工作室】汉化HomePreviousNext

通过向控件发送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;

}