Что нового

[Элементы GUI] Текст на экран 3D приложения

lirikmel

Продвинутый
Сообщения
225
Репутация
84
как можно это сделать ? ..._WinAPI_DrawText постоянно "моргает" например в этом коде
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>

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

Global $hWnd = WinGetHandle("3D окно", "")
HotKeySet("{ESC}", "_Exit")

$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 150)
DllStructSetData($tRECT, "Top", 100)
DllStructSetData($tRECT, "Right", 20)
DllStructSetData($tRECT, "Bottom", 500)

$hDC = _WinAPI_GetDC($hWnd)
$hFont = _WinAPI_CreateFont(30, 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)
; comment next line to get black background instead of transparent one
_WinAPI_SetBkMode($hDC, $TRANSPARENT)

While 1
    _WinAPI_DrawText($hDC, "Hello world!", $tRECT, $DT_CENTER)
 WEnd

Func _Exit()
    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_InvalidateRect(0, 0)
    $tRECT = 0
    Exit
EndFunc


может есть еще варианты ?
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Окный режим и через winmove идеальное выравнивание => не моргает. =)
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Для игры league of legends я выставлял разрешение 1920*1080 и запускал в оконном режиме.
В Windows стоит разрешение 1920*1080.
Код:
WinMove("League of Legends (TM) Client", "", -3, -28) ; этой командой окно встает по центру и скрывается шапка окна

Получилось, что от оконный режим не отличить от полно экранного + поверх игры можно вешать любые GUI, Tooltip и т.д.
 
Автор
L

lirikmel

Продвинутый
Сообщения
225
Репутация
84
странно у меня все равно...моргает -(..может еть какие то варианты "заморозить" строку на экране ..?
 

komorov74

Новичок
Сообщения
81
Репутация
0
Подтверждаю полная фигня -все мигает и пропадает. конкретно игра WOT
 

KOWER

Новичок
Сообщения
4
Репутация
0
lirikmel сказал(а):
как можно это сделать ? ..._WinAPI_DrawText постоянно "моргает" например в этом коде
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>

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

Global $hWnd = WinGetHandle("3D окно", "")
HotKeySet("{ESC}", "_Exit")

$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 150)
DllStructSetData($tRECT, "Top", 100)
DllStructSetData($tRECT, "Right", 20)
DllStructSetData($tRECT, "Bottom", 500)

$hDC = _WinAPI_GetDC($hWnd)
$hFont = _WinAPI_CreateFont(30, 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)
; comment next line to get black background instead of transparent one
_WinAPI_SetBkMode($hDC, $TRANSPARENT)

While 1
    _WinAPI_DrawText($hDC, "Hello world!", $tRECT, $DT_CENTER)
 WEnd

Func _Exit()
    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_InvalidateRect(0, 0)
    $tRECT = 0
    Exit
EndFunc


может есть еще варианты ?
Спасибо за Код давно искал!
 

ivanius

Знающий
Сообщения
74
Репутация
5
Если будет моргать использовать буферизацию нужно, что это такое и как реализовать полный интернет.
 

KOWER

Новичок
Сообщения
4
Репутация
0
Ну ты скажи как вроде весь интерне порыл ничего не нашол!
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
ivanius [?]
Если будет моргать использовать буферизацию нужно, что это такое и как реализовать полный интернет.
Что за бред?

1) Синхронная запись ( перехватив вызовы необходимых функций DirectX в целевом процессе ).
2) Прямой доступ к видео-памяти ( более неактуально ).
3) Сложнейшие манипуляции с драйвером дисплея.
4) Topmost window.
5) Desktop-DirectX-Overlay. Ограничение - 1 подобный оверлей на все приложения.

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

ivanius

Знающий
Сообщения
74
Репутация
5
я говорил о 4) Topmost window.
там если часто перерисовывать - будут моргания, как и в любом из этих вариантах наверное , поэтому нужно исползовать двойной буфер т.е.
Двойная буферизация — в информатике метод подготовки данных, обеспечивающий возможность отдачи готового результата, без прерывания процесса подготовки следующего результата.
Основные области применения двойной буферизации:
отрисовка содержимого экрана

читай там все описано:

https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
 
Верх