Страница: 1 |
Вопрос: СкроллБар | Добавлено: 25.03.04 11:56 |
Автор вопроса: ![]() |
Здрасте. Я один изи создателей МиниОРГ(такой себе калькултор(пока)).Вот.... Хотел спросить, мне нужно на результат поставить скрол бар, но чтобы он появлялся, только тогда, когда числа не влазять в видимую область. Заранее спасибо |
Ответы | Всего ответов: 13 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #1 | Добавлено: 25.03.04 12:26 |
Не слышал о таком... Могу посоветовать использовать RichTextBox, там енто автоматика делает. Если, конечно, не жалко еще один осх подключать... |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() Вечный Юзер! ICQ: uu@jabber.cz Вопросов: 120 Ответов: 3302 |
Профиль | Цитата | #2 | Добавлено: 25.03.04 12:58 |
Private Sub Text1_Change() If Len(Text1.Text) > Text1.Width / 100 Then HScroll1.Visible = True Else HScroll1.Visible = False End If End Sub Ну или что-то подобное.... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 2 Ответов: 3 |
Профиль | Цитата | #3 | Добавлено: 25.03.04 14:27 |
да, оно прячется и открывается, но на текстовое поле не влияет(тоесть, не..ю. короче не знаю как обьяснить... вообщем, когда его двигаешь с текстовым полем ничего не происходит... а долджно передвигать содержымое текстового поля.... |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #4 | Добавлено: 25.03.04 14:34 |
Не, так не прокатит, надо будет через API ширину текста высчитывать. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() Вечный Юзер! ICQ: uu@jabber.cz Вопросов: 120 Ответов: 3302 |
Профиль | Цитата | #5 | Добавлено: 25.03.04 14:35 |
X-Man, Внимательно читаем поставленный тобой вопрос: "...чтобы он появлялся, только тогда, когда числа не влазять в видимую область...". И где здесь "... а долджно передвигать содержымое текстового поля...."?! Правильно поставленный вопрос - половина ответа! |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 2 Ответов: 3 |
Профиль | Цитата | #6 | Добавлено: 25.03.04 15:20 |
Вообще да... Но зачем ему надо появляться? чтобы работать.Правильно?.... Вообще-то я конечно не прав. С ричТекстом сделал, но оно как-то не очень... |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 20 |
Профиль | Цитата | #7 | Добавлено: 25.03.04 19:14 |
ScrollBar не станет работать, пока не будет написана обработка событий на его нажатие. Короче, сначала надо указать максимальный и минимальный диапазоны, между которыми ползает бегунок (или как там его?), а потом пишем обработку событий типа HScroll_Change(). |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #8 | Добавлено: 26.03.04 09:25 |
Да не так все просто. Написать процедуру обработки HScroll_Scroll() для текста может быть проблемно. В частности, единственное, что приходит в голову - это Ret = SendMessage(Text1.hWnd, EM_LINESCROLL, dX, 0&) Но тут есть один большой ньюанс - это работает только в том случае, если Textbox уже имеет горизонтальный Scrollbar, а значит тот, что пишем мы - уже нахрен не нужен. Как это обойти я пока не знаю. Может у вас есть идеи? Как я уже сказал, тут рулит RTB, он сам определяет показывать scroll или нет. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 27.03.04 20:56 |
Конкурс на самую тупую (оригинальную) идею. Лауреат: создать два текстбокса, один с Scroll=Horizontal, другой c None, разместить их один под другим и менять ZOrder в зависимости от ширины букв. Чтобы не мучаться с последней, сделать шрифт моноширинным. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #10 | Добавлено: 30.03.04 17:32 |
Есть идея тупее: Определять по ширине когда строка шире текста, затем нечто вроде 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, то скроллбар появляется, но не работает |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #11 | Добавлено: 31.03.04 10:05 |
Да, че то я этим вопросом увлекся... Ну, в общем, мне кажется - решил проблему. Это ведь калькулятор, ок? Значит, данные выводятся в текст не с клавиатуры, а из программы, следовательно текст 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 Все просто |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 31.03.04 11:01 |
Имхо, два текстбокса были бы более легким решением проблемы... |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #13 | Добавлено: 31.03.04 14:21 |
Может и легче, но ведь не оригинальнее |
Страница: 1 |
|