Страница: 1 |
Не слышал о таком... Могу посоветовать использовать RichTextBox, там енто автоматика делает. Если, конечно, не жалко еще один осх подключать... Private Sub Text1_Change() If Len(Text1.Text) > Text1.Width / 100 Then HScroll1.Visible = True Else HScroll1.Visible = False End If End Sub Ну или что-то подобное.... Не, так не прокатит, надо будет через API ширину текста высчитывать. X-Man, Внимательно читаем поставленный тобой вопрос: "...чтобы он появлялся, только тогда, когда числа не влазять в видимую область...". И где здесь "... а долджно передвигать содержымое текстового поля...."?! Правильно поставленный вопрос - половина ответа! Вообще да... Но зачем ему надо появляться? чтобы работать.Правильно?.... Вообще-то я конечно не прав. С ричТекстом сделал, но оно как-то не очень... Да не так все просто. Написать процедуру обработки HScroll_Scroll() для текста может быть проблемно. В частности, единственное, что приходит в голову - это Ret = SendMessage(Text1.hWnd, EM_LINESCROLL, dX, 0&) Но тут есть один большой ньюанс - это работает только в том случае, если Textbox уже имеет горизонтальный Scrollbar, а значит тот, что пишем мы - уже нахрен не нужен. Как это обойти я пока не знаю. Может у вас есть идеи? Как я уже сказал, тут рулит RTB, он сам определяет показывать scroll или нет. Конкурс на самую тупую (оригинальную) идею. Лауреат: создать два текстбокса, один с Scroll=Horizontal, другой c None, разместить их один под другим и менять ZOrder в зависимости от ширины букв. Чтобы не мучаться с последней, сделать шрифт моноширинным. Есть идея тупее: Определять по ширине когда строка шире текста, затем нечто вроде Option Explicit Private Declare Function ShowScrollBar Lib "user32" (ByVal hWnd As Long, ByVal wBar As Long, ByVal bShow As Long) As Long Private Const SB_HORZ = 0 Private Sub Command1_Click() Dim Ret As Long Ret = ShowScrollBar(Text1.hWnd, SB_HORZ, 1) End Sub Private Sub Command2_Click() Dim Ret As Long Ret = ShowScrollBar(Text1.hWnd, SB_HORZ, 0) End Sub Причем если Multiline=false, то скроллбар появляется, но не работает ) Да, че то я этим вопросом увлекся... Ну, в общем, мне кажется - решил проблему. Это ведь калькулятор, ок? Значит, данные выводятся в текст не с клавиатуры, а из программы, следовательно текст Locked=True. Тогда: Ставим на форму TextBox, ставим ему MultiLine=True и задаем один ScrollBars=1 (горизонтальный). Далее код формы: Option Explicit Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As Size) As Long Private Declare Function ShowScrollBar Lib "user32" (ByVal hWnd As Long, ByVal wBar As Long, ByVal bShow As Long) As Long Private Const SB_HORZ = 0 Private Type Size cx As Long cy As Long End Type Dim ThWnd As Long Dim MehDC As Long Dim TxtWidth As Long Private Sub Command1_Click() 'Короткий текст Text1.Text = "fdsgvcxbzn,bvncxb" End Sub Private Sub Command2_Click() 'Длинный текст Text1.Text = "fdsgvcxbzn,bvncxzvn,mmsdnaskljnjqwiqnbmhgfjhfjhknbvhgkjhjgsahnzcxzb" End Sub Private Sub Form_Load() Me.Font = Text1.Font 'Задаем шрифт формы как шрифт текста Me.ScaleMode = 3 ' ScaleMode=Pixel Text1.Locked = True 'Залочиваем текст, чтобы никто не нажал Enter ThWnd = Text1.hWnd MehDC = Me.hdc TxtWidth = Text1.Width Dim Ret As Long Ret = ShowScrollBar(ThWnd, SB_HORZ, 0) 'Прячем скроллбар Text1.Height = 21 'Устанавливаем высоту текстбокса (разумеется, ScaleMode формы = Pixel) End Sub Private Sub Text1_Change() 'Событие вывода в текстбокс Dim Ret As Long Dim TextSize As Size Ret = GetTextExtentPoint32(MehDC, Text1.Text, Len(Text1.Text), TextSize) 'Определяем ширину текста в пикселях If TextSize.cx > TxtWidth Then 'Если он шире TextBox'а, то Text1.Height = 42 'Увеличиваем размер текстбокса Ret = ShowScrollBar(ThWnd, SB_HORZ, 1) 'показываем скроллбар Else 'иначе Text1.Height = 21 'уменьшаем размер текстбокса Ret = ShowScrollBar(ThWnd, SB_HORZ, 0) 'скрываем скроллбар End If End Sub Все просто Имхо, два текстбокса были бы более легким решением проблемы... Может и легче, но ведь не оригинальнее ) Страница: 1 |
Вопрос: СкроллБар
Добавлено: 25.03.04 11:56
Автор вопроса: X-Man
Здрасте. Я один изи создателей МиниОРГ(такой себе калькултор(пока)).Вот.... Хотел спросить, мне нужно на результат поставить скрол бар, но чтобы он появлялся, только тогда, когда числа не влазять в видимую область. Заранее спасибо
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 25.03.04 12:26
Номер ответа: 2
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #2
Добавлено: 25.03.04 12:58
Номер ответа: 3
Автор ответа:
X-Man
Вопросов: 2
Ответов: 3
Профиль | | #3
Добавлено: 25.03.04 14:27
да, оно прячется и открывается, но на текстовое поле не влияет(тоесть, не..ю. короче не знаю как обьяснить... вообщем, когда его двигаешь с текстовым полем ничего не происходит... а долджно передвигать содержымое текстового поля....
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 25.03.04 14:34
Номер ответа: 5
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #5
Добавлено: 25.03.04 14:35
Номер ответа: 6
Автор ответа:
X-Man
Вопросов: 2
Ответов: 3
Профиль | | #6
Добавлено: 25.03.04 15:20
Номер ответа: 7
Автор ответа:
dem
Вопросов: 3
Ответов: 20
Профиль | | #7
Добавлено: 25.03.04 19:14
ScrollBar не станет работать, пока не будет написана обработка
событий на его нажатие. Короче, сначала надо указать максимальный и
минимальный диапазоны, между которыми ползает бегунок (или как там его?), а
потом пишем обработку событий типа HScroll_Change().
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 26.03.04 09:25
Номер ответа: 9
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 27.03.04 20:56
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 30.03.04 17:32
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 31.03.04 10:05
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 31.03.04 11:01
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 31.03.04 14:21