1 (изменено: creature.ws, 2011-11-10 11:30:09)

Тема: AHK: ToolTip использующий специфичный шрифт

Каким образом без глобального изменения настроек темы windows изменить шрифт стандартного ToolTip генерируемого скриптом?

Если практичнее использовать ToolTipоподобное окно — какими параметрами задаются свойства подгонки размера окна и текстосодержащего control'а под ширину и высоту отображаемого текста?

2

Re: AHK: ToolTip использующий специфичный шрифт

creature.ws пишет:

Каким образом без глобального изменения настроек темы windows изменить шрифт стандартного ToolTip генерируемого скриптом?

Изменить, думаю, можно методом сабклассинга, но достаточно сложно. Проще использовать своё окно:

Text =
(
Тестовый
многострочный
текст

Hello, World!
AHK forever!
)
Gui, ToolTipWindow:New, -Caption +Border +ToolWindow +AlwaysOnTop
Gui, ToolTipWindow:Default
Gui, Font, s24 cBlue, Verdana
Gui, Margin, 50, 50
Gui, Color, 0xFFFFE1
Gui, Add, Text,, % Text
Gui, Show, NA
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: ToolTip использующий специфичный шрифт

В случае если Text — динамически изменяющаяся переменная:
– Перерисовка окна при каждом изменении позволяет получить авторазмер по содержимому, но присутствует «моргание».
– Использование GuiControl для изменения содержимого textbox'a позволяет избежать «моргания», но не изменяет автоматически размеры окна и control'а.

Есть ли алгоритм расчёта размера control'a для полного отображения текстового содержимого переменной?

4

Re: AHK: ToolTip использующий специфичный шрифт

Ну хорошо, а как ты собираешься избежать перерисовки, если даже будешь знать точные размеры? Их рассчитать можно, сначала создав скрытое окно и воспользовавшись GuiControlGet, OutputVar, Pos.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: ToolTip использующий специфичный шрифт

Расчёт на то, что изменение размера окна будет происходить значительно реже, чем обновление содержимого Text.
Вариант со скрытым окном приемлем, спасибо.

6

Re: AHK: ToolTip использующий специфичный шрифт

teadrinker пишет:

Их рассчитать можно, сначала создав скрытое окно и воспользовавшись GuiControlGet, OutputVar, Pos.

Ещё есть туева хуча api вроде GetTextExtentPoint32 и GetTextMetrics, которые вернут информацию на любой вкус [rus].

7

Re: AHK: ToolTip использующий специфичный шрифт

А, да, я про них знал, но уже забыл!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: ToolTip использующий специфичный шрифт

Попробовал — ни фига не вышло.
Вот этот код

Text = многострочный

Gui, ToolTipWindow:New, -Caption +ToolWindow +LastFound
Gui, ToolTipWindow:Default
Gui, Font, s24 cBlue, Verdana
Gui, Margin, 0, 0
Gui, Color, 0xFFFFE1
Gui, Add, Text,, % Text
Gui, Show, NA

WinGetPos,,, W, H
MsgBox, % "Ширина окна " W "`nВысота окна " H

и этот

String = многострочный

hDC := DllCall("GetDC", UInt, 0)

; Создаём шрифт Verdana s24
nHeight := -DllCall("MulDiv", Int, 24, Int
               , DllCall("GetDeviceCaps", Uint, hDC, Int, LOGPIXELSY := 90), Int, 72)
hFont := DllCall("CreateFont" . (A_IsUnicode ? "W" : "A")
                             , Int, nHeight, Int, 0
                             , Int, 0, Int, 0, Int, FW_NORMAL := 0x400
                             , Uint, 0, UInt, 0, UInt, 0, UInt, DEFAULT_CHARSET := 1
                             , UInt, OUT_DEFAULT_PRECIS := 0, UInt, CLIP_DEFAULT_PRECIS := 0
                             , UInt, DEFAULT_QUALITY := 0, UInt, 0, Str, "Verdana")

hPrevObj := DllCall("SelectObject", UInt, hDC, UInt, hFont)

VarSetCapacity(TEXTMETRIC, 53)
DllCall("GetTextMetrics" . (A_IsUnicode ? "W" : "A"), UInt, hDC, Ptr, &TEXTMETRIC)
if ! (NumGet(TEXTMETRIC, 51, "UChar")>>5)&1
{
   DllCall("SelectObject", UInt, hDC, UInt, hPrevObj)
   DllCall("ReleaseDC", UInt, 0, UInt, hDC)
   DllCall("DeleteObject", UInt, hFont)
   MsgBox, Шрифт не поддерживается системой
   Return
}

VarSetCapacity(SIZE, 8)
DllCall("GetTextExtentPoint32" . (A_IsUnicode ? "W" : "A"), UInt, hDC, Str, String, Int, StrLen(String), Ptr, &SIZE)

MsgBox, % "Ширина " . NumGet(SIZE, 0, "UInt") . "`nВысота " . NumGet(SIZE, 4, "UInt")

DllCall("SelectObject", UInt, hDC, UInt, hPrevObj)
DllCall("ReleaseDC", UInt, 0, UInt, hDC)
DllCall("DeleteObject", UInt, hFont)

дают разные значения ширины. В чём там ошибка?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: ToolTip использующий специфичный шрифт

teadrinker пишет:

В чём там ошибка?

FW_NORMAL неверно определён(должно быть 400 в десятичной системе).
И ещё косяк с GetTextMetrics. Под структуру TEXTMETRIC может быть выделено мало места. В юникоде нужно на 4 байта больше(там в структуре TCHAR'ы, а не CHAR'ы). Соответственно и условие за вызовом GetTextMetrics в юникоде будет некорректно работать.

10

Re: AHK: ToolTip использующий специфичный шрифт

А-а-а! Точно, спасибо.
Правильный код такой:

String = многострочный

hDC := DllCall("GetDC", UInt, 0)

; Создаём шрифт Verdana s24
nHeight := -DllCall("MulDiv", Int, 24, Int
               , DllCall("GetDeviceCaps", Uint, hDC, Int, LOGPIXELSY := 90), Int, 72)
hFont := DllCall("CreateFont" . (A_IsUnicode ? "W" : "A")
                             , Int, nHeight, Int, 0
                             , Int, 0, Int, 0, Int, FW_NORMAL := 400
                             , Uint, 0, UInt, 0, UInt, 0, UInt, DEFAULT_CHARSET := 1
                             , UInt, OUT_DEFAULT_PRECIS := 0, UInt, CLIP_DEFAULT_PRECIS := 0
                             , UInt, DEFAULT_QUALITY := 0, UInt, 0, Str, "Verdana")

hPrevObj := DllCall("SelectObject", UInt, hDC, UInt, hFont)

VarSetCapacity(TEXTMETRIC, A_IsUnicode ? 57 : 53)
DllCall("GetTextMetrics" . (A_IsUnicode ? "W" : "A"), UInt, hDC, Ptr, &TEXTMETRIC)
if ! (NumGet(TEXTMETRIC, A_IsUnicode ? 55 : 51, "UChar")>>5)&1
{
   MsgBox, Шрифт не поддерживается системой
   Gosub, FreeMemory
   Return
}

VarSetCapacity(SIZE, 8)
DllCall("GetTextExtentPoint32" . (A_IsUnicode ? "W" : "A"), UInt, hDC, Str, String, Int, StrLen(String), Ptr, &SIZE)

MsgBox, % "Ширина " . NumGet(SIZE, 0, "UInt") . "`nВысота " . NumGet(SIZE, 4, "UInt")

FreeMemory:
   DllCall("SelectObject", UInt, hDC, UInt, hPrevObj)
   DllCall("ReleaseDC", UInt, 0, UInt, hDC)
   DllCall("DeleteObject", UInt, hFont)
   Return

Теперь для многострочного попробую!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: ToolTip использующий специфичный шрифт

Хм, теперь элемент tmPitchAndFamily структуры TEXTMETRIC возвращает всё время одно и то же число, независимо от того, какой текст указан в lpszFace

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: ToolTip использующий специфичный шрифт

teadrinker пишет:

Хм, теперь элемент tmPitchAndFamily структуры TEXTMETRIC возвращает всё время одно и то же число, независимо от того, какой текст указан в lpszFace

Т.е. для "Comic Sans MS" и "Verdana" одно и то же?

13

Re: AHK: ToolTip использующий специфичный шрифт

Нет, для "Comic Sans MS" — 71, для "Verdana" — 39, но и для "123" тоже 39.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14 (изменено: Александр_, 2011-11-13 01:58:07)

Re: AHK: ToolTip использующий специфичный шрифт

teadrinker пишет:

Нет, для "Comic Sans MS" — 71, для "Verdana" — 39, но и для "123" тоже 39.

Наверно при некорректном названии функция ведёт себя как и при передаче нулевого адреса- выбирает шрифт подходящий под другие параметры. Проверить можно вызвав GetTextFace.
upd:

hFont := DllCall("CreateFont" . (A_IsUnicode ? "W" : "A")
                             , Int, nHeight, Int, 0
                             , Int, 0, Int, 0, Int, FW_NORMAL := 400
                             , Uint, 0, UInt, 0, UInt, 0, UInt, DEFAULT_CHARSET := 1
                             , UInt, OUT_DEFAULT_PRECIS := 0, UInt, CLIP_DEFAULT_PRECIS := 0
                             , UInt, DEFAULT_QUALITY := 0, UInt, 0, Str, "123")

hPrevObj := DllCall("SelectObject", UInt, hDC, UInt, hFont)

VarSetCapacity(FontName, 256)
DllCall("GetTextFace","uint",hDC,"uint",256,"uint",&FontName)
msgbox % StrGet(&FontName) ;%

У меня Arial выбирается. Собственно тут и вариантов-то было всего два- или функция вернёт 0, или выберет какой-то другой шрифт .

15

Re: AHK: ToolTip использующий специфичный шрифт

Спасибо! В итоге вот такое получилось:

String =
(
Многострочный
текст

Hello, World!
AHK forever!
)

if pResult := GetTextSize(String, "Arial", "s24 italic")
{
   w := NumGet(pResult+0, 0, "UInt")
   h := NumGet(pResult+0, 4, "UInt")
   MsgBox, % "Ширина " . w . "`nВысота " . h
}
Return

GetTextSize(String, FontName, Options)
{
   static SIZE
   coding := A_IsUnicode ? "W" : "A"
   LOGPIXELSY := 90
   FW_NORMAL := 400, FW_BOLD := 700
   DEFAULT_CHARSET := 1
   DEFAULT_QUALITY := OUT_DEFAULT_PRECIS := CLIP_DEFAULT_PRECIS := 0

   if !RegExMatch(Options, "i).*s(\d+).*", Found)
   {
      MsgBox, Не задан размер шрифта!
      Return
   }
   s := Found1

   if !InStr(Options, "bold")
   {
      if !RegExMatch(Options, "i).*w(\d+).*", Found)
         w := FW_NORMAL
      Else
         w := Found1
   }
   Else
      w := FW_BOLD
   if w not Between 1 and 1000
   {
      MsgBox, Неверно задан параметр w.`nДолжен быть в пределах от 1 до 1000
      Return
   }

   italic    := InStr(Options, "italic") > 0
   underline := InStr(Options, "underline") > 0
   strike    := InStr(Options, "strike") > 0

   hDC := DllCall("GetDC", UInt, 0)

   nHeight := -DllCall("MulDiv", Int, s
                  , Int, DllCall("GetDeviceCaps", UInt, hDC, Int, LOGPIXELSY), Int, 72)
   hFont := DllCall("CreateFont" . coding
                                , Int, nHeight, Int, 0
                                , Int, 0, Int, 0, Int, w
                                , UInt, italic, UInt, underline, UInt, strike
                                , UInt, DEFAULT_CHARSET, UInt, OUT_DEFAULT_PRECIS
                                , UInt, CLIP_DEFAULT_PRECIS, UInt, DEFAULT_QUALITY
                                , UInt, 0, Str, FontName)

   hPrevObj := DllCall("SelectObject", UInt, hDC, UInt, hFont)

   VarSetCapacity(Buf, 40)
   DllCall("GetTextFace" . coding, UInt, hDC, Int, 40, Str, Buf)
   if (Buf != FontName)
   {
      FreeMemory(hPrevObj, hDC, hFont)
      MsgBox, Указанный шрифт не поддерживается системой!
      Return
   }

   VarSetCapacity(SIZE, 8)
   width = 0
   Loop, parse, String, `n, `r
   {
      DllCall("GetTextExtentPoint32" . coding
         , UInt, hDC, Str, A_LoopField, Int, StrLen(A_LoopField), Ptr, &SIZE)
      width := (r := NumGet(SIZE, 0, "UInt")) > width ? r : width
      n := A_Index
   }
   h := NumGet(SIZE, 4, "UInt")
   NumPut(width, SIZE, "UInt"), NumPut(h*n, SIZE, 4, "UInt")
   FreeMemory(hPrevObj, hDC, hFont)
   Return &SIZE
}

FreeMemory(hPrevObj, hDC, hFont)
{
   DllCall("SelectObject", UInt, hDC, UInt, hPrevObj)
   DllCall("ReleaseDC", UInt, 0, UInt, hDC)
   DllCall("DeleteObject", UInt, hFont)
}

Проверяем:

Text =
(
Многострочный
текст

Hello, World!
AHK forever!
)

Gui, ToolTipWindow:New, -Caption +ToolWindow +LastFound
Gui, ToolTipWindow:Default
Gui, Font, s24 italic cBlue, Arial
Gui, Margin, 0, 0
Gui, Color, 0xFFFFE1
Gui, Add, Text,, % Text
Gui, Show, y100

WinGetPos,,, W, H
MsgBox, % "Ширина окна " W "`nВысота окна " H
ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: ToolTip использующий специфичный шрифт

teadrinker пишет:

Спасибо! В итоге вот такое получилось:

Спасибо аналогично, немного изменений и примеров:

1. Замена GetTextExtentPoint32 на DrawText

String =
(
Многострочный
текст
 
Hello, World!
AHK forever!
)
 
if pResult := GetTextSize(String, "Arial", "s24 italic")
{
   w := NumGet(pResult+8)
   h := NumGet(pResult+12)
   MsgBox, % "Ширина " . w . "`nВысота " . h
}
Return
 
GetTextSize(String, FontName, Options)
{
   static SIZE
   coding := A_IsUnicode ? "W" : "A"
   LOGPIXELSY := 90
   FW_NORMAL := 400, FW_BOLD := 700
   DEFAULT_CHARSET := 1
   DEFAULT_QUALITY := OUT_DEFAULT_PRECIS := CLIP_DEFAULT_PRECIS := 0
 
   if !RegExMatch(Options, "i).*s(\d+).*", Found)
   {
      MsgBox, Не задан размер шрифта!
      Return
   }
   s := Found1
 
   if !InStr(Options, "bold")
   {
      if !RegExMatch(Options, "i).*w(\d+).*", Found)
         w := FW_NORMAL
      Else
         w := Found1
   }
   Else
      w := FW_BOLD
   if w not Between 1 and 1000
   {
      MsgBox, Неверно задан параметр w.`nДолжен быть в пределах от 1 до 1000
      Return
   }
 
   italic    := InStr(Options, "italic") > 0
   underline := InStr(Options, "underline") > 0
   strike    := InStr(Options, "strike") > 0
 
   hDC := DllCall("GetDC", UInt, 0)
 
   nHeight := -DllCall("MulDiv", Int, s
                  , Int, DllCall("GetDeviceCaps", UInt, hDC, Int, LOGPIXELSY), Int, 72)
   hFont := DllCall("CreateFont" . coding
                                , Int, nHeight, Int, 0
                                , Int, 0, Int, 0, Int, w
                                , UInt, italic, UInt, underline, UInt, strike
                                , UInt, DEFAULT_CHARSET, UInt, OUT_DEFAULT_PRECIS
                                , UInt, CLIP_DEFAULT_PRECIS, UInt, DEFAULT_QUALITY
                                , UInt, 0, Str, FontName)
 
   hPrevObj := DllCall("SelectObject", UInt, hDC, UInt, hFont)
 
   VarSetCapacity(Buf, 40)
   DllCall("GetTextFace" . coding, UInt, hDC, Int, 40, Str, Buf)
   if (Buf != FontName)
   {
      FreeMemory(hPrevObj, hDC, hFont)
      MsgBox, Указанный шрифт не поддерживается системой!
      Return
   }
	
	VarSetCapacity(TextRect,16,0)
	DllCall("DrawText" . coding, UInt, hDC, Str, String, Int, StrLen(String), Ptr, &TextRect, UInt, DT_CALCRECT:=0x400)
	
    FreeMemory(hPrevObj, hDC, hFont)
	Return &TextRect
}
 
FreeMemory(hPrevObj, hDC, hFont)
{
   DllCall("SelectObject", UInt, hDC, UInt, hPrevObj)
   DllCall("ReleaseDC", UInt, 0, UInt, hDC)
   DllCall("DeleteObject", UInt, hFont)
}

2. ToolTip и WM_SETFONT пример 1

Text =
(
Многострочный
        текст
				
  Hello,World!
     AHK forever!
)

ToolTip,% Text
WinGet,httip,ID,% Text
; WinSet, Style,+0x40000,ahk_id %httip% ; добавим рамку изменения размера
if hFont:=CreateToolTipFont("Times New Roman","s20 bold italic")
SendMessage,0x30,hFont,1,,ahk_id %httip%
Return

Esc::
GuiClose:
DllCall("DeleteObject", UInt, hFont)
ExitApp

/*
WM_SETFONT = 0x30
WM_GETFONT = 0x31
*/

CreateToolTipFont(FontName,Options)
{
   coding := A_IsUnicode ? "W" : "A"   
   LOGPIXELSY := 90
   FW_NORMAL := 400, FW_BOLD := 700
   DEFAULT_CHARSET := 1
   DEFAULT_QUALITY := OUT_DEFAULT_PRECIS := CLIP_DEFAULT_PRECIS := 0
   
   if !RegExMatch(Options, "i).*s(\d+).*", Found)
   {
      MsgBox, Не задан размер шрифта!
      Return
   }
   s := Found1
 
   if !InStr(Options, "bold")
   {
      if !RegExMatch(Options, "i).*w(\d+).*", Found)
         w := FW_NORMAL
      Else
         w := Found1
   }
   Else
      w := FW_BOLD

   if w not Between 1 and 1000
   {
      MsgBox, Неверно задан параметр w.`nДолжен быть в пределах от 1 до 1000
      Return
   }

   italic    := InStr(Options, "italic") > 0
   underline := InStr(Options, "underline") > 0
   strike    := InStr(Options, "strike") > 0

   hDC := DllCall("GetDC", UInt, 0)

   nHeight := -DllCall("MulDiv", Int, s, Int, DllCall("GetDeviceCaps", UInt, hDC, Int, LOGPIXELSY), Int, 72)
   
   hFont := DllCall("CreateFont" . coding
                                , Int, nHeight, Int, 0
                                , Int, 0, Int, 0, Int, w
                                , UInt, italic, UInt, underline, UInt, strike
                                , UInt, DEFAULT_CHARSET, UInt, OUT_DEFAULT_PRECIS
                                , UInt, CLIP_DEFAULT_PRECIS, UInt, DEFAULT_QUALITY
                                , UInt, 0, Str, FontName)
 
   hPrevObj := DllCall("SelectObject", UInt, hDC, UInt, hFont)
	 
   VarSetCapacity(Buf, 40)
   DllCall("GetTextFace" . coding, UInt, hDC, Int, 40, Str, Buf)
   DllCall("SelectObject", UInt, hDC, UInt, hPrevObj)
   DllCall("ReleaseDC", UInt, 0, UInt, hDC)
   if (Buf != FontName)
   {
      MsgBox, Указанный шрифт не поддерживается системой!  
      DllCall("DeleteObject", UInt, hFont)
      Return
   }
   Return hFont
}

3. ToolTip и WM_SETFONT пример 2

Text =
(
Многострочный
        текст

  Hello,World!
    AHK forever!
)

Gui, Font, s20 bold italic, Times New Roman
Gui, Add,Text, HwndhStatic,% Text
SendMessage,0x31,,,,ahk_id %hStatic%
hFont:=ErrorLevel
ToolTip, % Text
WinGet,httip,ID,% Text
; WinSet, Style,+0x40000,ahk_id %httip% ; добавим рамку изменения размера
SendMessage,0x30,hFont,1,,ahk_id %httip%
Return

Esc::
GuiClose:
ExitApp

4.

string:="меняем размер контрола Static (Text) и наблюдаем за поведением текста"
Gui, + Lastfound +Resize -Caption
hgui:=WinExist()
Gui, Margin,0,0
Gui, Color, 0xFFFFE1
Gui, Font, s20 italic, Times New Roman
Gui, Add, Text, vText1 hwndhStatic, % string
Gui, Show
OnMessage(0x05,"WndProc")
OnMessage(0x47,"WndProc")
Return

WndProc(wParam,lParam,Msg,hWnd)
{
	global hgui,hStatic,hFont,wx,wy,ww,wh
	if (Msg=0x05)
	{
		hrgn:=DllCall("CreateRoundRectRgn","int",2,"int",2,"int",ww-1,"int",wh-1,"int",20,"int",20)
		DllCall("SetWindowRgn","uint",hgui,"uint",hrgn,"int",1)
	}
	else if (Msg=0x47)
	{
		wx:=NumGet(lParam+8),wy:=NumGet(lParam+12)
		ww:=NumGet(lParam+16),wh:=NumGet(lParam+20)
; 		ToolTip, % "ww " . ww . "wh " . wh
; 		GuiControl, Move, Text1, % "w" . ww-6 . " h" . wh-6
		DllCall("SetWindowPos","uint",hStatic,"uint",0,"int",0,"int",0,"int",ww-6,"int",wh-6,"uint",0x2|0x4|0x10|0x40)
		DllCall("InvalidateRect","uint",hStatic,"uint",0,"int",1)
	}
}

Esc::
GuiClose:
ExitApp

/*
WM_WINDOWPOSCHANGED = 0x47
WM_SIZE = 0x05

SWP_NOSIZE          0x0001
SWP_NOMOVE          0x0002
SWP_NOZORDER        0x0004
SWP_NOREDRAW        0x0008
SWP_NOACTIVATE      0x0010
SWP_FRAMECHANGED    0x0020  /* The frame changed: send WM_NCCALCSIZE */
SWP_SHOWWINDOW      0x0040
SWP_HIDEWINDOW      0x0080
SWP_NOCOPYBITS      0x0100
SWP_NOOWNERZORDER   0x0200  /* Don't do owner Z ordering */
SWP_NOSENDCHANGING  0x0400  /* Don't send WM_WINDOWPOSCHANGING */

HWND_TOP        ((HWND)0)
HWND_BOTTOM     ((HWND)1)
HWND_TOPMOST    ((HWND)-1)
HWND_NOTOPMOST  ((HWND)-2)
*/

17

Re: AHK: ToolTip использующий специфичный шрифт

ToolTip и WM_SETFONT пример 2  впечатлил.
А возможно ли определить id tooltip'а иным способом?
Если в text присутствует "ahk_class"  определение id работает не так как задумано.

18

Re: AHK: ToolTip использующий специфичный шрифт

creature.ws пишет:

А возможно ли определить id tooltip'а иным способом?

Возможно:

CoordMode, ToolTip, Screen
Gui, Test:New, Hwndhgui
Text:="1.Окно подсказки не разрушается если вызвать его c новым текстом его ID не изменится.`n   ID   до добавления текста    httip0 = "
ToolTip,% Text,500,600
WinGet,httip0,ID,% Text
Gui, Show, w320 h240
Text .=httip0+0 "`n2.Использовать GetWindow с параметром GW_HWNDFIRST, после вызыова ToolTip'a`n   ID после добавления текста httip1 = "
ToolTip,% Text ,500,600
httip1:=DllCall("GetWindow","uint",hgui,"uint",GW_HWNDFIRST:=0)
ToolTip,% Text httip1,500,600
ToolTip, _,500,680,2
httip2:=DllCall("GetWindow","uint",hgui,"uint",0)
ToolTip, % "Второй ToolTip и его ID " httip2,500,680,2
MsgBox % "hgui = " hgui+0 "`nhttip1 = " httip1 "`nhttip2 = " httip2

19

Re: AHK: ToolTip использующий специфичный шрифт

kirtech, отличные примеры! Только надо было указать в коде:

WM_GETFONT := 0x31
WM_SETFONT := 0x30
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: serzh82saratov, 2013-04-09 23:21:01)

Re: AHK: ToolTip использующий специфичный шрифт

Возможно-ли в ToolTip"е изменить цвет фона и цвет шрифта?
Например: синий фон и белый текст.

Взят за основу 3 пример kirtech из 16 поста.



#SingleInstance force   

Text =
(
Многострочный
        текст

  Hello,World!
    AHK forever!
)

Space::
    Gui, Color, Blue
    Gui, Font, s20 bold italic cWhite, Times New Roman
    DllCall("DestroyWindow", "Ptr", hStatic) 
    Gui, Add,Text, HwndhStatic,% Text
    SendMessage,0x31,,,,ahk_id %hStatic%
    hFont:=ErrorLevel
    ToolTip, % Text
    WinGet,httip,ID,% Text 
    SendMessage,0x30,hFont,1,,ahk_id %httip%
    Return

Esc::
    GuiClose:
    ExitApp

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: ToolTip использующий специфичный шрифт

Можно, но не в теме Аэро.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22

Re: AHK: ToolTip использующий специфичный шрифт

Ну и замечательно. А как?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: ToolTip использующий специфичный шрифт

#Persistent
hTooltip := TrackToolTip("Текст", "", "", "Заголовок", 1, 1, 0x004488, 0xFFFFFF)
return

TrackToolTip( sText
            , x = ""   ; если не указаны, то вблизи курсора
            , y = ""
            , sTitle = ""
            , h_icon = 0   ; h_icon — 0: None, 1:Info, 2: Warning, 3: Error, n > 3: предполагается hIcon
            , CloseButton = 0
            , nColorBack = 0xFFFFE1
            , nColorText = 0
            , BallonTip = 0   ; BalloonTip — это ToolTip с хвостиком
            , w = 400)  ; максимальная ширина
{
   TTS_NOPREFIX := 2, TTS_ALWAYSTIP := 1, TTS_BALLOON := 0x40, TTS_CLOSE := 0x80

   hWnd := DllCall("CreateWindowEx", UInt, WS_EX_TOPMOST := 8
                                   , Str, "tooltips_class32", Str, ""
                                   , UInt, TTS_NOPREFIX|TTS_ALWAYSTIP|(CloseButton ? TTS_CLOSE : 0)|(BallonTip ? TTS_BALLOON : 0)
                                   , Int, 0, Int, 0, Int, 0, Int, 0
                                   , Ptr, 0, Ptr, 0, Ptr, 0, Ptr, 0)

   if (x = "" || y = "")
   {
      CoordMode, Mouse
      MouseGetPos, xtt, ytt
      xtt := x = "" ? xtt + 10 : x
      ytt := y = "" ? ytt + 10 : y
   }
   Else
      xtt := x, ytt := y

   NumPut(VarSetCapacity(TOOLINFO, A_PtrSize = 4 ? 48 : 72, 0), TOOLINFO, "UInt")
   NumPut(0x20, TOOLINFO, 4, "UInt")      ; TTF_TRACK = 0x20
   NumPut(&sText, TOOLINFO, A_PtrSize = 4 ? 36 : 48, "UInt")

   DHW := A_DetectHiddenWindows
   DetectHiddenWindows, On
   WinWait, ahk_id %hWnd%

   WM_USER := 0x400
   SendMessage, WM_USER + 24,, w         ; TTM_SETMAXTIPWIDTH
   SendMessage, WM_USER + (A_IsUnicode ? 50 : 4),, &TOOLINFO   ; TTM_ADDTOOL
   SendMessage, WM_USER + 19, RGB_to_BGR(nColorBack)   ; TTM_SETTIPBKCOLOR
   SendMessage, WM_USER + 20, RGB_to_BGR(nColorText)   ; TTM_SETTIPTEXTCOLOR
   SendMessage, WM_USER + (A_IsUnicode ? 33 : 32), h_icon, &sTitle      ; TTM_SETTITLEA и TTM_SETTITLEW
   SendMessage, WM_USER + (A_IsUnicode ? 57 : 12),, &TOOLINFO     ; TTM_UPDATETIPTEXTA и TTM_UPDATETIPTEXTW
   SendMessage, WM_USER + 18,, xtt|(ytt<<16)   ; TTM_TRACKPOSITION
   SendMessage, WM_USER + 17, 1, &TOOLINFO ; TTM_TRACKACTIVATE

   if BallonTip
      xMax := A_ScreenWidth, yMax := A_ScreenHeight
   else
   {
      WinGetPos,,, W, H
      xMax := A_ScreenWidth - W - 10
      yMax := A_ScreenHeight - H - 10
   }
   
   if (xtt > xMax || ytt > yMax)
   {
      WinHide
      xtt := xtt > xMax ? xMax : xtt
      ytt := ytt > yMax ? yMax : ytt
      SendMessage, 1042,, xtt|(ytt<<16)   ; TTM_TRACKPOSITION
      WinShow
   }

   DetectHiddenWindows, % DHW
   Return hWnd
}

RGB_to_BGR(RGB)
{
   CurrentFormat := A_FormatInteger
   SetFormat, IntegerFast, H
   C := SubStr("0x000000", 1, -(StrLen(RGB+0) - 2)) . SubStr(RGB+0, 3)
   BGR := RegExReplace(C, "0x(..)(..)(..)", "0x$3$2$1")
   SetFormat, IntegerFast, %CurrentFormat%
   Return BGR
}

У меня изменение цветов работает только в теме "Классика".

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: ToolTip использующий специфичный шрифт

Ок. Работает.
А в Аэро это совсем невозможно? Или просто того нестоит.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui