Автор Тема: Вертикальное выравнивание Label  (Прочитано 9303 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Вертикальное выравнивание Label
« Ответ #15, Отправлен: Февраль 10, 2012, 01:43:10 »
Вообщем тут получается вот в чём беда, высота стандартного текста в Label = 18, но если применить GUICtrlSetFont(), то мы уже не знаем какой размер текста в элементе поставит пользователь, по этому я включил возможность устанавливать высоту текста, стандартно стоит 18.

Русское сообщество AutoIt

Re: Вертикальное выравнивание Label
« Ответ #15 Отправлен: Февраль 10, 2012, 01:43:10 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7837
  • Репутация: 2291
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Вертикальное выравнивание Label
« Ответ #16, Отправлен: Февраль 10, 2012, 02:24:10 »
Viktor1703  [?]
Цитировать
Вообщем тут получается вот в чём беда, высота стандартного текста в Label = 18, но если применить GUICtrlSetFont(), то мы уже не знаем какой размер текста в элементе поставит пользователь, по этому я включил возможность устанавливать высоту текста, стандартно стоит 18.
Это вроде решается функцией GetTextExtentPoint32:

Код: AutoIt [Выделить]
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



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Вертикальное выравнивание Label
« Ответ #17, Отправлен: Февраль 10, 2012, 02:26:47 »
Ну вот, совсем другое дело  :)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7837
  • Репутация: 2291
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Вертикальное выравнивание Label
« Ответ #18, Отправлен: Февраль 10, 2012, 02:47:46 »
Viktor1703  [?]
Цитировать
Ну вот, совсем другое дело
Ещё вариант:

Код: AutoIt [Выделить]
#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


Русское сообщество AutoIt

Re: Вертикальное выравнивание Label
« Ответ #18 Отправлен: Февраль 10, 2012, 02:47:46 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2725
  • Репутация: 1140
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: Вертикальное выравнивание Label
« Ответ #19, Отправлен: Февраль 10, 2012, 03:05:18 »
BaRsupillamy
А может для индивидуального случая подойдёт выравнивание с помощью переноса строки? И посмотри в примере функцию GUISetAccelerators - закрывает окно без всяких UDF.
Код: AutoIt [Выделить]
#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


Оффлайн BaRsupillamy [?]

  • Новичок
  • *
  • Сообщений: 58
  • Репутация: 0
    • Награды
Re: Вертикальное выравнивание Label
« Ответ #20, Отправлен: Февраль 10, 2012, 09:16:42 »
Цитировать
А может для индивидуального случая подойдёт выравнивание с помощью переноса строки?
не стоит, пусть будет как есть :) просто хотел красиво...

ваш вариант не совсем то, что надо... суть я понял, спасибо, буду знать о такой возможности... но пользователь может спокойно спрятать окно и работать дальше... а тут хотели, чтобы продолжать работу было нельзя без закрытия окна... т.е. пользователь должен прочитать и нажать... я понимаю, что в итоге они могут начать, не читая, пальцем проводить по всем цифрам :) т.е. учесть все глупости и ухищрения пользователя никогда нельзя... хотел сделать, чтобы после нажатия не той клавиши, что надо, фон окна становился красным и вообще всё блокировалось на 5 секунд... но спешил показать своё творение и не сделал :) как будет свободное время, может и займусь...

Оффлайн Krokodile [?]

  • Новичок
  • *
  • Сообщений: 43
  • Репутация: 1
    • Награды
Re: Вертикальное выравнивание Label
« Ответ #21, Отправлен: Февраль 24, 2012, 19:52:57 »
Подскажите как центрировать текст внутри поля label, как по вертикали, так и по горизонтали.
Код: AutoIt [Выделить]
#include <GUIConstants.au3>

Opt("GUICoordMode", 1)
GUICreate("Radio Box Demo", 400,280)

GUICtrlCreateGroup ("Количество нажатий",10,10,300,300)

GUISetFont (92,650,'SS_CENTER ','$SS_CENTERIMAGE')
$label1=GUICtrlCreateLabel ("1",15,25,270,250,'SS_CENTER ','$SS_CENTERIMAGE')


GUISetState ()
While 1
   $msg = GUIGetMsg()
   if $msg = $GUI_EVENT_CLOSE then Exit
WEnd

 

И еще вопрос.. Этой первый ГУИ, насчет последних строк - может есть другой, более разумный способ удержания окна(чтоб оно не закрывалось сразу после запуска).

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Вертикальное выравнивание Label
« Ответ #22, Отправлен: Февраль 24, 2012, 20:00:33 »

Русское сообщество AutoIt

Re: Вертикальное выравнивание Label
« Ответ #22 Отправлен: Февраль 24, 2012, 20:00:33 »

Оффлайн Hiki [?]

  • Новичок
  • *
  • Сообщений: 27
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Вертикальное выравнивание Label
« Ответ #23, Отправлен: Ноябрь 15, 2018, 07:35:33 »
Я смотрю с 2012 года вопрос не решен? А мне сейчас как раз очень надо.
Все примеры из темы перепробовал, мне не подходят, у меня текст вставляется в Label динамически через GUICtrlSetData, и конечно же он разной длины.
Пробовал заменить Label на что-то другое, ничего подходящего не нашел, Edit тоже не центрирует, только кнопка центрирует и по вертикали и по горизонтали, но мне надо размер примерно 300*300, а такая кнопка выглядит не эстетично.
Неужели во Autoit нельзя решить такую простую задачу как центрирование по вертикали многострочного текста?
Помогите плиз!

Русское сообщество AutoIt

Re: Вертикальное выравнивание Label
« Ответ #23 Отправлен: Ноябрь 15, 2018, 07:35:33 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
3801 Просмотров
Последний ответ Февраль 17, 2010, 18:58:11
от edyapd
7 Ответов
4705 Просмотров
Последний ответ Июль 22, 2010, 18:53:31
от Yashied
1 Ответов
2627 Просмотров
Последний ответ Декабрь 24, 2010, 09:54:25
от Heler
3 Ответов
3010 Просмотров
Последний ответ Декабрь 24, 2010, 22:09:23
от CreatoR
4 Ответов
3509 Просмотров
Последний ответ Март 05, 2012, 20:55:01
от Yashied
2 Ответов
1757 Просмотров
Последний ответ Февраль 02, 2013, 02:13:58
от Zaramot
11 Ответов
4087 Просмотров
Последний ответ Апрель 11, 2013, 01:21:24
от AZJIO
26 Ответов
7869 Просмотров
Последний ответ Март 26, 2014, 16:27:51
от Коршун
2 Ответов
1448 Просмотров
Последний ответ Май 22, 2016, 18:29:59
от kolosov
2 Ответов
424 Просмотров
Последний ответ Декабрь 25, 2017, 19:32:05
от Yuriy_V.