Пара вопросов по TreeView
|
|
WQ | Дата: Вторник, 19.08.2014, 16:29 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Допустим, вот пример создания TreeView через Winapi
Два вопроса: 1)Как сделать, чтобы два имеющихся родительских пункта были выделены жирным шрифтом? 2)Как сделать, чтобы все элементы TreeView, имеющие дочерние элементы, сразу после создания были раскрыты (expand)?
Код #Include "windows.bi" #Include "win/commctrl.bi" #Include "win/shellapi.bi"
Dim msg As MSG Dim As WNDCLASSEX wc Dim As String NameClass="MyClass" Dim As HINSTANCE Hinst=GetModuleHandle(0) Dim Shared As ZString*15 szArray(6) = {_ "First_Root",_ "One",_ "Two",_ "Three",_ "Four",_ "Five",_ "Second_Root" _ }
Function wndproc(hwnd As HWND, msg As UInteger,_ wparam As WPARAM, lparam As LPARAM) As Integer Static As HWND hTree Select Case msg Case WM_CREATE
' создаем контрол hTree = CreateWindowEx( 0, "SysTreeView32", 0,_ WS_CHILD+WS_VISIBLE+TVS_HASBUTTONS+_ TVS_LINESATROOT+WS_BORDER+TVS_HASLINES,_ 10, 10, 200, 200, hwnd, Cast(HMENU,1), 0, 0)
' узнаем путь к системной папке Dim szPath As String*512 GetSystemDirectory(Cast(LPSTR,@szPath),Len(szPath))
' извлекаем иконки из DLL файла Dim As HICON icon1,icon2 icon1 = ExtractIcon(0,szPath & "\Shell32.DLL",3) icon2 = ExtractIcon(0,szPath & "\Shell32.DLL",45)
' создаем список изображений Dim As HIMAGELIST ImageList = ImageList_Create(_ 16,16,ILC_COLOR32 Or ILC_MASK,1,1)
' делаем цвет фона иконок в списке прозрачным ImageList_SetBkColor(ImageList,_ TreeView_GetBkColor(hTree) Xor &hff000000)
' добавляем иконки в список изображений Dim As Integer iNoSelect = ImageList_AddIcon(ImageList,icon1) Dim As Integer iSelect = ImageList_AddIcon(ImageList,icon2)
' подключаем список изображений к контролу TreeView SendMessage(hTree,TVM_SETIMAGELIST,TVSIL_NORMAL,Cast(LPARAM,ImageList))
'------------------заполняем контрол пунктами----------------- Dim tvis As TVINSERTSTRUCT Dim htr(11) As HTREEITEM
' Создаем корневые пункты For i As Integer = 0 To 1 tvis.Item.Mask = TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE tvis.item.pszText = StrPtr(szArray(i*6)) tvis.item.cchTextMax = Len(szArray(i*6)) tvis.hParent = Cast(HTREEITEM,TVI_ROOT) htr(i) = TreeView_InsertItem(hTree, @tvis ) 'Создаем подпункты For j As Integer = 1 To 5 tvis.Item.Mask = TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE tvis.item.pszText = StrPtr(szArray(j)) tvis.item.cchTextMax = Len(szArray(j)) tvis.item.iImage = iNoSelect tvis.item.iSelectedImage = iSelect tvis.hInsertAfter = Cast(HTREEITEM,j) tvis.hParent = Cast(HTREEITEM,htr(i)) htr(j+i*5+1) = TreeView_InsertItem(hTree, @tvis ) Next Next
Case WM_NOTIFY ' получаем текст из пункта TreeView Dim As NMHDR Ptr nmhdr = Cast(NMHDR Ptr,lParam) If nmhdr->code = TVN_SELCHANGED Then Dim As NMTREEVIEW Ptr NMTW = Cast(NMTREEVIEW Ptr,LPARAM) Dim TV_ITEM As TVITEM Dim As String*256 szBuf TV_ITEM.pszText = Cast(LPSTR,@szBuf) TV_ITEM.cchTextMax = 20 TV_ITEM.mask = TVIF_TEXT TV_ITEM.hItem = NMTW->itemNew.hItem SendMessage(hTree,TVM_GETITEM,0,Cast(LPARAM,@TV_ITEM)) MessageBox(0,szBuf,"",0) EndIf
Case WM_DESTROY PostQuitMessage(0) End Select Return DefWindowProc(hwnd,msg,wparam,lparam) End Function
With wc .cbSize=SizeOf(WNDCLASSEX) .style=CS_HREDRAW Or CS_VREDRAW .lpfnWndProc=@wndproc .hInstance=Hinst .hIcon=LoadIcon(0,IDI_WINLOGO) .hCursor=LoadCursor(0,IDC_ARROW) .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME) .lpszClassName=StrPtr(NameClass) .hIconSm=.hIcon End With
If RegisterClassEx(@wc)=0 Then Print "Register error, press any key" Sleep End EndIf
CreateWindowEx(0,NameClass,"TreeView",_ WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,235,255,0,0,Hinst,0)
While GetMessage(@msg,0,0,0) TranslateMessage(@msg) DispatchMessage(@msg) Wend
Сообщение отредактировал WQ - Вторник, 19.08.2014, 16:29 |
|
| |
haav | Дата: Вторник, 19.08.2014, 20:26 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Код #Include "windows.bi" #Include "win/commctrl.bi" #Include "win/shellapi.bi"
Dim msg As MSG Dim As WNDCLASSEX wc Dim As String NameClass="MyClass" Dim As HINSTANCE Hinst=GetModuleHandle(0) Dim Shared As ZString*15 szArray(6) = {_ "First_Root",_ "One",_ "Two",_ "Three",_ "Four",_ "Five",_ "Second_Root" _ }
Function wndproc(hwnd As HWND, msg As UInteger,_ wparam As WPARAM, lparam As LPARAM) As Integer Static As HWND hTree Select Case msg Case WM_CREATE
' создаем контрол hTree = CreateWindowEx( 0, "SysTreeView32", 0,_ WS_CHILD+WS_VISIBLE+TVS_HASBUTTONS+_ TVS_LINESATROOT+WS_BORDER+TVS_HASLINES,_ 10, 10, 200, 200, hwnd, Cast(HMENU,1), 0, 0)
' узнаем путь к системной папке Dim szPath As String*512 GetSystemDirectory(Cast(LPSTR,@szPath),Len(szPath))
' извлекаем иконки из DLL файла Dim As HICON icon1,icon2 icon1 = ExtractIcon(0,szPath & "\Shell32.DLL",3) icon2 = ExtractIcon(0,szPath & "\Shell32.DLL",45)
' создаем список изображений Dim As HIMAGELIST ImageList = ImageList_Create(_ 16,16,ILC_COLOR32 Or ILC_MASK,1,1)
' делаем цвет фона иконок в списке прозрачным ImageList_SetBkColor(ImageList,_ TreeView_GetBkColor(hTree) Xor &hff000000)
' добавляем иконки в список изображений Dim As Integer iNoSelect = ImageList_AddIcon(ImageList,icon1) Dim As Integer iSelect = ImageList_AddIcon(ImageList,icon2)
' подключаем список изображений к контролу TreeView SendMessage(hTree,TVM_SETIMAGELIST,TVSIL_NORMAL,Cast(LPARAM,ImageList))
'------------------заполняем контрол пунктами----------------- Dim tvis As TVINSERTSTRUCT Dim htr(11) As HTREEITEM
' Создаем корневые пункты For i As Integer = 0 To 1 tvis.Item.Mask = TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE+TVIF_STATE tvis.item.pszText = StrPtr(szArray(i*6)) tvis.item.cchTextMax = Len(szArray(i*6)) tvis.hParent = Cast(HTREEITEM,TVI_ROOT) tvis.Item.state = TVIS_BOLD tvis.Item.stateMask = TVIS_BOLD htr(i) = TreeView_InsertItem(hTree, @tvis ) 'Создаем подпункты For j As Integer = 1 To 5 tvis.Item.Mask = TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE tvis.item.pszText = StrPtr(szArray(j)) tvis.item.cchTextMax = Len(szArray(j)) tvis.item.iImage = iNoSelect tvis.item.iSelectedImage = iSelect tvis.hInsertAfter = Cast(HTREEITEM,j) tvis.hParent = Cast(HTREEITEM,htr(i)) htr(j+i*5+1) = TreeView_InsertItem(hTree, @tvis ) Next Next SendMessage(hTree,TVM_EXPAND,TVE_EXPAND,htr(0)) SendMessage(hTree,TVM_EXPAND,TVE_EXPAND,htr(1))
Case WM_NOTIFY ' получаем текст из пункта TreeView Dim As NMHDR Ptr nmhdr = Cast(NMHDR Ptr,lParam) If nmhdr->code = TVN_SELCHANGED Then Dim As NMTREEVIEW Ptr NMTW = Cast(NMTREEVIEW Ptr,LPARAM) Dim TV_ITEM As TVITEM Dim As String*256 szBuf TV_ITEM.pszText = Cast(LPSTR,@szBuf) TV_ITEM.cchTextMax = 20 TV_ITEM.mask = TVIF_TEXT TV_ITEM.hItem = NMTW->itemNew.hItem
SendMessage(hTree,TVM_GETITEM,0,Cast(LPARAM,@TV_ITEM)) MessageBox(0,szBuf,"",0) EndIf
Case WM_DESTROY PostQuitMessage(0) End Select Return DefWindowProc(hwnd,msg,wparam,lparam) End Function
With wc .cbSize=SizeOf(WNDCLASSEX) .style=CS_HREDRAW Or CS_VREDRAW .lpfnWndProc=@wndproc .hInstance=Hinst .hIcon=LoadIcon(0,IDI_WINLOGO) .hCursor=LoadCursor(0,IDC_ARROW) .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME) .lpszClassName=StrPtr(NameClass) .hIconSm=.hIcon End With
If RegisterClassEx(@wc)=0 Then Print "Register error, press any key" Sleep End EndIf
CreateWindowEx(0,NameClass,"TreeView",_ WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,235,255,0,0,Hinst,0)
While GetMessage(@msg,0,0,0) TranslateMessage(@msg) DispatchMessage(@msg) Wend
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Среда, 20.08.2014, 00:06 | Сообщение # 3 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Спасибо! Как всегда, качественно и понятно!
|
|
| |
|