Что нового

Вертикальное выравнивание Label

running-frag

why me?
Сообщения
441
Репутация
60
Допустим есть
Код:
#include <GUIConstants.au3>
#include <EditConstants.au3>

GUICreate 	("gui", 200, 200)
	GUICtrlCreateLabel 	("label", 10, 10, 100, 50, $ES_CENTER)
	GUICtrlSetColor		(-1, 0xffffff)
	GUICtrlSetBkColor	(-1, 0x000000)
GUISetState (@SW_SHOW)

While 1
	$action = GUIGetMsg()
	
	If $action = $GUI_EVENT_CLOSE Then
		ExitLoop
	EndIf
WEnd


Как label отцентрировать по вертикали?


Добавлено:
Сообщение автоматически объединено:

почему то мне кажется что это нереально (ну разве что подвинуть и resize сам label)

развейте мои сомнения
 

BaRsupillamy

Новичок
Сообщения
58
Репутация
0
up

А если у Label текст длинный, то при использовании $SS_CENTERIMAGE он перестаёт переноситься по строкам, в отличие от использование одиночного $SS_CENTER... можно что то сделать быстро и просто, чтобы в Label текст и располагался по центру по горизонтали и вертикали и преносился по словам, если не помещается в него?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
BaRsupillamy

Смотрите стили для элементов окна, там много чего можно найти :smile:

Код:
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

GUICreate("", 200, 200)
GUICtrlCreateLabel  ("label 1 2 3 4 5 6 7 8 9 0", 10, 10, 40, 100, BitOR($ES_AUTOVSCROLL, $SS_CENTER))
GUICtrlSetBkColor(-1, 0xff00DC)
GUISetState()

While 1
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
        ExitLoop
    EndIf
WEnd


Только как отцентровать по вертикале - я не знаю :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
Смотрите стили для элементов окна, там много чего можно найти
Ты бы сначала тему прочитал ;).

Проблема в том что $SS_CENTERIMAGE не позволяет многострочный текст, даже если его разделить с @CRLF (и об этом кстати в справке написано).
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Так я писал для BaRsupillamy

А если у Label текст длинный
чтобы в Label текст и располагался по центру по горизонтали и вертикали и преносился по словам, если не помещается в него?

И зачем для текстового Lable применять стиль $SS_CENTERIMAGE
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
Так я писал для BaRsupillamy
Который спросил:
[?]
А если у Label текст длинный, то при использовании $SS_CENTERIMAGE он перестаёт переноситься по строкам

[?]
И зачем для текстового Lable применять стиль $SS_CENTERIMAGE
Чтобы...
[?]
в Label текст и располагался по центру по горизонтали и вертикали

;)
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Понятно, тогда выбирайте что - то одно, либо текст переносится, либо располагается в центре по вертикале.


Добавлено:
Сообщение автоматически объединено:

А если так сделать:

Код:
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>

GUICreate("", 200, 200)
$iLabel = GUICtrlCreateLabel  ("label 1 2 3 4 5 6 7 8 9 0", 10, 10, 40, 150, BitOR($ES_AUTOVSCROLL, $SS_CENTER))
GUICtrlSetBkColor($iLabel, 0xff00DC)
SS_VCENTER($iLabel)
GUISetState()

While 1
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
        ExitLoop
    EndIf
WEnd

Func SS_VCENTER($iCtrl)
	$sData = ''
	$sText = GUICtrlRead($iCtrl)
	$sLen = StringLen($sText)
	$iHeight = _WinAPI_GetWindowHeight(GUICtrlGetHandle($iCtrl))
	For $i = 1 To ($iHeight / 2) - ($sLen / 2) - 10
		$sData &= ' '
	Next
	$sData &= $sText
    GUICtrlSetData($iCtrl, $sData)	
EndFunc
 

CreatoR

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

А если так сделать:
Попробуй задать 200 как ширину Label'а, текст уже не по центру.

Кстати можно это сделать и без WinAPI:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

$hGUI = GUICreate("", 250, 200)

$iLabel = GUICtrlCreateLabel("label 1 2 3 4 5 6 7 8 9 0", 10, 10, 40, 100, $SS_CENTER)
GUICtrlSetBkColor($iLabel, 0xFF00DC)
_GUICtrlLabel_SetVerticalCenter($hGUI, $iLabel)

GUISetState()

While 1
	If GUIGetMsg() = $GUI_EVENT_CLOSE Then
		ExitLoop
	EndIf
WEnd

Func _GUICtrlLabel_SetVerticalCenter($hWnd, $iCtrl)
	Local $sData = ''
	Local $sText = ControlGetText($hWnd, '', $iCtrl)
	Local $iLen = StringLen($sText)
	Local $aCtrlPos = ControlGetPos($hWnd, '', $iCtrl)
	
	For $i = 1 To ($aCtrlPos[3] / 2) - ($iLen / 2) - 10
		$sData &= ' '
	Next
	
	$sData &= $sText
	ControlSetText($hWnd, '', $iCtrl, $sData)
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Попробуй задать 200 как ширину Label'а, текст уже не по центру.

Не, ну эт я знаю, просто подумал что как вариант, можно использовать такую конструкцию и сильно не вбивался в расчёты, сделал по быстрому и показал пример :whistle:

Кстати можно это сделать и без WinAPI:

А WinAPI использовал чтобы не нужно было писать параметр handle окна в функции :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
WinAPI использовал чтобы не нужно было писать параметр handle окна в функции
Можно и без него:

Код:
Func _GUICtrlLabel_SetVerticalCenter($iCtrl)
	Local $sData = ''
	Local $sText = GUICtrlRead($iCtrl)
	Local $iLen = StringLen($sText)
	Local $aCtrlPos = ControlGetPos(GUICtrlGetHandle($iCtrl), '', '')
	
	For $i = 1 To ($aCtrlPos[3] / 2) - ($iLen / 2) - 10
		$sData &= ' '
	Next
	
	$sData &= $sText
	GUICtrlSetData($iCtrl, $sData)
EndFunc


;)
 

BaRsupillamy

Новичок
Сообщения
58
Репутация
0
спасибо, ребята, за бурное обсуждение :smile:
просто люблю, чтобы было красиво...
а сделать надо было вот такую вещь :smile:

Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <BlockInputEx.au3>
#include <StaticConstants.au3>
#include <Misc.au3>

$sText =   IniRead("Set.ini", "Set", "Text", "Привет")
$iRazmer = IniRead("Set.ini", "Set", "Razmer", 35)
$iZvuk =   IniRead("Set.ini", "Set", "Zvuk", 0)
$iMode =   IniRead("Set.ini", "Set", "Mode", 0)

If $iMode <> 0 Then
	$iMode = 1
Else
	$imode = 3
EndIf

$iMain = Random(0, 9, 1)

$hGUI=GUICreate("", 800, 600, -1, -1, $WS_BORDER)
$labelNumber1 = GUICtrlCreateLabel($sText, 10, 100, 780, 300, BitOR($SS_SUNKEN,$SS_CENTER))
GUICtrlSetFont ($labelNumber1, $iRazmer)
$labelNumber2 = GUICtrlCreateLabel("Чтобы закрыть окно, нажмите клавишу '" & $iMain & "'.", 10, 450, 780, 40, BitOR($SS_SUNKEN,$SS_CENTER))
GUICtrlSetFont ($labelNumber2, 25)

GUISetState()

_BlockInputEx($iMode, $iMain)
$iMain += 30
While 1
	If $iZvuk = 1 And Mod(@SEC, 20) = 0 Then Beep(1800, 1000)
    If _IsPressed($iMain) Then ;KEY
		_BlockInputEx(0)
        ExitLoop
    EndIf
	Sleep(10)
WEnd


и хотелось верхнюю надпись иметь с переносами слов и по центру :smile:
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Можно и без него:

;D я думал что в первый параметр функции ControlGetPos() всегда нужно вводить handle окна а не контрола, сколько не учись - всё не узнаешь +1 :smile:



Добавлено:
Сообщение автоматически объединено:

Прошу прощения за кривезну, но вроде получилось

Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

$hForm = GUICreate("", 200, 200)
$iLabel = GUICtrlCreateLabel("Тестовая надпись для отцентровки текста в элементе Label", 10, 10, 150, 150, BitOR($ES_AUTOVSCROLL, $SS_CENTER))
GUICtrlSetBkColor($iLabel, 0xff00DC)
_GUICtrlLabel_SetVerticalCenter($iLabel)
GUISetState()

While 1
    Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUICtrlLabel_SetVerticalCenter($iCtrl, $iHeight = 18)
    Local $sData = ''
    Local $sText = GUICtrlRead($iCtrl)
    Local $iPos = ControlGetPos(GUICtrlGetHandle($iCtrl), '', '')
	For $i = 1 To (Round($iPos[3] / 2) / $iHeight)
		$sData &= @CRLF
	Next	
    $sData &= $sText
    GUICtrlSetData($iCtrl, $sData)  
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вообщем тут получается вот в чём беда, высота стандартного текста в Label = 18, но если применить GUICtrlSetFont(), то мы уже не знаем какой размер текста в элементе поставит пользователь, по этому я включил возможность устанавливать высоту текста, стандартно стоит 18.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
Вообщем тут получается вот в чём беда, высота стандартного текста в Label = 18, но если применить GUICtrlSetFont(), то мы уже не знаем какой размер текста в элементе поставит пользователь, по этому я включил возможность устанавливать высоту текста, стандартно стоит 18.
Это вроде решается функцией GetTextExtentPoint32:

Код:
Func _GUICtrlLabel_SetVerticalCenter($iCtrl)
	$sData = ''
    $sText = GUICtrlRead($iCtrl)
    $hWnd = GUICtrlGetHandle($iCtrl)
	$iPos = ControlGetPos($hWnd, '', '')
	
	$hDC = _WinAPI_GetDC($hWnd)
	$stagSIZE = _WinAPI_GetTextExtentPoint32($hDC, $sText)
	
	$iHeight = DllStructGetData($stagSIZE, "Y")
	
    For $i = 1 To (Round($iPos[3] / 2) / $iHeight)
        $sData &= @CRLF
    Next
	
    $sData &= $sText
    GUICtrlSetData($iCtrl, $sData)  
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
Ну вот, совсем другое дело
Ещё вариант:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

$hForm = GUICreate("", 200, 200)

$iLabel = GUICtrlCreateLabel("Тестовая надпись для отцентровки текста в элементе Label", 10, 10, 150, 150, $SS_CENTER)
GUICtrlSetBkColor($iLabel, 0xff00DC)
_GUICtrlLabel_SetVerticalCenter($iLabel)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUICtrlLabel_SetVerticalCenter($iCtrl, $iFntSize = 8.5, $iFntWeight = 400, $iFntName = 'Arial')
	Local $sData, $sText, $hWnd, $aiPos, $aiHeight
	
	$sText = GUICtrlRead($iCtrl)
	$hWnd = GUICtrlGetHandle($iCtrl)
	$aiPos = ControlGetPos($hWnd, '', '')
	$aiHeight = _GUICtrlLabelGetTextWidth($sText, $iFntSize, $iFntWeight, $iFntName)
	
	For $i = 1 To (Round($aiPos[3] / 2) / $aiHeight[1]) - 1
		$sData &= @CRLF
	Next
	
	$sData &= $sText
	GUICtrlSetData($iCtrl, $sData)
EndFunc

Func _GUICtrlLabelGetTextWidth($s_Data, $i_FontSize = 8.5, $i_FontWeight = -1, $s_TextFont = "Arial")
	Local Const $DEFAULT_CHARSET = 0 ; ANSI character set
	Local Const $OUT_CHARACTER_PRECIS = 2
	Local Const $CLIP_DEFAULT_PRECIS = 0
	Local Const $PROOF_QUALITY = 2
	Local Const $FIXED_PITCH = 1
	Local Const $RGN_XOR = 3
	Local Const $LOGPIXELSY = 90
	
	If $i_FontWeight = "" Or $i_FontWeight = -1 Then $i_FontWeight = 400 ; default Font weight
	
	Local $h_GDW_GUI = GUICreate("Get Data Width", 10, 10, -100, -100, 0x80880000, 0x00000080)
	
	Local $ah_DC = DllCall("user32.dll", "int", "GetDC", "hwnd", $h_GDW_GUI)
	Local $intDeviceCap = DllCall("gdi32.dll", "long", "GetDeviceCaps", "int", $ah_DC[0], "long", $LOGPIXELSY)
	Local $intFontHeight = DllCall("kernel32.dll", "long", "MulDiv", "long", $i_FontSize, "long", $intDeviceCap[0], "long", 72)
	
	Local $ah_Font = DllCall("gdi32.dll", "hwnd", "CreateFont", "int", -$intFontHeight[0], _
		"int", 0, "int", 0, "int", 0, "int", $i_FontWeight, "int", 0, _
		"int", 0, "int", 0, "int", $DEFAULT_CHARSET, _
		"int", $OUT_CHARACTER_PRECIS, "int", $CLIP_DEFAULT_PRECIS, _
		"int", $PROOF_QUALITY, "int", $FIXED_PITCH, "str", $s_TextFont)
	
	DllCall("gdi32.dll", "hwnd", "SelectObject", "int", $ah_DC[0], "hwnd", $ah_Font[0])
	
	Local $stRet = DllStructCreate("int;int")
	DllCall("gdi32.dll", "int", "GetTextExtentPoint32", "int", $ah_DC[0], "str", $s_Data, "long", StringLen($s_Data), "ptr", DllStructGetPtr($stRet))
	
	Local $a_RetLen[2] = [DllStructGetData($stRet, 1), DllStructGetData($stRet, 2)]
	GUIDelete($h_GDW_GUI)
	
	Return $a_RetLen
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
BaRsupillamy
А может для индивидуального случая подойдёт выравнивание с помощью переноса строки? И посмотри в примере функцию GUISetAccelerators - закрывает окно без всяких UDF.
Код:
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#NoTrayIcon

$sText =   IniRead("Set.ini", "Set", "Text", "Привет")
$iRazmer = IniRead("Set.ini", "Set", "Razmer", 35)
$iZvuk =   IniRead("Set.ini", "Set", "Zvuk", 0)

$iMain = Random(0, 9, 1)

$hGUI=GUICreate("", 800, 600)
$labelNumber1 = GUICtrlCreateLabel(@LF&@LF&$sText, 10, 100, 780, 300, BitOR($SS_SUNKEN,$SS_CENTER))
GUICtrlSetFont ($labelNumber1, $iRazmer)
$labelNumber2 = GUICtrlCreateLabel("Чтобы закрыть окно, нажмите клавишу '" & $iMain & "'.", 10, 450, 780, 40, BitOR($SS_SUNKEN,$SS_CENTER))
GUICtrlSetFont ($labelNumber2, 25)
$Dummy = GUICtrlCreateDummy()
Local $AccelKeys[1][2] = [[$iMain, $Dummy]]
GUISetAccelerators($AccelKeys)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3, $Dummy
			Exit
	EndSwitch
WEnd
 
Верх