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

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

Оффлайн running-frag [?]

  • Продвинутый
  • ***
  • Сообщений: 441
  • Репутация: 60
  • why me?
    • Награды
Допустим есть
Код: AutoIt [Выделить]
#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 отцентрировать по вертикали?


Добавлено: Ноябрь 10, 2011, 17:04:58
почему то мне кажется что это нереально (ну разве что подвинуть и resize сам label)

развейте мои сомнения
« Последнее редактирование: Ноябрь 10, 2011, 17:04:58 от running-frag, Причина: Объединение сообщений »
"Слушай всех, но делай по своему." (с)
"Что бы понять что написано в коде, нужно его переписать." (с)
"Нет ничего более постоянного, чем временное." (c)
"В нашей жизни, изменить можно всё... Кроме смерти." (с)

http://autoit-script.ru/index.php?topic=8058.0.html

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

Вертикальное выравнивание Label
« Отправлен: Ноябрь 10, 2011, 16:51:12 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2698
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Вертикальное выравнивание Label
« Ответ #1, Отправлен: Ноябрь 10, 2011, 17:17:22 »
развейте мои сомнения

Код: AutoIt [Выделить]
BitOR($SS_CENTER, $SS_CENTERIMAGE)



Думай, прежде чем говорить.

Оффлайн running-frag [?]

  • Продвинутый
  • ***
  • Сообщений: 441

  • Автор темы
  • Репутация: 60
  • why me?
    • Награды
Re: Вертикальное выравнивание Label
« Ответ #2, Отправлен: Ноябрь 10, 2011, 17:19:54 »
спасибо :)

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Re: Вертикальное выравнивание Label
« Ответ #3, Отправлен: Ноябрь 10, 2011, 18:16:07 »
Yashied  [?]
Цитировать
BitOR($SS_CENTER, $SS_CENTERIMAGE)

Что то у меня так не центрируется
Прошу прощения, не понял вопроса.
Я думал о центрировании самого элемента
« Последнее редактирование: Ноябрь 10, 2011, 18:22:59 от gregaz »
Самая большая проблема – её сформулировать. 

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

Re: Вертикальное выравнивание Label
« Ответ #3 Отправлен: Ноябрь 10, 2011, 18:16:07 »

Оффлайн BaRsupillamy [?]

  • Новичок
  • *
  • Сообщений: 58
  • Репутация: 0
    • Награды
Re: Вертикальное выравнивание Label
« Ответ #4, Отправлен: Февраль 09, 2012, 17:17:15 »
up

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

Оффлайн Afonichev [?]

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

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

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


Только как отцентровать по вертикале - я не знаю :)
« Последнее редактирование: Февраль 09, 2012, 18:34:42 от Viktor1703 »

Онлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7938
  • Репутация: 2300
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Вертикальное выравнивание Label
« Ответ #6, Отправлен: Февраль 09, 2012, 18:41:03 »
Viktor1703  [?]
Цитировать
Смотрите стили для элементов окна, там много чего можно найти
Ты бы сначала тему прочитал ;).

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


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


AutoIt is simple, subtle, elegant.


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


Мои работы

Оффлайн Afonichev [?]

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

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

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

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

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

Онлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7938
  • Репутация: 2300
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Вертикальное выравнивание Label
« Ответ #8, Отправлен: Февраль 09, 2012, 19:12:54 »
Viktor1703  [?]
Цитировать
Так я писал для BaRsupillamy
Который спросил:
[?]
Цитировать
А если у Label текст длинный, то при использовании $SS_CENTERIMAGE он перестаёт переноситься по строкам

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

;)

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Вертикальное выравнивание Label
« Ответ #9, Отправлен: Февраль 09, 2012, 19:18:05 »
Понятно, тогда выбирайте что - то одно, либо текст переносится, либо располагается в центре по вертикале.


Добавлено: Февраль 09, 2012, 19:39:10
А если так сделать:

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

« Последнее редактирование: Февраль 09, 2012, 19:39:10 от Viktor1703, Причина: Объединение сообщений »

Онлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7938
  • Репутация: 2300
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Вертикальное выравнивание Label
« Ответ #10, Отправлен: Февраль 09, 2012, 23:03:27 »
Viktor1703  [?]
Цитировать
тогда выбирайте что - то одно, либо текст переносится, либо располагается в центре по вертикале.
Вопрос очень даже актуален, было бы полезно иметь обе возможности.

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

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

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


Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Вертикальное выравнивание Label
« Ответ #11, Отправлен: Февраль 09, 2012, 23:25:42 »
Цитировать
Попробуй задать 200 как ширину Label'а, текст уже не по центру.

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

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

А WinAPI использовал чтобы не нужно было писать параметр handle окна в функции :)
« Последнее редактирование: Февраль 09, 2012, 23:32:34 от Viktor1703 »

Онлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7938
  • Репутация: 2300
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Вертикальное выравнивание Label
« Ответ #12, Отправлен: Февраль 09, 2012, 23:49:43 »
Viktor1703  [?]
Цитировать
WinAPI использовал чтобы не нужно было писать параметр handle окна в функции
Можно и без него:

Код: AutoIt [Выделить]
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
    • Награды
Re: Вертикальное выравнивание Label
« Ответ #13, Отправлен: Февраль 10, 2012, 00:08:25 »
спасибо, ребята, за бурное обсуждение :)
просто люблю, чтобы было красиво...
а сделать надо было вот такую вещь :)

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


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

Оффлайн Afonichev [?]

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

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



Добавлено: Февраль 10, 2012, 01:03:24
Прошу прощения за кривезну, но вроде получилось

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

« Последнее редактирование: Февраль 10, 2012, 01:38:09 от Viktor1703, Причина: Объединение сообщений »

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

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

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
3845 Просмотров
Последний ответ Февраль 17, 2010, 18:58:11
от edyapd
7 Ответов
4765 Просмотров
Последний ответ Июль 22, 2010, 18:53:31
от Yashied
1 Ответов
2663 Просмотров
Последний ответ Декабрь 24, 2010, 09:54:25
от Heler
3 Ответов
3045 Просмотров
Последний ответ Декабрь 24, 2010, 22:09:23
от CreatoR
4 Ответов
3557 Просмотров
Последний ответ Март 05, 2012, 20:55:01
от Yashied
2 Ответов
1795 Просмотров
Последний ответ Февраль 02, 2013, 02:13:58
от Zaramot
11 Ответов
4172 Просмотров
Последний ответ Апрель 11, 2013, 01:21:24
от AZJIO
26 Ответов
8005 Просмотров
Последний ответ Март 26, 2014, 16:27:51
от Коршун
2 Ответов
1479 Просмотров
Последний ответ Май 22, 2016, 18:29:59
от kolosov
2 Ответов
451 Просмотров
Последний ответ Декабрь 25, 2017, 19:32:05
от Yuriy_V.