Что нового

[Элементы GUI] Табы - корректно расположить вертикально вкладки ($TCS_VERTICAL)

saavaage

Знающий
Сообщения
171
Репутация
17
Собственно проблема: не могу заставить нормально отображаться вкладки при их вертикальном расположении, а именно - названия вкладок не видны...

Вот код:

Код:
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 450, 192, 124)
$Tab1 = GUICtrlCreateTab(24, 24, 537, 393, BitOR($TCS_BOTTOM,$TCS_VERTICAL,$WS_VSCROLL))
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
$TabSheet1 = GUICtrlCreateTabItem("TabSheet1")
$TabSheet2 = GUICtrlCreateTabItem("TabSheet2")
$TabSheet3 = GUICtrlCreateTabItem("TabSheet3")
$TabSheet4 = GUICtrlCreateTabItem("TabSheet4")
$TabSheet5 = GUICtrlCreateTabItem("TabSheet5")
$TabSheet6 = GUICtrlCreateTabItem("TabSheet6")
GUICtrlSetState(-1,$GUI_SHOW)
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd

Система - WinXP Pro SP3
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Только так (методом отключения стилей/темы XP):

Код:
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 633, 450, 192, 124)

DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)

$Tab1 = GUICtrlCreateTab(24, 24, 537, 393, BitOR($TCS_MULTILINE, $TCS_VERTICAL, $TCS_RIGHT), $WS_EX_CLIENTEDGE)
$TabSheet1 = GUICtrlCreateTabItem("TabSheet3")
$TabSheet2 = GUICtrlCreateTabItem("TabSheet3")
$TabSheet3 = GUICtrlCreateTabItem("TabSheet3")
$TabSheet4 = GUICtrlCreateTabItem("TabSheet4")
$TabSheet5 = GUICtrlCreateTabItem("TabSheet5")
$TabSheet6 = GUICtrlCreateTabItem("TabSheet6")
GUICtrlSetState(-1, $GUI_SHOW)
GUICtrlCreateTabItem("")

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
		Exit
	EndSwitch
WEnd
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
CreatoR, работает, но есть одно но: можно ли сделать так, чтобы подписи вкладок выводились в горизонтальном стиле (слева-направо), а не как сейчас(сверху-вниз)?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
saavaage [?]
можно ли сделать так, чтобы подписи вкладок выводились в горизонтальном стиле
Я не знаю такого метода (за исключением рисования через Own Draw Tabs, но это не из простых задач), да и зачем?
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
CreatoR, зачем? Ну хотя бы ради:

а) эргономика гораздо лучше когда название вкладок идет горизонтально (чтение проще + тоже самое кол-во вкладок располагаются не в несколько рядов, а в один столбец)
б) проект предполагал изначально вытянутость, т.е. больше высота, чем ширина формы:
1. такое расположение позволяет разместить большее кол-во вкладок, избежав при этом использование нескольких рядов их названий;
2. такое расположение позволяет избежать вертикального скроллинга при выводе большого кол-ва информации на Табе (информация будет иметь вид столбца)

Вот, вкратце. Да и вообще, странно, - вроде, возможность такая предусмотрена ($TCS_VERTICAL), но пользоваться качественно нельзя. Я думал, что просто есть какая-то хитрость в применении этого стиля...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Насколько я понял, реализовать стандартными средствами это нельзя. Тема закрыта.
Спасибо, CreatoR, за разъяснение.
 

Yashied

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

Код:
#Include <Constants.au3>
#Include <GUIConstantsEx.au3>
#Include <GUITab.au3>
#Include <StaticConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>

Dim $Pic[5]

GUICreate('MyGUI', 705, 369)
GUISetBkColor(0xFFFFFF)
GUICtrlCreatePic('img_bg.bmp', 0, 0, 705, 369)
GUICtrlSetState(-1, $GUI_DISABLE)

For $i = 0 To 4
	$Pic[$i] = GUICtrlCreatePic(@ScriptDir & '\img_black.bmp', 10, 24 + 50 * $i, 162, 49)
	GUICtrlCreateLabel('Tabsheet' & $i, 21, 40 + 50 * $i, 140, 18, $SS_CENTER)
	GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
	GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
	GUICtrlSetcolor(-1, 0xFFFFFF)
Next

$Tab = GUICtrlCreateTab(172 + 4, 10 + 4, 523 - 8, 349 - 8, $TCS_FOCUSNEVER)
GUICtrlCreateTabItem('Tabsheet0')
GUICtrlCreateEdit('', 190, 28, 487, 313)
GUICtrlCreateTabItem('Tabsheet1')
GUICtrlCreateButton('OK', 398, 319, 70, 23)
GUICtrlCreateTabItem('Tabsheet2')
GUICtrlCreateTabItem('Tabsheet3')
GUICtrlCreateTabItem('Tabsheet4')
GUICtrlCreateTabItem('')

; Эта функция нужна только для того, чтобы убрать фокус с Tab (функция универсальная)
_SetStyle($Tab, $WS_TABSTOP, 0)

GUISetState()

$Item = -1

While 1
	$Msg = GUIGetMsg()
	If $Item = -1 Then
		$Msg = $Pic[0]
		$Item = 1
	EndIf
	Switch $Msg
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Pic[0] To $Pic[UBound($Pic) - 1]
			If $Msg <> $Pic[$Item] Then
				GUICtrlSetImage($Pic[$Item], @ScriptDir & '\img_black.bmp')
				GUICtrlSetcolor($Pic[$Item] + 1, 0xFFFFFF)
				GUICtrlSetImage($Msg, @ScriptDir & '\img_white.bmp')
				GUICtrlSetcolor($Msg + 1, 0x313A42)
				For $i = 0 To UBound($Pic) - 1
					If ($Msg = $Pic[$i]) Or ($Msg = $Pic[$i] + 1) Then
						$Item = $i
						ExitLoop
					EndIf
				Next
				_GUICtrlTab_SetCurFocus($Tab, $Item)
			EndIf
	EndSwitch
WEnd

Func _SetStyle($hWnd, $iStyle, $fSet, $fExStyle = 0, $fUpdate = 0)

	If Not IsHWnd($hWnd) Then
		$hWnd = GUICtrlGetHandle($hWnd)
		If Not $hWnd Then
			Return
		EndIf
	EndIf

	Local $Flag, $Style

	If $fExStyle Then
		$Flag = $GWL_EXSTYLE
	Else
		$Flag = $GWL_STYLE
	EndIf
	$Style = _WinAPI_GetWindowLong($hWnd, $Flag)
	If $fSet Then
		If BitAND($Style, $iStyle) <> $iStyle Then
			_WinAPI_SetWindowLongEx($hWnd, $Flag, BitOR($Style, $iStyle))
		EndIf
	Else
		If BitAND($Style, $iStyle) Then
			_WinAPI_SetWindowLongEx($hWnd, $Flag, BitAND($Style, BitNOT($iStyle)))
		EndIf
	EndIf
	If $fUpdate Then
		_WinAPI_InvalidateRect($hWnd)
	EndIf
EndFunc   ;==>_SetStyle


post_img_067.png

P.S

Честно скажу, картинки стянул из Avast5... Так, примера ради.

:whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
Класс! :IL_AutoIt_1:
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Прекрасно! То, что надо! :IL_AutoIt_1: :beer: :ok:
Тема РЕШЕНА!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied
Хороший пример, но есть один баг. Можно случайно нажать в том месте где скрыты вкладки табов.
Обойти это можно например так:

Код:
...

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

...

While 1
    ...
	
    Switch $Msg
        ...
		
        Case $Pic[0] To $Pic[UBound($Pic) - 1]
            If $Msg <> $Pic[$Item] Then
                ...
				
				GUIRegisterMsg($WM_NOTIFY, "")
                _GUICtrlTab_SetCurFocus($Tab, $Item)
				GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
            EndIf
    EndSwitch
WEnd

...

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode, $tNMHDR
    
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
	
	If $iIDFrom <> $Tab Then Return $GUI_RUNDEFMSG
	
	Switch $iCode
		Case $TCN_SELCHANGING
			Return 1
	EndSwitch
	
    Return $GUI_RUNDEFMSG
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR

Да, что-то я про это совсем забыл. Но в любом случае проще написать

Код:
GUICtrlSetState($Tab, $GUI_DISABLE)


и все OK. Здесь даже _SetStyle() и WinAPIEx UDF не нужны. От GUITab UDF тоже избавился. Просто сказка, только нативные функции AutoIt.

saavaage

Если еще немного наморщить ум, то можно добавить "слежение за курсором":

Код:
#Include <Constants.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>
#Include <TabConstants.au3>
#Include <WindowsConstants.au3>

Dim $Pic[5]

GUICreate('MyGUI', 705, 369)
GUISetBkColor(0xFFFFFF)
GUICtrlCreatePic('img_bg.bmp', 0, 0, 705, 369)
GUICtrlSetState(-1, $GUI_DISABLE)

For $i = 0 To 4
	$Pic[$i] = GUICtrlCreatePic(@ScriptDir & '\img_black.bmp', 10, 24 + 50 * $i, 162, 49)
	GUICtrlCreateLabel('Tabsheet' & $i, 21, 40 + 50 * $i, 140, 18, $SS_CENTER)
	GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
	GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
	GUICtrlSetcolor(-1, 0xFFFFFF)
Next

$Tab = GUICtrlCreateTab(172 + 4, 10 + 4, 523 - 8, 349 - 8)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateTabItem('Tabsheet0')
GUICtrlCreateEdit('', 190, 28, 487, 313)
GUICtrlCreateTabItem('Tabsheet1')
GUICtrlCreateButton('OK', 398, 319, 70, 23)
GUICtrlCreateTabItem('Tabsheet2')
GUICtrlCreateTabItem('Tabsheet3')
GUICtrlCreateTabItem('Tabsheet4')
GUICtrlCreateTabItem('')

GUISetState()

$Item = -1
$Over = -1

While 1
	$Info = GUIGetCursorInfo()
	If @error Then
		If $Over <> -1 Then
			GUICtrlSetImage($Pic[$Over], @ScriptDir & '\img_black.bmp')
		EndIf
		$Over = -1
	Else
		$Index = _Index($Info[4])
		If $Index <> $Over Then
			If $Over <> -1 Then
				GUICtrlSetImage($Pic[$Over], @ScriptDir & '\img_black.bmp')
			EndIf
			If ($Index <> -1) And ($Index <> $Item) Then
				GUICtrlSetImage($Pic[$Index], @ScriptDir & '\img_over.bmp')
				$Over = $Index
			Else
				$Over = -1
			EndIf
		EndIf
	EndIf
	$Msg = GUIGetMsg()
	If $Item = -1 Then
		$Msg = $Pic[0]
		$Item = 1
	EndIf
	Switch $Msg
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Pic[0] To $Pic[UBound($Pic) - 1]
			If $Msg <> $Pic[$Item] Then
				GUICtrlSetImage($Pic[$Item], @ScriptDir & '\img_black.bmp')
				GUICtrlSetcolor($Pic[$Item] + 1, 0xFFFFFF)
				GUICtrlSetImage($Msg, @ScriptDir & '\img_white.bmp')
				GUICtrlSetcolor($Msg + 1, 0x313A42)
				$Item = _Index($Msg)
				GUICtrlSendMsg($Tab, $TCM_SETCURFOCUS, $Item, 0)
				$Over = -1
			EndIf
	EndSwitch
WEnd

Func _Index($CtrlID)
	For $i = 0 To UBound($Pic) - 1
		If ($CtrlID = $Pic[$i]) Or ($CtrlID = $Pic[$i] + 1) Then
			Return $i
		EndIf
	Next
	Return -1
EndFunc   ;==>_Index


post_img_068.png
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Красиво. Спасибо, Yashied!

PS Только ресайза не хватает для полного счастья... ;)
 

ol1o

Новичок
Сообщения
26
Репутация
0
:ok:
а как сделать выбор(слежение) кнопок на клавиатуре(стрелочками), enter или пробел. открытие?
а если TabSheet очень много? можно сделать прокрутку кнопок, и слежение чтоб не убегала за видимую область?
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
ol1o [?]
а если TabSheet очень много? можно сделать прокрутку кнопок, и слежение чтоб не убегала за видимую область?
Сделать можно почти все, что угодно.
Но не путайте разделы форума. В этом разделе - вопросы на ответы.
Причем 1 тема - 1 вопрос.

Раздел заказов тут.
 

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
98
Репутация
38
Re: [Элементы GUI] Табы

Ворошу старую тему :smile: Но уж больно красивый пример у Yashied'a вышел...
Всё пытаюсь его адаптировать в OnEvent и ничего не выходит...
В примере ведеться работа с $Msg = GUIGetMsg(). Вот только в OnEvent режиме $Msg получить незнаю как... GUIGetMsg() всегда возвращает 0 :(


UPD: Таки разобрался :smile: Стоило погартать мануал =)) В общем смысле выходит, что при выполнении OnEvent функции можно получить CtrlID (он же $Msg) из переменной @GUI_CTRLID

Если кому интересно - вот пример Yasheld'a слегка измененный мною под OnEvent:

Код:
#Include <Constants.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>
#Include <TabConstants.au3>
#Include <WindowsConstants.au3>

Opt("GUIOnEventMode",1)

Global $Pic[6]

GUICreate('MyGUI', 705, 369)
GUISetBkColor(0xFFFFFF)
GUICtrlCreatePic('img_bg.bmp', 0, 0, 705, 369)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")

_myGUITabCreate (0,'MyTab 0')
_myGUITabCreate (1,'MyTab 1')
_myGUITabCreate (2,'MyTab 2')
_myGUITabCreate (3,'MyTab 3')
_myGUITabCreate (4,'MyTab 4')
_myGUITabCreate (5,'MyTab 5')

$Tab = GUICtrlCreateTab(172 + 4, 10 + 4, 523 - 8, 349 - 8)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateTabItem('0')
GUICtrlCreateEdit('TAB 0', 190, 28, 487, 313)
GUICtrlCreateTabItem('1')
GUICtrlCreateButton('TAB 1', 398, 150, 70, 23)
GUICtrlCreateTabItem('2')
GUICtrlCreateCheckbox('TAB 2', 398, 150, 70, 23)
GUICtrlCreateTabItem('3')
GUICtrlCreateCombo('TAB 3', 398, 150, 70, 23)
GUICtrlCreateTabItem('4')
GUICtrlCreateInput('TAB 4', 398, 150, 70, 23)
GUICtrlCreateTabItem('5')
GUICtrlCreateListView('TAB 5', 300, 150, 170, 53)
GUICtrlCreateTabItem('')

GUISetState()

$Over = -1
$Item = 0
GUICtrlSetImage($Pic[0], @ScriptDir & '\img_white.bmp')
GUICtrlSetcolor($Pic[0] + 1, 0x313A42)

While 1
    $Info = GUIGetCursorInfo()
    If @error Then
        If $Over <> -1 Then
            GUICtrlSetImage($Pic[$Over], @ScriptDir & '\img_black.bmp')
        EndIf
        $Over = -1
    Else
        $Index = _Index($Info[4])
        If $Index <> $Over Then
            If $Over <> -1 Then
                GUICtrlSetImage($Pic[$Over], @ScriptDir & '\img_black.bmp')
            EndIf
            If ($Index <> -1) And ($Index <> $Item) Then
                GUICtrlSetImage($Pic[$Index], @ScriptDir & '\img_over.bmp')
                $Over = $Index
            Else
                $Over = -1
            EndIf
        EndIf
    EndIf
	Sleep(50)
WEnd

Func _Index($CtrlID)
    For $i = 0 To UBound($Pic) - 1
        If ($CtrlID = $Pic[$i]) Or ($CtrlID = $Pic[$i] + 1) Then
            Return $i
        EndIf
    Next
    Return -1
EndFunc   ;==>_Index

Func _myGUITabCreate ($index,$lable='Tab')
	$Pic[$index] = GUICtrlCreatePic(@ScriptDir & '\img_black.bmp', 10, 24 + 50 * $index, 162, 49)
	GUICtrlSetOnEvent(-1,"_PicClick")
    GUICtrlCreateLabel($lable, 21, 40 + 50 * $index, 140, 18, $SS_CENTER)
    GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetcolor(-1, 0xFFFFFF)
EndFunc

Func _PicClick()
    $Msg = @GUI_CTRLID
    If $Item = -1 Then
        $Msg = $Pic[0]
        $Item = 1
    EndIf
    Switch $Msg
        Case $Pic[0] To $Pic[UBound($Pic) - 1]
            If $Msg <> $Pic[$Item] Then
                GUICtrlSetImage($Pic[$Item], @ScriptDir & '\img_black.bmp')
                GUICtrlSetcolor($Pic[$Item] + 1, 0xFFFFFF)
                GUICtrlSetImage($Msg, @ScriptDir & '\img_white.bmp')
                GUICtrlSetcolor($Msg + 1, 0x313A42)
                $Item = _Index($Msg)
                GUICtrlSendMsg($Tab, $TCM_SETCURFOCUS, $Item, 0)
                $Over = -1
            EndIf
    EndSwitch
EndFunc

Func _Exit ()
	Exit
EndFunc


Ссылка на кртинки:
clip.gif
Images.7z
 
Верх