Что нового

TreeViewTab - Библиотека создания псевдо вкладок в виде дерева списка

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AutoIt: 3.3.8.1
Версия: 1.2

Категория: Элементы GUI

Описание: Данная библиотека позволяет создавать псевдо-вкладки (Tab) в виде дерева списка (TreeView). Полезно для диалога настроек.
Примечания:
* С точки зрения использования, эта библиотека очень похожа на элементы Tab'а.
Но есть небольшие исключения:
- Чтобы избежать проблемы и позволить создание других элементов за пределами элемента «TreeViewTab», вы должны закрыть текущий “Tab” используя _GUICtrlTreeViewTab_CloseTab.
- Чтобы создать новый элемент в существующем элементе «TreeViewTabItem», используйте _GUICtrlTreeViewTab_OpenTab, создайте новый элемент, и снова закройте “Tab” функцией _GUICtrlTreeViewTab_CloseTab.
- После (а лучше до) удаления родительского окна в котором был создан «TreeViewTab», следует вызвать функцию _GUICtrlTreeViewTab_DestroyTab.
- Вы можете создать более одного элемента «TreeViewTab» в одном GUI, и даже создавать их внутри другого элемента «TreeViewTabItem».

* Для включения элементов созданных внешними функциями (_GUICtrl*) в элемент «TreeViewTabItem», используйте _GUICtrlTreeViewTab_AddExternalControl.

* Уже не актуально. Данная библиотека регистрирует сообщение WM_NOTIFY, если вы используете данное сообщение в вашем скрипте, вам нужно добавить следующий вызов в вашу функцию:
Код:
__GUICtrlTreeViewTab_WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

- В архиве имеется версия без использования WM_NOTIFY (TreeViewTab_Adlib.au3).




P.S.
Данная библиотека является развитием предыдущей версии с совершенно другой, менее универсальной концепцией.

Код/Пример:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <GUIButton.au3>

#include "TreeViewTab.au3"

$hGUI = GUICreate("TreeViewTab Example", 300, 60)
$iSettings_Button = GUICtrlCreateButton("Settings", 20, 20, 260, 20)
GUISetState(@SW_SHOW, $hGUI)

While 1
	$iMsg = GUIGetMsg()
	
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iSettings_Button
			_Settings_GUI($hGUI)
	EndSwitch
WEnd

Func _Settings_GUI($hParent)
	Local Enum _
		$iGeneral_Indx, $iSettings_Indx, $iAbout_Indx, $iOther_Indx, $iWindow_Indx, _
		$iTotal_Indxs
	
	Local $aImage_Indxs[$iTotal_Indxs][2] = [["General", -170], ["Settings", -91], ["About", -24], ["Other", -77], ["Window", -3]]
	
	GUISetState(@SW_DISABLE, $hParent)
	$hSettings_GUI = GUICreate("TreeViewTab Example - Settings", 450, 400, -1, -1, -1, -1, $hParent)
	
	$iTreeViewTab = _GUICtrlTreeViewTab_CreateTab(5, 5, 150, 348, -1, BitOR($WS_EX_STATICEDGE, $WS_EX_CLIENTEDGE))
	
	#Region General TVItem
	
	$iGeneral_TVTItem = _GUICtrlTreeViewTab_CreateTabItem("General", $iTreeViewTab)
	GUICtrlSetColor(-1, 0x0000C0)
	GUICtrlSetImage(-1, "shell32.dll", $aImage_Indxs[$iGeneral_Indx][1])
	
	$iGeneralHeader_Icon = GUICtrlCreateIcon("shell32.dll", $aImage_Indxs[$iGeneral_Indx][1], 160, 3, 32, 32)
	$iGeneralHeader_Label = GUICtrlCreateLabel("General", 200, 10, 300, 40)
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	
	$hExternal_Button = _GUICtrlButton_Create($hSettings_GUI, 'External Button', 230, 150, 100, 25, $BS_SPLITBUTTON)
	_GUICtrlTreeViewTab_AddExternalControl($iTreeViewTab, $iGeneral_TVTItem, $hExternal_Button)
	
	;Settings TVItem
	$iSettings_TVItem = _GUICtrlTreeViewTab_CreateTabItem("Settings", $iTreeViewTab, $iGeneral_TVTItem)
	GUICtrlSetImage(-1, "shell32.dll", $aImage_Indxs[$iSettings_Indx][1])
	
	$iSettingsHeader_Icon = GUICtrlCreateIcon("shell32.dll", $aImage_Indxs[$iSettings_Indx][1], 160, 3, 32, 32)
	$iSettingsHeader_Label = GUICtrlCreateLabel("Settings", 200, 10, 300, 40)
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	
	$iSettings_CheckBox1 = GUICtrlCreateCheckbox("Settings Checkbox 1", 180, 60)
	$iSettings_CheckBox2 = GUICtrlCreateCheckbox("Settings Checkbox 2", 180, 80)
	$iSettings_CheckBox3 = GUICtrlCreateCheckbox("Settings Checkbox 3", 180, 100)
	
	$iSettings_List = GUICtrlCreateList("List Item", 180, 140, 250, 210)
	
	;About TVItem
	$iAbout_TVItem = _GUICtrlTreeViewTab_CreateTabItem("About", $iTreeViewTab, $iGeneral_TVTItem)
	GUICtrlSetImage(-1, "shell32.dll", $aImage_Indxs[$iAbout_Indx][1])
	
	$iAboutHeader_Icon = GUICtrlCreateIcon("shell32.dll", $aImage_Indxs[$iAbout_Indx][1], 160, 3, 32, 32)
	$iAboutHeader_Label = GUICtrlCreateLabel("About", 200, 10, 300, 40)
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	
	$iAbout_Label = GUICtrlCreateLabel( _
		"TreeViewTab - Settings Controls Concept" & @CRLF & @CRLF & _
		"By G.Sandler a.k.a CreatoR", 180, 70, 300, 50)
	GUICtrlSetFont(-1, 8, 400, 2, "Georgia")
	
	#EndRegion General TVItem
	
	#Region Other TVItem
	
	$iOther_TVTItem = _GUICtrlTreeViewTab_CreateTabItem("Other", $iTreeViewTab)
	GUICtrlSetColor(-1, 0x0000C0)
	GUICtrlSetImage(-1, "shell32.dll", $aImage_Indxs[$iOther_Indx][1])
	
	$iOtherHeader_Icon = GUICtrlCreateIcon("shell32.dll", $aImage_Indxs[$iOther_Indx][1], 160, 3, 32, 32)
	$iOtherHeader_Label = GUICtrlCreateLabel("Other", 200, 10, 300, 40)
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	
	;Window TVItem
	$iWindow_TVItem = _GUICtrlTreeViewTab_CreateTabItem("Window", $iTreeViewTab, $iOther_TVTItem)
	GUICtrlSetImage(-1, "shell32.dll", $aImage_Indxs[$iWindow_Indx][1])
	
	$iWindowHeader_Icon = GUICtrlCreateIcon("shell32.dll", $aImage_Indxs[$iWindow_Indx][1], 160, 3, 32, 32)
	$iWindowHeader_Label = GUICtrlCreateLabel("Window", 200, 10, 300, 40)
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	
	$iWindowSetOnTop_CheckBox = GUICtrlCreateCheckbox("Set on top", 180, 100)
	
	#EndRegion Other TVItem
	
	_GUICtrlTreeViewTab_CloseTab($iTreeViewTab)
	
	;Seperators
	GUICtrlCreateLabel("", 160, 40, 285, 2, $SS_SUNKEN)
	GUICtrlCreateGroup("", 160, 45, 285, 310)
	GUICtrlCreateLabel("", 2, 360, 446, 2, $SS_SUNKEN)
	
	$iClose_Button = GUICtrlCreateButton("Close", 5, 370, 70, 20)
	$iAddCtrl_Button = GUICtrlCreateButton("Add Control", 90, 370, 100, 20)
	$iDelTVItem_Button = GUICtrlCreateButton("Delete current TVTItem", 305, 370, 140, 20)
	
	GUISetState(@SW_SHOW, $hSettings_GUI)
	
	GUICtrlSetState($iOther_TVTItem, BitOR($GUI_DEFBUTTON, $GUI_FOCUS)) ; Paint in bold "Other" item
	GUICtrlSetState($iGeneral_TVTItem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON, $GUI_FOCUS)) ; Expand the "General" item and paint in bold
	
	While 1
		$iMsg = GUIGetMsg()
		
		Switch $iMsg
			Case $iClose_Button, $GUI_EVENT_CLOSE
				_GUICtrlTreeViewTab_DestroyTab($iTreeViewTab)
				
				GUISetState(@SW_ENABLE, $hParent)
				GUIDelete($hSettings_GUI)
				
				ExitLoop
			Case $iAddCtrl_Button
				GUISetState(@SW_DISABLE, $hSettings_GUI)
				$hAddCtrl_GUI = GUICreate("Add New Element", 500, 150, -1, -1, 0, BitOR($WS_EX_STATICEDGE, $WS_EX_CLIENTEDGE, $WS_EX_TOOLWINDOW), $hSettings_GUI)
				
				GUICtrlCreateLabel("GUICtrlCreate", 20, 42, 80, 15)
				GUICtrlSetFont(-1, 9, 800)
				$iCtrlName_Input = GUICtrlCreateInput("Label('New Label', 180, 330, -1, 15)", 100, 40, 380, 20)
				GUICtrlSetFont(-1, 8.3, 800)
				GUICtrlSetColor(-1, 0xFF0000)
				
				$iOK_Button = GUICtrlCreateButton("Add", 20, 100, 60, 20)
				GUICtrlSetState(-1, $GUI_DEFBUTTON)
				$iCancel_Button = GUICtrlCreateButton("Cancel", 90, 100, 60, 20)
				
				GUISetState(@SW_SHOW, $hAddCtrl_GUI)
				
				While 1
					Switch GUIGetMsg()
						Case $GUI_EVENT_CLOSE, $iCancel_Button
							ExitLoop
						Case $iOK_Button
							GUISwitch($hSettings_GUI)
							
							_GUICtrlTreeViewTab_OpenTab($iTreeViewTab, GUICtrlRead($iTreeViewTab))
							$iNewCtrlID = Execute("GUICtrlCreate" & GUICtrlRead($iCtrlName_Input))
							_GUICtrlTreeViewTab_CloseTab($iTreeViewTab)
							
							ExitLoop
					EndSwitch
				WEnd
				
				GUISetState(@SW_ENABLE, $hSettings_GUI)
				GUIDelete($hAddCtrl_GUI)
			Case $iDelTVItem_Button
				$iTVTItemID = GUICtrlRead($iTreeViewTab)
				$iDelCtrls = Int(MsgBox(52, 'Attention', 'Delete all controls of that TVTItem (' & GUICtrlRead($iTVTItemID, 1) & ')?', 0, $hSettings_GUI) = 6)
				
				$aChild_CtrlIDs = _GUICtrlTreeViewTab_DeleteItem($iTreeViewTab, $iTVTItemID, $iDelCtrls)
				
				For $iIndx = 0 To $iTotal_Indxs-1
					For $iID = 1 To UBound($aChild_CtrlIDs)-1
						If GUICtrlRead($aChild_CtrlIDs[$iID], 1) == $aImage_Indxs[$iIndx][0] Then
							GUICtrlSetImage($aChild_CtrlIDs[$iID], "shell32.dll", $aImage_Indxs[$iIndx][1])
						EndIf
					Next
				Next
		EndSwitch
	WEnd
EndFunc

Файл: TreeViewTab.zip

Снимок:


История версий:
1.2
* Сообщение WM_NOTIFY заменено оконной Callback-процедурой (спасибо BugFix).
* Исправлена проблема с добавлением новых элементов, после удаления TreeViewTabItem элементы добавляются вне TabItem, т.е по сути создаются обычно.
* Убран TreeViewTab_Adlib.au3 в связи с заменой WM_NOTIFY.

1.1
+ Добавлена функция _GUICtrlTreeViewTab_DestroyTab, следует вызывать после удаления родительского окна в котором был создан TreeViewTab.
* Исправлена проблема с удалением элементов. Скрипт больше не завершает свою работу с фатальной ошибкой.
* Улучшен пример.


1.0
Первая публичная версия

Источник: autoit-script.ru
Автор(ы): G.Sandler (CreatoR)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Добавил в архив версию без использования WM_NOTIFY (TreeView_Adlib.au3).
Правда особо не тестировал.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Добавил несколько элементов, а затем попробывал удалить...

Код:
E:\Desktop\TreeViewTab\TreeViewTab.au3 (304) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$aTmp[$i][$iC] = $a_TVT_Items[$i][$j]
^ ERROR
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Добавил несколько элементов, а затем попробывал удалить...
Пример можно?

Хотя думаю дело в том что ты удаляешь до закрытия таба.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Видимо нужно ещё добавить функцию высвобождения удалённых элементов...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление...

1.1
+ Добавлена функция _GUICtrlTreeViewTab_DestroyTab, следует вызывать после удаления родительского окна в котором был создан TreeViewTab.
* Исправлена проблема с удалением элементов. Скрипт больше не завершает свою работу с фатальной ошибкой.
* Улучшен пример.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление...

1.2
* Сообщение WM_NOTIFY заменено оконной Callback-процедурой (спасибо BugFix).
* Исправлена проблема с добавлением новых элементов, после удаления TreeViewTabItem элементы добавляются вне TabItem, т.е по сути создаются обычно.
* Убран TreeViewTab_Adlib.au3 в связи с заменой WM_NOTIFY.
 
Верх