FreeBasic
Главная
Вход
Регистрация
Пятница, 27.12.2024, 03:30Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Пара вопросов по TreeView
WQДата: Вторник, 19.08.2014, 16:29 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: 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
Репутация: 50
Статус: 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
Репутация: 7
Статус: Offline
Спасибо! Как всегда, качественно и понятно!
 
  • Страница 1 из 1
  • 1
Поиск: