Здрасьте,
Мне нужно отображать на форме текст(не более 100 слов) так, чтобы он был прозрачным, чтобы можно было кликнуть на каждое отдельное слово, и чтобы это слово измняло цвет, т.е. мне нужно сделать полностью интерактивный текст. Для этого я считываю текст из файла, разбиваю его
на слова и знаки препинания, имея сотню прозрачных невидимых лэйблов, присваиваю им эти слова, выстраиваю их
вплотную друг за другом с переносом на строку ниже если
лэйбл выходит за установленный предел, делаю их видимыми,
В маусмувах этих лэйблов перекрашиваю их, делаю для них
клики, так что вот мне и интерактивный текст, но такой
медленный собака! Скажите я чайник? Я думаю, что по-другому никак...
Ещё какой! Но это нормально для начала пока ты со всем не разберешься. Главное, что ты попытался хоть что-то сделать со своей задачей самостоятельно!
Знал бы ты, что число окон, которые можно создать в windows-системах фиксированное.. Ну, не суть.
Смысл в том, что можно иметь всего одно окно-контейнер с текстом и оно может быть раскрашено по-разному. Делается это при отрисовке текста окна отдельными вызовами DrawText, TextOut или подобных API-функций. Это непростая задача, но зато и решает она пи этом множество проблем.
А именно в твоем случае возможно пригодится встраивание в программу элемента управления WebBrowser (если я правильно написал), т.е. движка браузера Internet Explorer и показ твоего текста как html. Не знаю, многое ли удастся сделать интерактивным, но клики обрабатвывать очень даже сможешь. Реализуется ну очень легко!
busha пишет:
А при чем тут окна? У меня только одно окно, это Label'ов
сотня...
В системе Windows есть понятие window, окном является не только то что ты понимаешь под окном - прямоугольная область с заголовком, кнопками управления размером и т.п. но и другие элементы, например кнопка, TextBox, радиобатоны и т.п. - это тоже окна. Поднобнее нужно смотреть в MSDN
Вопрос в том что в VBA/VB6, насколько я помню, Label'ы не являются окнами, а отрисовываются средствами GDI на контейнере
нет. попадалось где-то, точных данных не имею. в контексте топика обсуждать похоже нет смысла (см ниже)
2) Разве Label в VB6/VBA реализуются окнами?
..
Вопрос в том что в VBA/VB6, насколько я помню, Label'ы не являются окнами, а отрисовываются средствами GDI на контейнере
ты прав, в VBA/VB6 не окнами. не путать со статиком.
Вроде бы это то что ты хотел. Что тебе надо добавишь сам, я знаю, ты сможешь. Вроде ничего себе работает. Пока что только с моноширинными шрифтами. У меня включен Clear Type - есть небольшие проблемы, текст становится как бы жирным. Чтобы перевести всю эту ерунду на шрифт с изменяющейся шириной я бы попробовал наверное API - функции GetTextExtent и GetTextMetrics. В этом случае константы WIDTH_LETTER и HEIGHT_LINE станут бесполезны: слова, даже если они имеют одинаковое число букв, будут иметь разную длину на экране если эти буквы будут различаться. чтобы посмотреть мой пример тебе надо Form1 и модуль.
***НАЧАЛО-FORM1***
Const SOME_TEXT = "Эммануэль отдается соблазну этого нарцистического любованья, перед которым, она уже знает, окажется беззащитна и на этот раз. Они приближаются, минуты наслаждения в одиночестве: расслабляющая истома охватывает все ее тело. Какие-то неясные желания пробуждаются в ней - это совсем не похоже на то, что она испытывает, вытянувшись на нагретом жарким солнцем пляже. Постепенно, по мере того, как ее губы становятся влажными, соски твердеют и ноги напрягаются, готовые вздрогнуть от легчайшего прикосновения, в ее мозгу возникают образы, бесформенные, неясные, но это именно они покрывают испариной ее кожу и выгибают ее поясницу. Незаметно, но уверенно подрагивания корпуса лайнера передаются всему телу Эммануэль, и она содрогается в этом же ритме. Какая-то теплая волна поднимается по ее ногам, раздвигает колени - именно там находится как бы центр всех этих непонятных пока содроганий, - неумолимо заставляя трепетать ее бедра и всю ее" _
+ "дрожать, как от озноба. И вот смутные образы начинают приобретать очертания: губы прикасаются к ее коже, какие-то неведомые отростки фаллической формы стремятся прижаться к ней, трутся об нее, стараются проложить себе путь от колен выше и выше, раздвинуть бедра, раскрыть расщелину раковины, проникнуть туда; с трудом, с усилием, но им удается это. И вот эти неудержимые фаллосы уже там, один за другим они движутся все дальше и глубже в Эммануэль, насыщая ее своей плотью и отдавая ей свои соки."
Const WIDTH_LETTER = 8
Const HEIGHT_LINE = 12
Dim text() As TypeWord, lengthText As Long, u As Long, lx As Integer, ly As Integer
Private Sub Form_Load()
Form1.Font.Size = 10
Form1.Font.Name = "Courier New"
lengthText = Len(SOME_TEXT)
ReDim text(0)
For j = 1 To lengthText
b = Mid(SOME_TEXT, j, 1)
If b = " " Then
setWordWidth
u = u + 1
ReDim Preserve text(u)
Else
text(u).word = text(u).word + b
End If
Next j
setWordWidth
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
j = 0
Do Until X > text(j).X And X < text(j).X + text(j).width And Y > text(j).Y And Y < text(j).Y + HEIGHT_LINE
j = j + 1
If j > u Then Exit Sub
Loop
text(j).isRed = Not text(j).isRed
paintWord (j)
End Sub
Private Sub Form_Paint()
Form1.Cls
For j = 0 To u
paintWord (j)
Next j
End Sub
Private Sub Form_Resize()
For j = 0 To u
If mx + text(j).width > Form1.ScaleWidth Then
my = my + HEIGHT_LINE
mx = 0
End If
text(j).X = mx
text(j).Y = my
mx = mx + text(j).width + WIDTH_LETTER
Next j
If lx > Form1.width Or ly > Form1.Height Then Form_Paint
lx = Form1.width
ly = Form1.Height
End Sub
Private Sub paintWord(num As Long)
Form1.CurrentX = text(num).X
Form1.CurrentY = text(num).Y
If text(num).isRed Then Form1.ForeColor = vbRed Else Form1.ForeColor = vbBlack
Print text(num).word
End Sub
Private Sub setWordWidth()
text(u).width = WIDTH_LETTER * Len(text(u).word)
End Sub
***КОНЕЦ-FORM1***
***НАЧАЛО-МОДУЛЬ***
Type TypeWord
word As String
isRed As Boolean
X As Integer
Y As Integer
width As Long
End Type
***КОНЕЦ-МОДУЛЬ***