Что нового

Надпись текстом поверх окна с привязкой

QQruza

Новичок
Сообщения
26
Репутация
0

pics.vsego.ru

Версия AutoIt: 3.3.8.1
Описание: Требуется выводить надписи текстом нужного размера, нужного цвета в нужном месте поверх нужного окна с привязкой к положению окна, т.е. перетащили окно, а за ним наша надпись.
Примечания: Пример как должно быть на картинке. Если можно вообще по вышке сделать, чтобы текст можно было перетаскивать в пределах окна нажав на него правой кнопкой мыши. И запоминал бы в файле это положение для этого окна.
Можно было менять не только цвет шрифта, но и цвет и прозрачность фона.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
На основе примера из справки к функции _WinAPI_CreateFont()
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>

Global $tRECT, $hFont, $hOldFont, $hDC, $hWnd

HotKeySet("{ESC}", "_Exit")

$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left",   500) ; <= Координаты
DllStructSetData($tRECT, "Top",    100) ; <= относительно
DllStructSetData($tRECT, "Right",  900) ; <= левого верхнего
DllStructSetData($tRECT, "Bottom", 200) ; <= угла нужного окна

$hWnd = WinGetHandle("[class:SciTEWindow]") ; <= Нужное окно

While 1
  $hDC = _WinAPI_GetWindowDC($hWnd)
  $hFont = _WinAPI_CreateFont(32, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _ ; <= Атрибуты
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')     ; <= текста
  $hOldFont = _WinAPI_SelectObject($hDC, $hFont)
  _WinAPI_SetTextColor($hDC, 0x0000FF)  ; <= Цвет текста
  _WinAPI_SetBkColor($hDC, 0x000000)    ; <= Цвет фона
  _WinAPI_SetBkMode($hDC, $TRANSPARENT) ; <= Прозрачный фон
  _WinAPI_DrawText($hDC, "Вот бы тут такой текст забабахать с привязкой к положению окна", $tRECT, $DT_WORDBREAK) ; <= Сам текст и методы форматирования
  _WinAPI_SelectObject($hDC, $hOldFont)
  _WinAPI_DeleteObject($hFont)
  _WinAPI_ReleaseDC(0, $hDC)
  Sleep(10)
WEnd

Func _Exit()
  _WinAPI_InvalidateRect(0)
  $tRECT = 0
  Exit
EndFunc   ;==>_Exit
 
Автор
Q

QQruza

Новичок
Сообщения
26
Репутация
0
InnI, при перемещении окна происходит вот что, и надпись после нескольких запусков потеряла привязку к окну (или сразу так было), как убирать прозрачность не разобрался


pics.vsego.ru
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
QQruza [?]
при перемещении окна происходит вот что
Это из-за того, что окно не найдено и текст рисуется на рабочем столе. А произошло это потому, что вы изменили строку
Код:
$hWnd = WinGetHandle("[class:SciTEWindow]") ; <= Нужное окно
и вместо класса окна вписали класс контрола.
как убирать прозрачность
Закомментировать строку
Код:
_WinAPI_SetBkMode($hDC, $TRANSPARENT) ; <= Прозрачный фон
 
Автор
Q

QQruza

Новичок
Сообщения
26
Репутация
0
InnI, спасибо, все работает, только когда выключаю прозрачность фона, текст помаргивает. Вопрос, можно ли в код встроить, чтобы можно в реальном времени менять положение текста по клавишам?
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
QQruza [?]
текст помаргивает
Я не знаю, как это исправить.
менять положение текста по клавишам
Клавиши Win+Alt+[Up, Down, Left, Right] сдвигают текст на $Step пикселей. Выход за границы окна не проверяется.
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>

Global $tRECT, $hFont, $hOldFont, $hDC, $hWnd

HotKeySet("{ESC}", "_Exit")
HotKeySet("#!{LEFT}", "MoveText")
HotKeySet("#!{RIGHT}", "MoveText")
HotKeySet("#!{UP}", "MoveText")
HotKeySet("#!{DOWN}", "MoveText")

$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left",   500) ; <= Координаты
DllStructSetData($tRECT, "Top",    100) ; <= относительно
DllStructSetData($tRECT, "Right",  900) ; <= левого верхнего
DllStructSetData($tRECT, "Bottom", 200) ; <= угла нужного окна

$Step = 10 ; <= Смещение в пикселях
$hWnd = WinGetHandle("[class:SciTEWindow]") ; <= Нужное окно

While 1
  $hDC = _WinAPI_GetWindowDC($hWnd)
  $hFont = _WinAPI_CreateFont(32, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _ ; <= Атрибуты
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')     ; <= текста
  $hOldFont = _WinAPI_SelectObject($hDC, $hFont)
  _WinAPI_SetTextColor($hDC, 0x0000FF)  ; <= Цвет текста
  _WinAPI_SetBkColor($hDC, 0x000000)    ; <= Цвет фона
  _WinAPI_SetBkMode($hDC, $TRANSPARENT) ; <= Прозрачный фон
  _WinAPI_DrawText($hDC, "Вот бы тут такой текст забабахать с привязкой к положению окна", $tRECT, $DT_WORDBREAK) ; <= Сам текст и методы форматирования
  _WinAPI_SelectObject($hDC, $hOldFont)
  _WinAPI_DeleteObject($hFont)
  _WinAPI_ReleaseDC(0, $hDC)
  Sleep(10)
WEnd

Func _Exit()
  _WinAPI_InvalidateRect(0)
  $tRECT = 0
  Exit
EndFunc   ;==>_Exit

Func MoveText()
  Switch @HotKeyPressed
    Case "#!{LEFT}"
      DllStructSetData($tRECT, "Left", DllStructGetData($tRECT, "Left") - $Step)
      DllStructSetData($tRECT, "Right", DllStructGetData($tRECT, "Right") - $Step)
    Case "#!{RIGHT}"
      DllStructSetData($tRECT, "Left", DllStructGetData($tRECT, "Left") + $Step)
      DllStructSetData($tRECT, "Right", DllStructGetData($tRECT, "Right") + $Step)
    Case "#!{UP}"
      DllStructSetData($tRECT, "Top", DllStructGetData($tRECT, "Top") - $Step)
      DllStructSetData($tRECT, "Bottom", DllStructGetData($tRECT, "Bottom") - $Step)
    Case "#!{DOWN}"
      DllStructSetData($tRECT, "Top", DllStructGetData($tRECT, "Top") + $Step)
      DllStructSetData($tRECT, "Bottom", DllStructGetData($tRECT, "Bottom") + $Step)
  EndSwitch
  _WinAPI_InvalidateRect(0)
EndFunc
 
Верх