|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Adding Tree-View Items
You add an item to a tree-view control by sending the TVM_INSERTITEM message to the control. The message includes a pointer to a TV_INSERTSTRUCT structure, specifying the parent item, the item after which the new item is inserted, and a TV_ITEM structure that defines the attributes of the item. The attributes include the item's label, its selected and nonselected images, and a 32-bit application-defined value.
The example in this section creates a table of contents based on the information in a text file. The example includes two functions. The first function searches a file for headings. When it finds one, it extracts the text of the heading and the value that indicates the level of the heading and then passes them to the second function. Headings are assumed to be in the following form, .[heading].n, where heading is the text of the heading and n indicates the heading level. The example ignores heading levels greater than level four.
The second function adds an item to a tree-view control, using the heading text as the item's label and the heading level to determine the parent item for the new item. A level one heading is added to the root of the tree-view control, a level two heading is added as a child item of the previous level one item, and so on. The function assigns an image to an item based on whether it has any child items. If an item has child items, it gets an image representing a closed folder. Otherwise, it gets an image representing a document. An item uses the same image for both the selected and nonselected states.
// InitTreeViewItems - extracts headings from the specified file and // passes them to a function that adds them to a tree-view control. // Returns TRUE if successful or FALSE otherwise. // hwndTV - handle of the tree-view control // lpszFileName - name of file with headings BOOL InitTreeViewItems(HWND hwndTV, LPSTR lpszFileName) { HANDLE hf; // handle of file DWORD cbRead; // number of bytes read char szItemText[128]; // label text of tree-view item
int nLevel; // heading level LPCH pch; // pointer to data read from file LPCH pchTmp; // temporary pointer DWORD i, j; // counters // Open the file to parse. 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;
// Parse the file looking for headings. pch = (LPCH) LocalAlloc(LPTR, sizeof(char) * 2048); pchTmp = pch; do { // Read a chunk of the file. ReadFile(hf, pchTmp, sizeof(char) * 2048, &cbRead, (LPOVERLAPPED) NULL); // Parse the chunk looking for ".[". 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); // Add the item to the tree-view control. AddItemToTree(hwndTV, (LPSTR) &szItemText, nLevel);
} else ++pchTmp; } pchTmp = pch; } while (cbRead != 0); CloseHandle((HANDLE) hf); return TRUE; } // AddItemToTree - adds items to a tree-view control. // Returns the handle of the newly added item. // hwndTV - handle of the tree-view control // lpszItem - text of the item to add // nLevel - level at which to add the item 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; // Set the text of the item. tvi.pszText = lpszItem; tvi.cchTextMax = lstrlen(lpszItem); // Assume the item is not a parent item, so give it a
// document image. tvi.iImage = g_nDocument; tvi.iSelectedImage = g_nDocument; // Save the heading level in the item's application-defined // data area. tvi.lParam = (LPARAM) nLevel; tvins.item = tvi; tvins.hInsertAfter = hPrev; // Set the parent item based on the specified level. if (nLevel == 1) tvins.hParent = TVI_ROOT; else if (nLevel == 2) tvins.hParent = hPrevRootItem; else
tvins.hParent = hPrevLev2Item; // Add the item to the tree-view control. hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0, (LPARAM) (LPTV_INSERTSTRUCT) &tvins); // Save the handle of the item. if (nLevel == 1) hPrevRootItem = hPrev; else if (nLevel == 2) hPrevLev2Item = hPrev; // The new item is a child item. Give the parent item a // closed folder bitmap to indicate it now has child items.
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; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Дополнение Пунктов Tree-View
Вы добавляете пункт к дереву-виду управления посылая сообщение TVM_INSERTITEM на управление. Сообщение включает указателю в структуру TV_INSERTSTRUCT, определение родительского пункта, пункт после которых новый пункт включен, и структура TV_ITEM, которая определяет атрибуты пункта. Атрибуты включают этикетку пункта, выбранных и nonselected образов, и 32- бит определял прикладную величину.
Пример в этой секции создает оглавление находящееся в информации в текстовом файле. Пример включает две функции. Первая функция ищет файл для заголовков. Когда это находит один, это извлекает текст заголовка и величина, которая указывает уровень заголовка затем передает им во вторую функцию. Заголовки приняты, чтобы быть в следующем формы, .[heading].n, где заголовок является текстом заголовка и n указывает заголовок уровня. Пример игнорирует заголовок уровней больше, чем уровень четыре.
Вторая функция добавляет пункту к дереву-виду управления, использования заголовка текста как этикетка пункта и заголовок уровня, чтобы определять родительский пункт для нового пункта. Уровень один заголовок добавлен к корню дерева-вида управления, уровень два заголовка добавлен как пункт ребенка предшествующего уровня один пункт, и так далее. Функция назначает образ в пункт основанный на независимо у него есть любые пункты ребенка. Если пункт имеет пункты ребенка, он получает образ, представляющий закрытую папку. В противном случае, это получает образ, представляющий документ. Пункт использует тот же образ как для выбранного так и nonselected состояний.
// InitTreeViewItems - ЗАГОЛОВКИ экстратов из определенного файла и // передает им в функцию, которая добавляет им к дереву-виду управления. // ИСТИНА Возврата если успешный или ЛОЖНЫЙ в противном случае. // hwndTV - РУЧКА дерева-вида управления // lpszFileName - имя файла с заголовками BOOL InitTreeViewItems(HWND hwndTV, LPSTR lpszFileName) { РУЧКА вч; // ручка файла DWORD cbRead; // количество байтов было прочитано символ szItemText[128]; // текст этикетки дерева-вида пункта
int nLevel; // заголовок уровня LPCH pch; // указатель в данные был прочитан из файла LPCH pchTmp; // временный указатель DWORD я, j; // счетчики // Открытый файл, чтобы выполняться грамматический разбор. если ((вч = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) НЕДЕЙСТВИТЕЛЬНЫЙ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (РУЧКА) НЕДЕЙСТВИТЕЛЬНАЯ)) == (РУЧКА) INVALID_HANDLE_VALUE) обратная ЛОЖЬ;
// Грамматический разбор файл, ищущий заголовки. pch = (LPCH) LocalAlloc(LPTR, sizeof(символ) * 2048); pchTmp = pch; сделайте { // Прочитанный кусок файла. ReadFile(ВЧ, pchTmp, sizeof(символ) * 2048, &cbRead, (LPOVERLAPPED) НЕДЕЙСТВИТЕЛЬНЫЙ); // Грамматический разбор кусок, ищущий ".[". для (i = 0, j = 0; я < cbRead; я++) { если ((я + 2) > cbRead) // прерывание если конец прерывания куска; // Извлеките возглавляющий текст из между скобками.
если ((*pchTmp == '.') && (*(pchTmp+1) == '[')) { pchTmp = pchTmp + 2; я += 2; пока (*pchTmp != ']' && ((я++) <= cbRead) ) szItemText[j++] = *pchTmp++; szItemText[j] = '\0; j = 0; nLevel = atoi(pchTmp + 2); // Добавьте пункт к дереву-виду управления. AddItemToTree(hwndTV, (LPSTR) &szItemText, nLevel);
} еще ++pchTmp; } pchTmp = pch; } пока (cbRead != 0); CloseHandle((РУЧКА) вч); возвращайтесь ВЕРНО; } // AddItemToTree - ДОБАВЛЯЕТ пункты к дереву-виду управления. // Возврат ручка вновь дополнительного пункта. // hwndTV - РУЧКА дерева-вида управления // lpszItem - текст пункта, чтобы добавлять // nLevel - нацеливать на который, чтобы добавлять пункт HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel)
{ tvi TV_ITEM; tvins TV_INSERTSTRUCT; статический HTREEITEM hPrev = (HTREEITEM) TVI_FIRST; статический HTREEITEM hPrevRootItem = НЕДЕЙСТВИТЕЛЬНЫЙ; статический HTREEITEM hPrevLev2Item = НЕДЕЙСТВИТЕЛЬНЫЙ; hti HTREEITEM; tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; // Установленный текст пункта. tvi.pszText = lpszItem; tvi.cchTextMax = lstrlen(lpszItem); // Примите что пункт не является родительским пунктом, так что давать это a
// образ документа. tvi.iImage = g_nDocument; tvi.iSelectedImage = g_nDocument; // Сохранять заголовок уровня в определенном приложении / пункте/ области данных. tvi.lParam = (LPARAM) nLevel; tvi tvins.item =; tvins.hInsertAfter = hPrev; // Установленный родительский пункт основывался на определенном уровне. если (nLevel == 1) tvins.hParent = TVI_ROOT; еще если (nLevel == 2) tvins.hParent = hPrevRootItem; еще
tvins.hParent = hPrevLev2Item; // Добавьте пункт к дереву-виду управления. hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0, (LPARAM) (LPTV_INSERTSTRUCT) &tvins); // Сохраняемый ручка пункта. если (nLevel == 1) hPrevRootItem = hPrev; еще если (nLevel == 2) hPrevLev2Item = hPrev; // Новый пункт является пунктом ребенка. Дайте родительскому пункту // закрытое побитовое отображение папки, чтобы указывать этому теперь имеет пункты ребенка.
если (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); } возвращайте hPrev; }
|
|
|
|
| |