Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: скажите, я чайник? Добавлено: 25.09.08 14:43  

Автор вопроса:  busha
Здрасьте,
Мне нужно отображать на форме текст(не более 100 слов) так, чтобы он был прозрачным, чтобы можно было кликнуть на каждое отдельное слово, и чтобы это слово измняло цвет, т.е. мне нужно сделать полностью интерактивный текст. Для этого я считываю текст из файла, разбиваю его
на слова и знаки препинания, имея сотню прозрачных невидимых лэйблов, присваиваю им эти слова, выстраиваю их
вплотную друг за другом с переносом на строку ниже если
лэйбл выходит за установленный предел, делаю их видимыми,
В маусмувах этих лэйблов перекрашиваю их, делаю для них
клики, так что вот мне и интерактивный текст, но такой
медленный собака! Скажите я чайник? Я думаю, что по-другому никак...

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #1
Добавлено: 25.09.08 15:20
Ещё какой! Но это нормально для начала пока ты со всем не разберешься. Главное, что ты попытался хоть что-то сделать со своей задачей самостоятельно!

Знал бы ты, что число окон, которые можно создать в windows-системах фиксированное.. Ну, не суть.

Смысл в том, что можно иметь всего одно окно-контейнер с текстом и оно может быть раскрашено по-разному. Делается это при отрисовке текста окна отдельными вызовами DrawText, TextOut или подобных API-функций. Это непростая задача, но зато и решает она пи этом множество проблем.

А именно в твоем случае возможно пригодится встраивание в программу элемента управления WebBrowser (если я правильно написал), т.е. движка браузера Internet Explorer и показ твоего текста как html. Не знаю, многое ли удастся сделать интерактивным, но клики обрабатвывать очень даже сможешь. Реализуется ну очень легко!

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 25.09.08 15:32
  1. CurrentX = 100
  2. CurrentY = 100
  3. ForeColor = RGB(200,156,10)
  4. Print "Жрать"

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 25.09.08 17:33
Знал бы ты, что число окон, которые можно создать в windows-системах фиксированное.. Ну, не суть.

1) Можно подробнее об ограничениях?
2) Разве Label в VB6/VBA реализуются окнами?

Ответить

Номер ответа: 4
Автор ответа:
 busha



Вопросов: 22
Ответов: 18
 Профиль | | #4 Добавлено: 25.09.08 17:54
А при чем тут окна? У меня только одно окно, это Label'ов
сотня...

Ответить

Номер ответа: 5
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #5
Добавлено: 25.09.08 18:04
2) Разве Label в VB6/VBA реализуются окнами?
стопудов нет

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 25.09.08 19:14
busha пишет:
А при чем тут окна? У меня только одно окно, это Label'ов
сотня...

В системе Windows есть понятие window, окном является не только то что ты понимаешь под окном - прямоугольная область с заголовком, кнопками управления размером и т.п. но и другие элементы, например кнопка, TextBox, радиобатоны и т.п. - это тоже окна. Поднобнее нужно смотреть в MSDN

Вопрос в том что в VBA/VB6, насколько я помню, Label'ы не являются окнами, а отрисовываются средствами GDI на контейнере

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 25.09.08 19:18
VBD
Отличный пример, теперь скажи как обрабатывать нажатия мышкой на надпись?

Ответить

Номер ответа: 8
Автор ответа:
 busha



Вопросов: 22
Ответов: 18
 Профиль | | #8 Добавлено: 25.09.08 19:28
Может я и правда чайник, так просто обрабатывать их в
Label1.Click()'ах, а там любой код

Ответить

Номер ответа: 9
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #9
Добавлено: 25.09.08 19:46
Лейблы - просто DrawText на форме

Ответить

Номер ответа: 10
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #10 Добавлено: 25.09.08 20:17
VОІГђVBD
Нормальный пример, ориентируемся по курсору, в маусмуве формы отрисовываем подсветку слов, а в формклике всё остальное.

Ответить

Номер ответа: 11
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #11
Добавлено: 25.09.08 20:56
Может тормоза связаны и обработкой маусмувов?

Steel Brand,
1) Можно подробнее об ограничениях?

нет. попадалось где-то, точных данных не имею. в контексте топика обсуждать похоже нет смысла (см ниже)
2) Разве Label в VB6/VBA реализуются окнами?
..
Вопрос в том что в VBA/VB6, насколько я помню, Label'ы не являются окнами, а отрисовываются средствами GDI на контейнере

ты прав, в VBA/VB6 не окнами. не путать со статиком.

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 25.09.08 21:01
Smith
геморой предлагаешь

Ответить

Номер ответа: 13
Автор ответа:
 Боцман



ICQ: 295725312 

Вопросов: 53
Ответов: 830
 Web-сайт: Rus-Skipper.narod.ru
 Профиль | | #13
Добавлено: 25.09.08 22:14
Вот интересно в VBA масивов нет что ли?
Ведь все очень просто если у label_ей index есть.

Ответить

Номер ответа: 14
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #14 Добавлено: 25.09.08 22:29
:D Поверил ...
Да прикалываюсь я

Ответить

Номер ответа: 15
Автор ответа:
 supaplex777



ICQ: 397711309 

Вопросов: 5
Ответов: 13
 Web-сайт: dudkino-net.tut.su
 Профиль | | #15
Добавлено: 25.09.08 23:54
Вроде бы это то что ты хотел. Что тебе надо добавишь сам, я знаю, ты сможешь. Вроде ничего себе работает. Пока что только с моноширинными шрифтами. У меня включен 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
***КОНЕЦ-МОДУЛЬ***

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам