Что нового

Создание вкладок без GUICtrlCreateTab

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Предлагаю пример создания вкладок без использования GUICtrlCreateTab...
Код:
; НАЧАЛО

 $GUI=GUICreate('Вкладки')

 Dim $TABITEM[4][5]

 $TABITEM[1][0]=GUICtrlCreateButton('1 вкладка',10,10,100,25)
 $TABITEM[2][0]=GUICtrlCreateButton('2 вкладка',10+100,10,100,25)
 $TABITEM[3][0]=GUICtrlCreateButton('3 вкладка',10+100+100,10,100,25)

 $TABITEM[1][1]=GUICtrlCreateList('Список 1',10,10+30,100,200)
 $TABITEM[1][2]=GUICtrlCreateButton('Кнопка 1',10+100+10,100,100,25)
 $TABITEM[2][1]=GUICtrlCreateList('Список 2',10,10+30,100,200)
 $TABITEM[2][2]=GUICtrlCreateButton('Кнопка 2',10+100+10,100,100,25)
 $TABITEM[3][1]=GUICtrlCreateList('Список 3',10,10+30,100,200)
 $TABITEM[3][2]=GUICtrlCreateButton('Кнопка 3',10+100+10,100,100,25)

 SHOWTAB(1)

 GUISetState()

 While True
  Switch GUIGetMsg()
   Case -3
    Exit
   Case $TABITEM[1][0]
    SHOWTAB(1)
   Case $TABITEM[2][0]
    SHOWTAB(2)
   Case $TABITEM[3][0]
    SHOWTAB(3)
   Case $TABITEM[1][1]
    MsgBox(0,'1 вкладка','Выбран список')
   Case $TABITEM[1][2]
    MsgBox(0,'1 вкладка','Нажата кнопка')
   Case $TABITEM[2][1]
    MsgBox(0,'2 вкладка','Выбран список')
   Case $TABITEM[2][2]
    MsgBox(0,'2 вкладка','Нажата кнопка')
   Case $TABITEM[3][1]
    MsgBox(0,'3 вкладка','Выбран список')
   Case $TABITEM[3][2]
    MsgBox(0,'3 вкладка','Нажата кнопка')
  EndSwitch
 WEnd

 Func SHOWTAB($NUMBER)

  For $I=1 To Ubound($TABITEM,1)-1
   For $J=1 To Ubound($TABITEM,2)-1
    If $TABITEM[$I][$J] Then GUICtrlSetState($TABITEM[$I][$J],32)
   Next
  Next

  For $I=1 To Ubound($TABITEM)-1
   If $TABITEM[$NUMBER][$I] Then GUICtrlSetState($TABITEM[$NUMBER][$I],16)
  Next

 EndFunc

; КОНЕЦ
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
snoitaleR
Делал подобное однажды, однако вместо кнопок использовался ToolBar.
Из минусов - при большом кол-ве вкладок(> и контролов) переключения становятся визуально заметны, особенно при старте программы.

Код:
Func _GUIMain_Switch( $_iTabNum )
	Local $_alCtrls[10] = [ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], $Idx
	Local $_ahCtrls[9] = [ $_hMain_ListView[0], $_hMain_ListView[1], $_hMain_ListView[2], $_hMain_ListView[3], $_hMain_Edit, _
		$_hMain_Input[0], $_hMain_Input[1], $_hMain_Input[2], $_hMain_Input[3] ]
	; ---
	Switch $_iTabNum
		Case $_aToolBarID[0 ]
			$_alCtrls[1] = 1 ;ListView0

		Case $_aToolBarID[1 ]
			$_alCtrls[2] = 1 ;ListView1

		Case $_aToolBarID[2 ]
			$_alCtrls[3] = 1 ;ListView2

		Case $_aToolBarID[3 ]
			$_alCtrls[4] = 1 ;ListView3
			$_alCtrls[5] = 1 ;Console
			$_alCtrls[6] = 1 ;Input0
			$_alCtrls[7] = 1 ;Input1
			$_alCtrls[8] = 1 ;Input2
			$_alCtrls[9] = 1 ;Input3
	EndSwitch
	; ---
	For $Idx = 1 To $_alCtrls[0] Step 1
		If $_alCtrls[$Idx] Then
			ControlShow( $_hGuiMain, '', $_ahCtrls[$Idx-1] )
		Else
			ControlHide( $_hGuiMain, '', $_ahCtrls[$Idx-1] )
		EndIf
	Next
EndFunc
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Можно создавать несколько дочерних окон (со стилем $WS_CHILD и т.д.) с контролами, и переключать эти окна.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А кто нибудь делал вот такие вкладки?
310c5ece2863.png
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
inververs

Есть такое http://autoit-script.ru/index.php?topic=10628.0
Но, да простит меня CreatoR, отрисовка элементов при старте ужасная

Поэтому в своих программах как раз и использую связку GUICtrlCreateTreeView+ дочерние окна
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
WSWR
Т.е по клику на элементе TreeView вы показываете новое дочернее окно? ниразу с дочерними окнами дело не имел. Его нужно будет вписывать куда то и менять размер, и еще перемещать синхронно с TreeView? или у вас проще?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
inververs
Если ваше окно имеет свойство менять размеры, то следить за размерами дочерних окон все же придется (достаточно в момент отрисовки текущего). За перемещением следить не нужно если используете стиль $WS_CHILD.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Как-то так, возможно, можно и получше сделать:

Код:
#include <Array.au3>
#include <GUIConstants.au3>
#include <TreeviewConstants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Local $h_GUI = GUICreate('Настройки', 710, 440, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_DLGMODALFRAME)

Local $iTrSetTab = GUICtrlCreateTreeView(5, 5, 220, 380, BitOR($TVS_HASBUTTONS, _
		$TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)

Local $a_Item[5][4] = [[$iTrSetTab, 0, 15, 0],[1, 1, 'Настройки 1', 0],[2, 2, 'Настройки 1.1', 1], _
		[3, 3, 'Настройки 1.2', 1],[4, 4, 'Настройки 2', 0]]

For $i = 1 To UBound($a_Item) - 1
	$a_Item[$i][0] = GUICtrlCreateTreeViewItem($a_Item[$i][2], $a_Item[$a_Item[$i][3]][0])
Next

$a_Item[1][1] = _TabGUI_Create($h_GUI, 'Настройки 1')
GUICtrlCreateLabel('Настройки 1', 5, 43, 240, 20)

$a_Item[2][1] = _TabGUI_Create($h_GUI, 'Настройки 1.1')
GUICtrlCreateLabel('Настройки 1.1', 5, 43, 240, 20)


$a_Item[3][1] = _TabGUI_Create($h_GUI, 'Настройки 1.2')
GUICtrlCreateLabel('Настройки 1.2', 5, 43, 240, 20)

$a_Item[4][1] = _TabGUI_Create($h_GUI, 'Настройки 2')
GUICtrlCreateLabel('Настройки 2', 5, 43, 240, 20)

GUICtrlSetState($a_Item[1][0], BitOR($GUI_EXPAND, $GUI_DEFBUTTON, $GUI_FOCUS, $GUI_DISABLE))
GUISetState(@SW_SHOW, $h_GUI)
GUISetState(@SW_SHOWNOACTIVATE, $a_Item[1][1])

While 1
	Local $nMsg = GUIGetMsg()
	Switch $nMsg
		Case $a_Item[1][0] To $a_Item[4][0]
			Local $iItem = _ArraySearch($a_Item, $nMsg, 0, 0, 0, 0, 1, 0)
			For $i = 1 To UBound($a_Item) - 1
				GUISetState(@SW_HIDE, $a_Item[$i][1])
			Next
			GUISetState(@SW_SHOWNOACTIVATE, $a_Item[$iItem][1])
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _TabGUI_Create($hParent, $sTitle = '')
	Local $hGui = GUICreate('', 455, 380, 240, 5, $WS_CHILD, 0, $hParent)
	GUICtrlCreateLabel('', 5, 25, 400, 2, $SS_SUNKEN)
	GUICtrlCreateLabel($sTitle, 5, 0, 360, 25)
	Return $hGui
EndFunc   ;==>_TabGUI_Create

В цикле использую _ArraySearch(), т.к. с ним надежнее, чем вычислять номер
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
firex, WSWR
Понятно, спасибо. Думал все будет намного сложнее.
 
Верх