Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: СкроллБар Добавлено: 25.03.04 11:56  

Автор вопроса:  X-Man
Здрасте. Я один изи создателей МиниОРГ(такой себе калькултор(пока)).Вот.... Хотел спросить, мне нужно на результат поставить скрол бар, но чтобы он появлялся, только тогда, когда числа не влазять в видимую область. Заранее спасибо 

Ответить

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

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 25.03.04 12:26

Не слышал о таком...

Могу посоветовать использовать RichTextBox, там енто автоматика делает. Если, конечно, не жалко еще один осх подключать...

Ответить

Номер ответа: 2
Автор ответа:
 User Unknown



Вечный Юзер!

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
Автор ответа:
 X-Man



Вопросов: 2
Ответов: 3
 Профиль | | #3 Добавлено: 25.03.04 14:27
да, оно прячется и открывается, но на текстовое поле не влияет(тоесть, не..ю. короче не знаю как обьяснить... вообщем, когда его двигаешь с текстовым полем ничего не происходит... а долджно передвигать содержымое текстового поля....

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 25.03.04 14:34

Не, так не прокатит, надо будет через API ширину текста высчитывать.

Ответить

Номер ответа: 5
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #5 Добавлено: 25.03.04 14:35

X-Man, Внимательно читаем поставленный тобой вопрос:

"...чтобы он появлялся, только тогда, когда числа не влазять в видимую область...". И где здесь "... а долджно передвигать содержымое текстового поля...."?! Правильно поставленный вопрос - половина ответа!

Ответить

Номер ответа: 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

Да не так все просто. Написать процедуру обработки HScroll_Scroll() для текста может быть проблемно. В частности, единственное, что приходит в голову - это

Ret = SendMessage(Text1.hWnd, EM_LINESCROLL, dX, 0&)

Но тут есть один большой ньюанс - это работает только в том случае, если Textbox уже имеет горизонтальный Scrollbar, а значит тот, что пишем мы - уже нахрен не нужен.

Как это обойти я пока не знаю. Может у вас есть идеи?

Как я уже сказал, тут рулит RTB, он сам определяет показывать scroll или нет.

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 27.03.04 20:56

Конкурс на самую тупую (оригинальную) идею. Лауреат: создать два текстбокса, один с Scroll=Horizontal, другой c None, разместить их один под другим и менять ZOrder в зависимости от ширины букв. Чтобы не мучаться с последней, сделать шрифт моноширинным.

Ответить

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



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
Автор ответа:
 LamerOnLine



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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 31.03.04 11:01

Имхо, два текстбокса были бы более легким решением проблемы...

Ответить

Номер ответа: 13
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #13 Добавлено: 31.03.04 14:21

Может и легче, но ведь не оригинальнее :))

Ответить

Страница: 1 |

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



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