PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как правильно вывести текст и удалить с экрана?


Как правильно вывести текст и удалить с экрана?

Сообщений 1 страница 15 из 15

1

Предложение нужно выводить посимвольно (и любой символ в нем может иметь свой отдельный цвет). Как обычно, я не знаю, как это сделать грамотно и грамотно стереть его потом. 

Код:
Dim pp$(2)
OpenWindow(0, 0, 0, 900, 400, "Мельтешение на экране после десятка нажатий на ПРОБЕЛ", #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
SetWindowColor(0, 0) 
pp$(0)="I will not go to school, because I'm too little YET78.I will not go to school, because it's funny, hahahaha."
pp$(1)="dfs.lkdfljalkcn,nla a;ka;lskja; ;sk;al dp;og;dflk;flnk["
pp$(2)="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt"

TextGadget(1,  0, 200, 900, 25, Space(1500)):SetGadgetColor(1,#PB_Gadget_FrontColor,#White):SetGadgetColor(1,#PB_Gadget_BackColor,#Black)
Repeat
  Event = WaitWindowEvent()
    LL=Len(pp$(i))
  While z<LL
    z+1
    s3=TextGadget(#PB_Any,  (z)*7, 200, 7, 25, Mid(pp$(i),z,1)) :SetGadgetColor(s3,#PB_Gadget_FrontColor,#White):SetGadgetColor(s3,#PB_Gadget_BackColor,#Black)
  Wend 
  v=GetAsyncKeyState_(32) ; для смены предложения нажимаем ПРОБЕЛ
  If v>0 And v<>1 And v<>32768 And v<>-32768
    z=0
    If i<2
      i+1
     Else 
      i=0
    EndIf 
    SetGadgetText(1,  Space(900)) ; типа, затираю
 EndIf
Until Event = #PB_Event_CloseWindow 

0

2

Goga написал(а):

SetGadgetText(1, Space(900)) ; типа, затираю

согласен, именно типа
текст в текстовых гаджетах удаляется пустой строкой, то есть ты в гаджет ложишь не некий текст, а пустую строку, именно пустую строку, пробел это уже текст
текстовая переменная чистится так жеб пустой строкой

Код:
SetGadgetText(1, "')

а чтобы текст был цветным, надо или на каждую букву свой TextGadget() или использовать канвас
TextGadget() не позволяет красить отдельные символы, канвас позволяет

0

3

Попробуй EditorGadget с #PB_Editor_ReadOnly. В код-архиве искать функцию "Editor_Select", будет 3 файла-кода с примерами.

Отредактировано AZJIO (27.08.2020 15:47:41)

0

4

newJS, пробовал я играться с пустой строкой, что-то не получилось. А вот раскраской по буквам у меня давно порядок, не в этом вопрос был. Тем не менее, большое спасибо за советы.
AZJIO, спасибо за намек, кажется, в этом что-то есть. Покавыряюсь на днях, если получится, код выложу.

0

5

Goga написал(а):

пробовал я играться с пустой строкой, что-то не получилось.

что то не получилось? а это как?

0

6

newJS, все равно мельтешит после десятка нажатий на пробел. Ну, ты попробуй сам, может я действительно что-то over затупляю )

0

7

Goga
Помучил твой код. Во первых использовал For  вместо While, чтобы не генерировать аналог For используя While. Во вторых не было удаление гаджетов, они просто генерировались бесконечно.

Код:
EnableExplicit
Define i, z, tmp, v

Define Dim pp$(2)
; Dim item(0)
OpenWindow(0, 0, 0, 900, 400, "Мельтешение разве не имитация стиля хакера?", #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
SetWindowColor(0, 0)
pp$(0)="Кто не учится тот потом работает дворником, того обманывают, да и жизнь становится не интересной."
pp$(1)="брклмн опреста и т.д. и т.п. йцукен фывап"
pp$(2)="Тут был текст, но теперь его нет, жми пробел и смотри что будет"

v = 2
i = -1
Repeat
	If v > 1 And v <> 32768 ; v > 0 это включает в себя и v<>-32768, v > 1 это в том числе и v <> 1
    i + 1
    If i > 2
    	i = 0
    EndIf
    FreeGadget(#PB_All)
    For z = 1 To Len(pp$(i))
    	tmp=TextGadget(#PB_Any,  (z)*7, 200, 7, 25, Mid(pp$(i),z,1))
    	SetGadgetColor(tmp, #PB_Gadget_FrontColor, Random($FFFFFF, $000000))
;     	SetGadgetColor(tmp, #PB_Gadget_FrontColor, #White)
    	SetGadgetColor(tmp, #PB_Gadget_BackColor, #Black)
    Next
	EndIf
	v=GetAsyncKeyState_(32) ; для смены предложения нажимаем ПРОБЕЛ
Until WaitWindowEvent() = #PB_Event_CloseWindow

Отредактировано AZJIO (28.08.2020 19:31:54)

0

8

AZJIO
Спасибо большое, что посмотрел мое творение. Со строчкой "If v>0 And v<>1 And v<>32768 And v<>-32768" я, конечно, натупил, просто откуда-то ее взял когда-то бездумно  и так таскаю повсюду, ни разу не задумавшись о ней. Это ладно. Главное, я, к своему стыду, еще и не знал, что можно написать FreeGadget(#PB_All). А  если этим заменить SetGadgetText(1,  Space(900)), то все начинает работать и в исходном коде. Вообщем, осилили ))
А не знаешь, можно ли изначально сделать фон любых гаджетов черным, чтобы не было вот этого мерзкого белого мельтешения, когда по-буквенно печатается предложение?
P.S. Кстати, если бы ты не ответил, я хотел еще поковыряться с твоей прошлой идеей EditorGadget с #PB_Editor_ReadOnly и еще у меня появилось задумка просто создавать окно под каждое предложение, а потом просто киллить его и создавать по-новой для нового.
Сорри, плюсить не могу, нет прав еще.

Отредактировано Goga (29.08.2020 15:52:11)

0

9

Goga
Посмотри в код-архиве файлы "\Codes из winapi_library\Гаджет Text (надпись)\Использование RTF как TextGadget.pb" и в той же папке "Форматирование текста (цвет, шрифт).pb"

А не знаешь, можно ли изначально сделать фон любых гаджетов черным

мне просто лень было, но идея была. Надо временно отключить перерисовку окна, а после генерации текста снова включить и обновить окно. В EditorGadget когда программировал на AutoIt3, то формировал сырой код RTF (с тегами, с шапкой где указана кодировка, шрифт, таблица цветов), а потом вставлял в RichEdit. В одном из выше указанных примеров есть.

примеры шапки

Код:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 Consolas;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs22
Код:
{\rtf\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fprq2\fcharset204{\*\fname '&$a_font[2]&';}'&$a_font[2]&' CYR;}}
Код:
$g_RESH_sColorTable = _
    	'\red255\green0\blue0;' & _ ; красный
    	'\red0\green0\blue255;' & _ ; синий
    	'\red99\green99\blue99;' ; серый

	$sCode = "{\rtf\ansi\ansicpg1251\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Arial;}}" & _ ; шрифт Ариал
    	"{\colortbl;" & $g_RESH_sColorTable & "}{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\f0\fs18" & _ ; размер шрифта 18
    	StringStripWS($sCode, 2) & '}'

Вот как я делал в AutoIt3

Отредактировано AZJIO (29.08.2020 20:12:38)

0

10

Готовый вариант с EditorGadget.

Код:
EnableExplicit

#Edit = 1

Define i, v, hEdit, RTFString$
Define Dim pp$(2)

; Может пригодится функция экранирования, если текст надо вставить как есть
Procedure.s EscapeRTF(text$)
	text$ = ReplaceString(text$, "\", "\\", #PB_String_CaseSensitive)
	text$ = ReplaceString(text$, "{", "\{", #PB_String_CaseSensitive)
	text$ = ReplaceString(text$, "}", "\}", #PB_String_CaseSensitive)
	text$ = ReplaceString(text$, #CR$, "\par ", #PB_String_CaseSensitive)
	text$ = ReplaceString(text$, #TAB$, "\tab ", #PB_String_CaseSensitive)
	ProcedureReturn text$
EndProcedure

; здесь пример, как текст с помощью флагов i и b становится курсивом и жирным, определяется вложенностью скобок
pp$(0)="{\i Сменяемый текст, {\b\cf2 жми пробел}, чтобы увидеть следующий текст}"
; здесь пример, как текст только для внутри фигурных скобок выделяется цветом 2, т.е. синим. И экранирование
pp$(1)="цвет {\cf2 определяется} внутри фигурных скобок, но разметку можно экранировать, \{\\cf2 вот\}"
; здесь \cf2 включает цвет шрифта 2 т.е. синий, а потом \cf1, т.е. цвет 1 - красный
pp$(2)="Пример переключения \cf2цвета\cf1, до конца или до следующей смены цвета. {\cf3\b\i Жми пробел}"

OpenWindow(0, 0, 0, 900, 400, "RTF как TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowColor(0, 0)
; шапка RTF, собственно начальные настройки (кодировка, шрифт, размер шрифта, таблица цветов \cfN)
RTFString$ + "{\rtf\ansi\ansicpg1251\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Arial;}}{\colortbl;"
; Таблица цветов, их можно задать сколько угодно и использовать тег \cf1 или \cf22, где 1 и 22 номер цвета в таблице.
; Цвета определяются содержанием красного зелёного и синего от 0 до 255
RTFString$ + "\red255\green150\blue150;" ; красный
RTFString$ + "\red0\green150\blue255;"	 ; синий
RTFString$ + "\red99\green99\blue99;"	 ; серый
; Текст {\*\generator Msftedit 5.41.21.2510;} можно убрать, это определяет версию, в которой создан файл и при открытии файла определяет что в ней поддерживается.
RTFString$ + "}{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\f0\fs22"
RTFString$ + "\cf1 " ; это сразу с начала текста включает цвет шрифта 1, то есть красный

EditorGadget(#Edit, 10, 210, WindowWidth(0)-20, 50, #PB_Editor_ReadOnly) ; Создаёт гаджет только для чтения
hEdit = GadgetID(#Edit)                    	 ; получить дескриптор
SetWindowTheme_(hEdit, @"", @"")        	 ; отключает рамку
SetWindowLongPtr_(hEdit, #GWL_EXSTYLE, 0)	 ; расширенный стиль = 0
SendMessage_(hEdit, #EM_SHOWSCROLLBAR, #SB_HORZ, #False) ; отключает горизонтальную прокрутку
SendMessage_(hEdit, #EM_SHOWSCROLLBAR, #SB_VERT, #False)	 ; отключает вертикальную прокрутку
SetWindowPos_(hEdit, 0, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED) ; перерисовывает окно не изменяя размеров и позиции
SetGadgetColor(#Edit, #PB_Gadget_FrontColor, #White)             ; задаёт цвет шрифта
SetGadgetColor(#Edit, #PB_Gadget_BackColor, #Black)             ; задаёт цвет фона

v = 2
i = -1
Repeat
	If v > 1 And v <> 32768
    i + 1
    If i > 2
    	i = 0
    EndIf
    SetGadgetText(#Edit, RTFString$ + pp$(i))
;     SetGadgetText(#Edit, RTFString$ + EscapeRTF(pp$(i))) ; экранируем текст, т. е. выводим как есть
	EndIf
	v=GetAsyncKeyState_(32) ; для смены предложения нажимаем ПРОБЕЛ
Until WaitWindowEvent() = #PB_Event_CloseWindow

Отредактировано AZJIO (30.08.2020 03:50:20)

0

11

ого, спасибо. Буду изучать. Я там в личку еще тебе написал, посмотри, пож.

P.S. пример разобрал полностью. Я о таких фишках вообще не знал (

Отредактировано Goga (30.08.2020 16:23:55)

0

12

попробовал запустить выше размещенный код - у меня пробел не работал
тогда я применил другой принцип отлавливания пробела. А за одно и Esc отловил.
Ну и еще по мелочи оптимизировал.

Код:
EnableExplicit
Define i, event

Procedure DrawString(x,y,s$)
	Protected z, tmp
    FreeGadget(#PB_All)
    For z = 1 To Len(s$)
    	tmp=TextGadget(#PB_Any,  x+(z)*8, y, 8, 25, Mid(s$,z,1))
    	SetGadgetColor(tmp, #PB_Gadget_FrontColor, Random($FFFFFF, $000000))
;     	SetGadgetColor(tmp, #PB_Gadget_FrontColor, #White)
    	SetGadgetColor(tmp, #PB_Gadget_BackColor, #Black)
    Next
EndProcedure

OpenWindow(0, 0, 0, 900, 400, "Мельтешение разве не имитация стиля хакера?", #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
SetWindowColor(0, 0)

CreateStatusBar(5, WindowID(0))
AddStatusBarField(200): StatusBarText(5, 0, "ESC - завершить программу")
AddStatusBarField(400): StatusBarText(5, 1, "Space (Пробел) - показать следующую строку")

AddKeyboardShortcut(0, #PB_Shortcut_Space, 15) 
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 10)

Define Dim pp$(2)
pp$(0)="Кто не учится тот потом работает дворником, того обманывают, да и жизнь становится не интересной."
pp$(1)="брклмн опреста и т.д. и т.п. йцукен фывап"
pp$(2)="Тут был текст, но теперь его нет, жми пробел и смотри что будет"

i = 0
DrawString(20,200,pp$(i))
Repeat
	event=WaitWindowEvent()
	Select Event
    Case #PB_Event_CloseWindow
    	Break ; выйти из цикла Repeate
    Case #PB_Event_Menu
    	Select EventMenu()
        Case 10 ;#PB_Shortcut_Escape
        	Break ; выйти из цикла Repeate
        Case 15 ;#PB_Shortcut_Space
        	i + 1
        	If i > 2: i = 0: EndIf
        	DrawString(20,200+i*20,pp$(i))
    	EndSelect
	EndSelect
ForEver

0

13

SadStar, твоя версия, конечно, имеет право на жизнь. Но там белый там все же мельтешит и, для моей задачи там есть ограничения. Вариант AZJIO с RTF стрингом и EditorGadget, на мой взгляд,  просто шикарен. Для меня это просто находка. Там не только все как надо,  но и открылись широчайшие возможности управления строкой с любого символа. Я даже все переделывать у себя начал.

0

14

По моему самое очевидное решение.

Код:
s.s = "Привет мир!!!!"
OpenWindow(0, 0, 0, 200, 50, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowColor(0, RGB(236, 236, 236))
CanvasGadget(0, 8, 10, 180, 36)
SetGadgetColor(0, #PB_Gadget_BackColor, RGB(236, 236, 236))

LoadFont(0, "Arial", 20)

If StartDrawing(CanvasOutput(0))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))
  Pos = 0
  l = Len(s)
  For i = 1 To l
    Pos = DrawText(Pos, 0, Mid(s, i, 1), RGB(Random(255), Random(255), Random(255)))
  Next i
  StopDrawing()
EndIf

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

0

15

Пётр, твое решение работает! Но, к счастью (для меня)), ты ответил поздно, под мои задачи решение AZJIO пришлось идеально. Такой подход позволил мне не только сократить код, но и дало возможность легко управлять шрифтом и сделать еще кое-какие штучки. Хотя решение с канвасом я, безусловно, запомню. Спасибо!

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как правильно вывести текст и удалить с экрана?