Что нового

Выравнивание текста в ToolTip

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
как можно выровнять текст в tooltip, что бы двоеточия были на одной линии, какой то нестандартный шрифт, не могу понять.
Вот например:
Код:
$sInfo = 'Задание         :'&1 &@CR
$sInfo&= 'Номер ошибки    :'&2&@CR
$sInfo&= 'Время начала    :'&3&@CR
$sInfo&= 'Время окончания :'&4&@CR
$sInfo&= 'Время выполнения:'&5&@CR
$sInfo&= 'Описание ошибки :'&6
ToolTip($sInfo,Default,Default,'',1,1)
HotKeySet('{ESC}', '_EXIT')

While 1
	Sleep(250)
WEnd

Func _EXIT()
	Exit
EndFunc   ;==>_EXIT
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Попробуйте так.
Код:
$sInfo = 'Задание' & @TAB & @TAB & @TAB & ':' & 1 & @CR
$sInfo &= 'Номер ошибки' & @TAB & @TAB & ':' & 2 & @CR
$sInfo &= 'Время начала' & @TAB & @TAB & ':' & 3 & @CR
$sInfo &= 'Время окончания' & @TAB & ':' & 4 & @CR
$sInfo &= 'Время выполнения' & @TAB & ':' & 5 & @CR
$sInfo &= 'Описание ошибки' & @TAB & ':' & 6
ToolTip($sInfo, Default, Default, '', 1, 1)
HotKeySet('{ESC}', '_EXIT')

While 1
	Sleep(250)
WEnd

Func _EXIT()
	Exit
EndFunc   ;==>_EXIT
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В том то и проблема, что приходится подбирать количество табов, у меня, например, что бы работал ваш код, необходимо убрать один таб в первой строчке...
Это видимо зависит от выбранного шрифта для tooltip. А нужно решение работающие со всеми шрифтами или темами.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
$sInfo = 'Задание         :'&1 &@CR
$sInfo&= 'Номер ошибки    :'&2&@CR
$sInfo&= 'Время начала    :'&3&@CR
$sInfo&= 'Время окончания :'&4&@CR
$sInfo&= 'Время выполнения:'&5&@CR
$sInfo&= 'Описание ошибки :'&6
;ToolTip($sInfo,Default,Default,'',1,1)
SplashTextOn("", $sInfo, 240, 150, 1, 1, 4, "Courier New")
HotKeySet('{ESC}', '_EXIT')

While 1
    Sleep(250)
WEnd

Func _EXIT()
    Exit
EndFunc   ;==>_EXIT
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
inververs
Если бы речь шла о простой надписи(label), то вот эта функция могла бы подойти
http://autoit-script.ru/index.php/topic,10169.0.html
или ее аналог
http://www.autoitscript.com/forum/topic/114034-stringsize-m23-new-version-16-aug-11/
С помощью них можно получит ширину и высоту текста, и изменить его.
Можно создавать элементы с обратной связью - при изменении размеров текст не сползает, и выравнивание сохраняется.
Но у tooltip с измением параметров не слишком хорошо.
Может лучше написать свой аналог(да и скорее всего они уже написаны) на основе GUI?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Попробовал так
Код:
$sInfo= StringFormat("%-18s\t%s\n", 'Задание :', '4') 
$sInfo&= StringFormat("%-18s\t%s\n", 'Номер ошибки :', '4') 
$sInfo&= StringFormat("%-18s\t%s\n", 'Время начала :', '4') 
$sInfo&= StringFormat("%-18s\t%s\n", 'Время окончания :', '4') 
$sInfo&= StringFormat("%-18s\t%s\n", 'Время выполнения :', '4') 
$sInfo&= StringFormat("%-18s\t%s\n", 'Описание ошибки :', '4') 
ToolTip($sInfo,Default,Default,'',1,1)
HotKeySet('{ESC}', '_EXIT')

While 1
    Sleep(250)
WEnd

Func _EXIT()
    Exit
EndFunc   ;==>_EXIT

Но текст может выстроится как раз на границе табуляции и одни символы перепрыгнут к следующей границе, другие нет. Есть вариант в примере _GUIToolTip_GetTipBkColor используется установка шрифта _WinAPI_SetFont, _WinAPI_CreateFont, использовать моноширинный шрифт, тогда всё получится.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
ТС хочет чтобы ровно было на любом компьютере, с любыми установленными системными шрифтами. Поэтому ему нужно принудительно выбрать моноширный шрифт для отображения своей подсказки. ToolTip не позволяет выбирать шрифт, SplashTextOn позволяет.
В стандартном наборе шрифтов моноширным является Courier.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Вариант.
Код:
#include <WinAPI.au3>
#include <FontConstants.au3>

$sInfo = StringFormat('%-20s:%3s\n%-20s:%3s\n%-20s:%3s\n%-20s:%3s\n%-20s:%3s\n%-20s:%3s\n', 'Задание', 1, 'Номер ошибки', 2, 'Время начала', 3, 'Время окончания', 4, _
		'Время выполнения', 5, 'Описание ошибки', 6)
ToolTip($sInfo, Default, Default, '', 1, 1)
$hToolTip = _GetToolTip($sInfo)
If $hToolTip Then
	$hFont = _WinAPI_CreateFont(14, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Lucida Console')
	_WinAPI_SetFont($hToolTip, $hFont)
EndIf
HotKeySet('{ESC}', '_EXIT')

While 1
	Sleep(250)
WEnd

Func _EXIT()
	_WinAPI_DeleteObject($hFont)
	Exit
EndFunc   ;==>_EXIT

Func _GetToolTip($s_Text)
	Local $a_ToolTip, $h_ToolTip
	$a_ToolTip = WinList('[Class:tooltips_class32]')
	If Not $a_ToolTip[0][0] Then Return $h_ToolTip
	For $i = 1 To $a_ToolTip[0][0]
		If BitAND(WinGetState($a_ToolTip[$i][1]), 2) And StringInStr(WinGetTitle($a_ToolTip[$i][1]), $s_Text) Then
			$h_ToolTip = $a_ToolTip[$i][1]
			ExitLoop
		EndIf
	Next
	Return $h_ToolTip
EndFunc   ;==>_GetToolTip
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Спасибо всем кто отписался. Нужно было сделать это для tooltip, поэтому SplashTextOn неподходит. Вариант с StringFormat был бы идеальным, если бы можно было задать, на какой именно позиции табуляции следует размещаться текст.
Похоже, придется выбирать моноширинный шрифт.
И вариант от madmasles делает то что нужно :ok:. Правда я не люблю такой стиль программировния. Было бы идельно, если бы существовала функция API создающее свой tooltip, и позволяющая устанавливать шрифт.





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

madmasles
Можно функцию упростить
Код:
Func _GetToolTip($s_Text)
	Return WinGetHandle('[class:tooltips_class32;TITLE:' & $s_Text & ']')
EndFunc   ;==>_GetToolTip
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles [?]
Так только для своего работает.
у вас какая система. У меня на 7 такой код, отлавливает текст любого tooltip, кроме, почему то, времени и даты, но может там другой класс.
Код:
Sleep(5000)
ConsoleWrite(WinGetTitle('[class:tooltips_class32]'))
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
У меня 7х86 и Ваш способ не работает для чужого.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Обновления будут здесь

Код:
#include <GUIToolTip.au3>
#include <FontConstants.au3>

Global $aInfo[6][2] = [[ _
		'Задание', '1'],[ _
		'Номер ошибки', '2'],[ _
		'Время начала', '3'],[ _
		'Время окончания', '4'],[ _
		'Время выполнения', '5'],[ _
		'Описание ошибки', '6']]

$sText = ''
For $i = 0 To 5
	_StringFormat($sText, $aInfo[$i][0], $aInfo[$i][1])
Next
$sText = StringTrimRight($sText, 1)

Func _StringFormat(ByRef $sText, $sString1, $sString2)
	$sText &= StringFormat("%-18s: %s\n", $sString1, $sString2)
EndFunc   ;==>_StringFormat
; MsgBox(0, 'Сообщение', $sText)

; Получает дескриптор иконки
$hIcon = _WinAPI_LoadShell32Icon(15)

$hTool = _ToolTip($sText, 500, 300, 'Информация', $hIcon, $TTS_NOPREFIX  + $TTS_BALLOON, 16, 'Consolas', 0x1EBFFF, 0x395A00)
$hFont = @extended
; _ToolTip($sText, 500, 300)
Sleep(1500)

For $i = 1 To StringLen($sText) - 1
	_GUIToolTip_UpdateTipText($hTool, 0, 0, StringTrimRight($sText, $i))
	Sleep(10)
Next
Sleep(500)
_GUIToolTip_UpdateTipText($hTool, 0, 0, $sText)
If $hFont Then _WinAPI_DeleteObject($hFont) ; удаление объекта шрифта (обратите внимание, что шрифт не работает после удаления объекта)

For $i = 1 To 5
	; Устанавливает позицию подсказки
	_GUIToolTip_TrackPosition($hTool, Random(0, @DesktopWidth, 1), Random(0, @DesktopHeight, 1))
	Sleep(400)
Next

_GUIToolTip_TrackPosition($hTool, 500, 300)
For $i = 1 To 4
	; Принудительно показывает подсказку
	_GUIToolTip_TrackActivate($hTool, False)
	Sleep(500)

	; Принудительно показывает подсказку
	_GUIToolTip_TrackActivate($hTool)
	Sleep(500)
Next

_GUIToolTip_Destroy($hTool) ; Удалить подсказку

; #FUNCTION# ;=================================================================================
; Function Name ...: _ToolTip
; Description ........: ToolTip extended
; Syntax................: _ToolTip ( $sText[, $iX = 0[, $iY = 0[, $iTitle = ''[, $hIcon = 0[, $iStyle = 0[, $iFontSize = 0[, $iFontFamily = 'Arial'[, $iFontColor = 0[, $iBkColor = 0]]]]]]]]] )
; Parameters:
;		$sText - The text of the tooltip
;		$iX - The x position of the tooltip
;		$iY - The y position of the tooltip
;		$iTitle - The title for the tooltip
;		$hIcon - Pre-defined icon to show next to the title: Requires a title.
;			0 = No icon, 1 = Info icon, 2 = Warning icon, 3 = Error Icon, Handle to the Icon
;		$iStyle - ToolTip style (_GUIToolTip_Create)
;		$iFontSize - height of font.
;		$iFontFamily - typeface name.
;		$iFontColor - text color.
;		$iBkColor - background color.
; Return values ....: Success - The handle to the Tooltip window, @extended = $hFont
;					Failure - 0, @error:
;					-1 - $hTool = 0, ToolTip will not be displayed
;					1 - error of the font
;					2 - error of the title
;					3 - error 1 and 2 together
; Author(s) ..........: AZJIO
; Remarks ..........: When you no longer need the font, call the _WinAPI_DeleteObject function to delete it
; ============================================================================================
; Имя функции ...: _ToolTip
; Описание ........: Всплывающая подсказка с расширенными установками.
; Синтаксис.......: _ToolTip ( $sText[, $iX = 0[, $iY = 0[, $iTitle = ''[, $hIcon = 0[, $iStyle = 0[, $iFontSize = 0[, $iFontFamily = 'Arial'[, $iFontColor = 0[, $iBkColor = 0]]]]]]]]] )
; Параметры:
;		$sText - Текст всплывающей подсказки
;		$iX - X-координата всплывающей подсказки
;		$iY - Y-координата всплывающей подсказки
;		$iTitle - Заголовок всплывающей подсказки
;		$hIcon - Иконка, отображаемая рядом с заголовком. Требует указания параметра $iTitle.
;					| 0 - Без иконки (по умолчанию)
;					| 1 - Иконка "Информация"
;					| 2 - Иконка "Предупреждение"
;					| 3 - Иконка "Ошибка
;					| Дескриптор иконки
;		$iStyle - Стиль. Значения соответствуют параметрам _GUIToolTip_Create.
;		$iFontSize - Размер шрифта.
;		$iFontFamily - Имя шрифта.
;		$iFontColor - Цвет шрифта.
;		$iBkColor - Фон всплывающей подсказки.
; Возвращаемое значение: Успешно - Возвращает дескриптор ToolTip, @extended содержит дескриптор шрифта
;					Неудачно - Возвращает 0 и устанавливает @error = 1
;					-1 - $hTool не создан, подсказка не будет отображаться
;					1 - ошибка установки шрифта
;					2 - ошибка устновки заголовка
;					3 - ошибка 1 и 2 вместе
; Автор ..........: AZJIO
; Примечания ..: После завершения использования _ToolTip удалите объект $hFont
; ============================================================================================
Func _ToolTip($sText, $iX = 0, $iY = 0, $iTitle = '', $hIcon = 0, $iStyle = 0, $iFontSize = 0, $iFontFamily = 'Arial', $iFontColor = 0, $iBkColor = 0)
	; If BitAND($iStyle, 1) Then $iStyle += $TTS_BALLOON

	; Создаёт ToolTip
	Local $hFont = 0, $iError = 0
	Local $hTool = _GUIToolTip_Create(0, $iStyle)
	If Not $hTool Then Return SetError(-1, 0, 0)

	; Устанавливает ширину ToolTip
	_GUIToolTip_SetMaxTipWidth($hTool, @DesktopWidth)
	; Кроме того это позволяет отображать текст с переносом строки. Иначе @CRLF не будет иметь эффекта.

	; Устанавливает шрифт для ToolTip
	If $iFontSize Then
		$hFont = _WinAPI_CreateFont($iFontSize, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, $iFontFamily)
		If $hFont Then
			_WinAPI_SetFont($hTool, $hFont)
		Else
			$iError += 1
		EndIf
	EndIf

	; Устанавливает цвет
	If $iFontColor Then _GUIToolTip_SetTipTextColor($hTool, $iFontColor) ; Цвет текста (BGR) всплывающей подсказки
	If $iBkColor Then _GUIToolTip_SetTipBkColor($hTool, $iBkColor) ; Цвет фона (BGR) всплывающей подсказки

	; Назначает подсказку элементу и стиль с координатами
	If Not _GUIToolTip_AddTool($hTool, 0, $sText, 0, 0, 0, 0, 0, 2 + 16) Then Return SetError(1, 0, 0)

	; Устанавливает заголовок подсказки
	If $iTitle And Not _GUIToolTip_SetTitle($hTool, $iTitle, $hIcon) Then $iError += 2

	; Устанавливает позицию подсказки
	_GUIToolTip_TrackPosition($hTool, $iX, $iY)

	; Принудительно показывает подсказку
	_GUIToolTip_TrackActivate($hTool)
	Return SetError($iError, $hFont, $hTool)
EndFunc   ;==>_ToolTip
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
AZJIO
классный пример! Особенно потому, что можно добавить иконку!
Если бы еще можно было бы указывать, на какой стороне рисовать стрелку, было бы отлично!
Но это не очень и важно. Меня полностью устраивает :beer:.

P.s. Надо в функции где то удалить объект _WinAPI_DeleteObject($hFont)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
inververs [?]
P.s. Надо в функции где то удалить объект _WinAPI_DeleteObject($hFont)
Если удалить, то повторные вызовы изменения текста и т.д. не работают. Не знаю как лучше, пусть кому надо делают под конкретный случай. Добавить только в описание информацию о необходимости удалить при выходе.
 
Верх