1 (изменено: serzh82saratov, 2013-05-07 07:44:49)

Тема: AHK: Отображение текста на полупрозрачном фоне

Какие есть "нормальные" варианты отображения непрозрачного текста на полупрозрачном фоне?



Text := "Transparent`n`nTransColor"

Gui +LastFound -0x400000 +E0x08000000 +AlwaysOnTop 
Gui Font, s22
Gui Add, Text, cYellow xm ym, % Text 
Gui Color, 696969
WinSet Transparent, 150

Gui 2: +LastFound -0x400000 +E0x08000000 +AlwaysOnTop 
Gui 2:Color, 696969
Gui 2: Font, s22
Gui 2:Add, Text, cYellow xm ym, % Text 
WinSet TransColor, 696969 

Gui Show, NA
Gui 2:Show, NA
Return

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

2

Re: AHK: Отображение текста на полупрозрачном фоне

Разве что - убрать прозрачный текст

#Singleinstance force

Text := "Transparent`n`nTransColor"

Gui 1:+LastFound -0x400000 +E0x08000000 +AlwaysOnTop hwndG1
Gui 1:Font, s12
Gui 1:Color, 696969
WinSet Transparent, 150

Gui 2: +LastFound -0x400000 +E0x08000000 +AlwaysOnTop hwndG2
Gui 2:Color, 696969
Gui 2: Font, s22
Gui 2:Add, Text, cYellow xm ym, % Text 
WinSet TransColor, 696969 

Gui 1:Show, NA
Gui 2:Show, NA

WinGetPos, X, Y, Width, Height, ahk_ID %G2%
WinMove, ahk_ID %G1%,, X, Y , Width, Height
Return

Esc:: 
    ExitApp

Пользуюсь скриптом который перетягивает окна за любую их часть - так он перетягивает эти два Gui отдельно (((. Очевидно надо проверять положение одного и соответственно изменять положение другого. Или таймер или отслеживание сообщений?

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

3

Re: AHK: Отображение текста на полупрозрачном фоне

Разве что - убрать прозрачный текст

Зачем если его не видно. Если он как то мешает, то можно просто добавить в его опции hidden.
Заменять встроенный метод авто разметки окна на WinGetPos и WinMove - это непонятно зачем нужное усложнение кода.

Пользуюсь скриптом который перетягивает окна за любую их часть - так он перетягивает эти два Gui отдельно

Само собой это-же 2 окна (КО)

Очевидно надо проверять положение одного и соответственно изменять положение другого. Или таймер или отслеживание сообщений?

Такой задачи не стоит.

з.ы.
Потому и вопрос про - "нормальные" варианты. И шрифт плохо выглядит по краям.
Тут видимо необходима gdip, да кто бы в ней разбирался...

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

4

Re: AHK: Отображение текста на полупрозрачном фоне

Нет простого способа сделать полупрозрачным только фон окна. То же самое пишут на англоязычном форуме (искал по словам transparent background)

5

Re: AHK: Отображение текста на полупрозрачном фоне

ypppu
Печалька.

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

6

Re: AHK: Отображение текста на полупрозрачном фоне

Попробуйте копнуть в сторону фона-картинки типа png, gif, ico. Вроде они поддерживают частичную прозрачность.
P. S.: Видимо, когда появилась AutoHotkey, прозрачность была не в моде.

7

Re: AHK: Отображение текста на полупрозрачном фоне

в сторону фона-картинки типа png, gif, ico. Вроде они поддерживают частичную прозрачность.

Безуспешный поиск такого решения уже был в этой теме.

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

8

Re: AHK: Отображение текста на полупрозрачном фоне

А, может как-то через SendMessage можно задать прозрачность конкретному контролу?

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

9 (изменено: ypppu, 2013-05-11 13:21:26)

Re: AHK: Отображение текста на полупрозрачном фоне

serzh82saratov пишет:

в сторону фона-картинки типа png, gif, ico. Вроде они поддерживают частичную прозрачность.

Безуспешный поиск такого решения уже был в этой теме.

Точняк.


Тогда можно попробовать так.
Используем

+ этот код,

   If !pToken := Gdip_Startup()
   {
      MsgBox, 48, Ошибка GDI+, Убедитесь в наличии gdiplus.dll в вашей системе!
      ExitApp
   }

   OnExit, Exit
   SetBatchLines, -1
   SetWinDelay, 0


   Width = 500
   Height = 250       ; размеры картинки

   H2 := Height//2, W2 := Width//2
   X := (A_ScreenWidth-Width)//2
   Y := (A_ScreenHeight-Height)//2


   Gui, -Caption +E0x80000 +LastFound +ToolWindow +AlwaysOnTop  ; WS_EX_LAYERED := 0x80000
   WinGet, ID
   Gui, Show
   OnMessage(0x201, "WM_LBUTTONDOWN")
   OnMessage(0x003, "WM_MOVE")
   DllCall("Winmm\timeBeginPeriod", UInt, 3)

   hbm := CreateDIBSection(Width, Height)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_SetSmoothingMode(G, 4)

   pFillBrush := Gdip_BrushCreateSolid(0x66FFFF00)
   Gdip_FillRectangle(G, pFillBrush, 0, 0, Width, Height)
   Gdip_DeleteBrush(pFrameBrush)

   UpdateLayeredWindow(ID, hdc, X, Y, Width, Height)
Return


GuiClose:
GuiEscape:
   ExitApp

Exit:
   Gdip_DeletePen(pGrayPen), Gdip_DeletePen(pBluePen), Gdip_DeleteBrush(pFillBrush)
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Gdip_Shutdown(pToken)
   DllCall("Winmm\timeEndPeriod", UInt, 3)
   ExitApp

WM_LBUTTONDOWN()
{
   PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
}

WM_MOVE(wp, lp)
{
   global X, Y
   X := lp & 0xFFFF, Y := lp >> 16
}

чтобы создать специальное окно и нарисовать в нём полупрозрачный прямоугольник. Затем открываем файл Gdip.ahk и переводим главу
;###############
; Text functions
;###############

Далее рисуем поверх прямоугольника нужный текст непрозрачной кистью.


P. S.: Ещё раз благодарю teadrinker за разобранный пример.

10

Re: AHK: Отображение текста на полупрозрачном фоне

Далее рисуем поверх прямоугольника нужный текст непрозрачной кистью.

Пример известный. А по счёт текста ничего ясно.

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

11

Re: AHK: Отображение текста на полупрозрачном фоне

Ну так я же говорю, нужно переводить и разбираться.

1. Открываем файл Gdip.ahk в Блокноте и подыскиваем подходящую для наших целей функцию в разделе Text functions. Похоже, Gdip_DrawString - то, что нужно.

2. Далее можно открывать словарь и изучать функцию... Или сразу поискать готовый пример применения (см. ссылку в моей подписи).

3. По третьему результату поиска, обнаруживаем на немецком подфоруме

+ прекрасный пример
;basiert auf tics Beispiel#SingleInstance, Force
#NoEnv
SetBatchLines, -1


If !pToken := Gdip_Startup()
{
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}
OnExit, Exit

Width := 300, Height := 200

Gui, 1:  -Caption +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop
Gui, 1: Show, NA

hwnd1 := WinExist()

hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)

G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4)

pBrush := Gdip_CreateLineBrush(0, 0, Width, Height, 0xFF000000, 0xaa0000FF)

Gdip_FillRoundedRectangle(G, pBrush, 0, 0, Width, Height, 20)
Gdip_DeleteBrush(pBrush)

Font := "Arial"

If !hFamily := Gdip_FontFamilyCreate(Font)
{
   MsgBox, 48, Font error!, The font you have specified does not exist on the system
   ExitApp
}

pBrush2 := Gdip_CreateLineBrush(0, 0, 200, 100, 0xFFFF0000, 0xFF00FF00)
hFont := Gdip_FontCreate(hFamily, 20, "Regular")
hFormat := Gdip_StringFormatCreate(0x4000)
CreateRectF(RectF, 10, 30, 200, 100)

Gdip_SetSmoothingMode(G, 4)
Gdip_SetTextRenderingHint(G, 4)

Gdip_DrawString(G, "Tutorial 8`n`nThank you for trying this example", hFont, hFormat, pBrush2, RectF)

UpdateLayeredWindow(hwnd1, hdc, (A_ScreenWidth-Width)//2, (A_ScreenHeight-Height)//2, Width, Height)

OnMessage(0x201, "WM_LBUTTONDOWN")


; Delete resources
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(G)
Return

;#######################################################################

; This function is called every time the user clicks on the gui
; The PostMessage will act on the last found window (this being the gui that launched the subroutine, hence the last parameter not being needed)
WM_LBUTTONDOWN()
{
   PostMessage, 0xA1, 2
}

;#######################################################################

Exit:
; gdi+ may now be shutdown on exiting the program
Gdip_Shutdown(pToken)
ExitApp
Return

4. Убедившись, что эта функция позволяет достигнуть поставленную цель, изучаем её детально.

5. А если хотите помочь коллегам-скриптописателям, выложите перевод / описание функции в соответствующей теме.

12

Re: AHK: Отображение текста на полупрозрачном фоне

Спасибо! Действительно отличный пример.
Курить придётся долго

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

13

Re: AHK: Отображение текста на полупрозрачном фоне

Разобрался в примере:



 ; Example 8: Gdip.Tutorial.8-Write.text.onto.a.gui.ahk    http://www.autohotkey.net/~tic/Gdip.Tutorial.8-Write.text.onto.a.gui.ahk 

#SingleInstance Force 
SetBatchLines -1 


If !pToken := Gdip_Startup()   {
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}

OnExit, Exit
OnMessage(0x201, "WM_LBUTTONDOWN")
 
Width := 400, Height := 250
BackTrans = ba
BackColor = 2943AF
Font = Arial 
FontSize = 42
FontColor = ffffff
Text = Tutorial 8`nThank you for trying this example 

Options = x10p y10p w80p Centre cff%FontColor% r4 s%FontSize% Italic 
 
Gui, +HWNDhGui -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs -DPIScale
Gui, Show, NA 
 
hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC() 
obm := SelectObject(hdc, hbm), G := Gdip_GraphicsFromHDC(hdc), Gdip_SetSmoothingMode(G, 4) 
pBrush := Gdip_BrushCreateSolid("0x" BackTrans BackColor) 
Gdip_FillRoundedRectangle(G, pBrush, 0, 0, Width, Height, 10) 
Gdip_DeleteBrush(pBrush) 

If !Gdip_FontFamilyCreate(Font)   {
   MsgBox, 48, Font error!, The font you have specified does not exist on the system
   ExitApp
} 
  
Gdip_TextToGraphics(G, Text, Options, Font, Width, Height) 

UpdateLayeredWindow(hGui, hdc, (A_ScreenWidth-Width)//2, (A_ScreenHeight-Height)//2, Width, Height)
 
SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
Return 

WM_LBUTTONDOWN()   {
   PostMessage, 0xA1, 2
}
 

Esc::
Exit: 
GuiClose:
GuiEscape:
    Gdip_Shutdown(pToken)
    ExitApp

Теперь такой вопрос: тут заранее указывается размер окну. А как можно сделать размер окна в зависимости от содержимого текста, по аналогии с этим:

 
#SingleInstance Force 

Text1 = Tutorial 8`nThank you for trying this example 
Text2 = 000`n0`n0`n0`n0`n0`n0`n0`n000 
Text3 = ``
FontSize = 28
I = 0

Gui, +AlwaysOnTop +ToolWindow -Caption +DPIScale 
Gui, Color, 2943AF
Gui, Font, s%FontSize% cffffff Italic, Times New Roman 
    
Loop    { 
    DllCall("DestroyWindow", "Ptr", hText), I := ++I > 3 ? 1 : I
    Gui, Add, Text, % "Center hwndhText x" FontSize " y" FontSize / 2, % Text%I%
    Gui, Show, AutoSize Center
    Sleep 1111 
}

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

14

Re: AHK: Отображение текста на полупрозрачном фоне

А как можно сделать размер окна в зависимости от содержимого текста

Код определяет размер текста и его координаты:

pToken := Gdip_Startup()
hdc := CreateCompatibleDC() 
G := Gdip_GraphicsFromHDC(hdc)

Text = Tutorial 8`nThank you for trying this example
Font = Arial 
FontSize = 42
Options = x10p y10p w80p Centre s%FontSize% Italic 

MsgBox, % Gdip_TextToGraphics(G, Text, Options, Font, 1000, 1000) ; 1000 — с запасом, x|y|w|h|кол-во символов|кол-во строк
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Отображение текста на полупрозрачном фоне

teadrinker
О, спасибо! И так и эдак покрутил. Что в итоге к полученной ширине и высоте прибавлять никак не пойму, не подскажешь?


Text = Tutorial 8`nThank you for trying this example
Font = Arial 
FontSize = 42
BackTrans = ba
BackColor = 2943AF 
FontColor = ffffff 
Options = x10p y10p w80p Centre s%FontSize% Italic     
    
If !pToken := Gdip_Startup()   {
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}

hdc := CreateCompatibleDC() 
G := Gdip_GraphicsFromHDC(hdc)

 
Data := Gdip_TextToGraphics(G, Text, Options, Font, 3000, 3000) ; 1000 — с запасом, x|y|w|h|кол-во символов|кол-во строк
StringSplit, Arr, Data, |  
 
Width := Arr3, Height := Arr4 
  
Gui, +HWNDhGui -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs -DPIScale
Gui, Show, NA 
 
hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC() 
obm := SelectObject(hdc, hbm), G := Gdip_GraphicsFromHDC(hdc), Gdip_SetSmoothingMode(G, 4) 
pBrush := Gdip_BrushCreateSolid("0x" BackTrans BackColor) 
Gdip_FillRoundedRectangle(G, pBrush, 0, 0, Width, Height, 10) 
Gdip_DeleteBrush(pBrush) 

If !Gdip_FontFamilyCreate(Font)   {
   MsgBox, 48, Font error!, The font you have specified does not exist on the system
   ExitApp
} 

Gdip_TextToGraphics(G, Text, Options, Font, Width, Height) 

UpdateLayeredWindow(hGui, hdc, (A_ScreenWidth-Width)//2, (A_ScreenHeight-Height)//2, Width, Height)
 
SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
Return 

Ещё не до конца понимаю, что в Options значат - x10p y10p w80p?

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

16

Re: AHK: Отображение текста на полупрозрачном фоне

Ещё не до конца понимаю, что в Options значат - x10p y10p w80p?

Возможно, в этом и есть твоя проблема. x10p означает, что текст расположен на десяти процентах общей длины от начала, т. е. это относительный способ задания положения. Можно и без "p" как обычно — x10 — 10 пикселей от края.

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

17

Re: AHK: Отображение текста на полупрозрачном фоне

А w80p - что значит?

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

18

Re: AHK: Отображение текста на полупрозрачном фоне

Точно не знаю, но думаю, что максимальная ширина текста от общей ширины окна в процентах.

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

19

Re: AHK: Отображение текста на полупрозрачном фоне

teadrinker
Спасибо за ответы, буду думать.

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

20

Re: AHK: Отображение текста на полупрозрачном фоне

А, вспомнил, можно узнать просто ширину и высоту текста:

pToken := Gdip_Startup()
hdc := CreateCompatibleDC() 
G := Gdip_GraphicsFromHDC(hdc)

Text = Tutorial 8`nThank you for trying this example
MsgBox, % Gdip_TextToGraphics(G, Text, "s42 Italic", "Arial") ; x|y|w|h|кол-во символов|кол-во строк
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Отображение текста на полупрозрачном фоне

Оно самое:


If !pToken := Gdip_Startup()   {
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}
 
xMargin = 0
yMargin = 30
BackTrans = ba
BackColor = 2943AF
ThisFont = Arial 
Font = s62 Italic
FontColor = ffffff
Text = Tutorial 8`nThank you for trying this example 

 
hdc := CreateCompatibleDC() 
G := Gdip_GraphicsFromHDC(hdc) 
Data := Gdip_TextToGraphics(G, Text, Font, ThisFont) ; x|y|w|h|кол-во символов|кол-во строк
DeleteDC(hdc), Gdip_DeleteGraphics(G)
 
StringSplit, Arr, Data, |  
Width := Ceil(Arr3) + xMargin * 2, Height := Ceil(Arr4) + yMargin * 2
Options = x%xMargin% y%yMargin% Centre cff%FontColor% r4 %Font%
 
Gui, +HWNDhGui -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs -DPIScale
Gui, Show, NA 
 
hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC() 
obm := SelectObject(hdc, hbm), G := Gdip_GraphicsFromHDC(hdc), Gdip_SetSmoothingMode(G, 4) 
pBrush := Gdip_BrushCreateSolid("0x" BackTrans BackColor) 
Gdip_FillRoundedRectangle(G, pBrush, 0, 0, Width, Height, 10) 
Gdip_DeleteBrush(pBrush) 

If !Gdip_FontFamilyCreate(ThisFont)   {
   MsgBox, 48, Font error!, The font you have specified does not exist on the system
   ExitApp
} 
  
Gdip_TextToGraphics(G, Text, Options, ThisFont, Width, Height) 

UpdateLayeredWindow(hGui, hdc, (A_ScreenWidth-Width)//2, (A_ScreenHeight-Height)//2, Width, Height)
 
SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
Return 

Вот только мистика, если xMargin больше 0. Текст почему то явно стремится к правому краю а не к центру, как того хотелось.

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

22

Re: AHK: Отображение текста на полупрозрачном фоне

А вот если убрать из опций Centre, то тогда сам текст уже распологается на равных расстояниях от краёв окна...

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