ScrollBar

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

ScrollBar

Сообщение Eugenio » 05.12.2004 (Вс) 8:14

Заранее прош. прощ., если плохо искал в более ранних ветках
Не могут ли Мегачелы привести красивый пример вот для такой задачки:
хочу сделать форму со скроллингом. некрасивый пример у меня есть (мой собственный :) ): помещаем сбоку и снизу scrollbar'ы (мин. значения - 0, макс. значения - width и height) и перетаскиваем туда-сюда контролы. Элементы ресайзим только чуть-чуть.

Почему не просто resizing контролов при изм. размера формы? Потому, что все равно там столько контролов, что полностью не влезают и в развернутое окно, а всякие tabstrip'ы и multipage'ы применять - ну, не хочется!!! :shock:
(форма эта - MDIChild, размер при запуске зависит как-то там от тек. размера родительского окна)
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.12.2004 (Вс) 9:00

А чё сразу красивый пример? А самому поковыряться? :)

Ковыряться:
GetWindowLong, GWL_STYLE;
SetWindowLong, WS_VSCROLL, WS_HSCROLL;
SetScrollInfo;
ScrollWindowEx.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 05.12.2004 (Вс) 13:55

GSerg писал(а):GetWindowLong, GWL_STYLE;
SetWindowLong, WS_VSCROLL, WS_HSCROLL;
SetScrollInfo;
ScrollWindowEx.

И ShowScrollBar, и SCROLLBARINFO...
да-да.. И вот еще бы красивый пример... :lol: :??
Поясню, чего я, собсна, хочу:
хотелось бы обойтись "чистым" VB, по возможности, но красиво.
С той прогой, где я поюзал ваш с Tyomitch'ем пример с динамическими меню - другое дело, там и так было этих API-вызовов... десятком больше, десятком меньше...
Мне вообще непонятно как-то, почему в VB у форм такого отдельного свойства нет..
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.12.2004 (Вс) 14:32

Аааа.... :)

Так вот :twisted:
Скроллбары на форме - первый признак того, что прога писана на Дельфи.
Очень неуважаемое нами свойство :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 05.12.2004 (Вс) 14:40

Ладно, нафиг. Буду ковыряться, как предложено :)
Жаль тока, время на это опять не сразу найду, нафиг
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 05.12.2004 (Вс) 14:40

GSerg писал(а):Очень неуважаемое нами свойство :)

Чего ж тут страшного-то?
В моем случае как ни "ресайзь", один хрен не влезет.
А свой пример я потому и назвал некрасивым, что.. ну, некрасиво это:
нужно на форме отдельное место по эти scrollbar'ы, другие контролы на них наезжают.. Буду пока, видно, на лету их добавлять..
Ну не пользовался я ими раньше. И ни одного красивого примера не видел
Есть ли у меня вопрос? У меня всегда есть вопрос

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2004 (Вс) 17:16

Eugenio, ты кидай свой пример - мы его конструктивно покритикуем...
Хотя мне тоже непонятно, зачем самому изобретать уже существующие вещи. :-?
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 06.12.2004 (Пн) 18:37

tyomitch писал(а):Eugenio, ты кидай свой пример - мы его конструктивно покритикуем...

Я тут занялся переделкой как раз..:)
Доведу последний вариант - брошу код.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 06.12.2004 (Пн) 21:44

Вот. Бросил я это дело на таком-вот варианте. Можно насмехаться.
Код: Выделить всё
Private Sub ControlsPositioning(Optional scrolling As Integer = 0)

    Static HScrollBarHeight As Long
    Static HScrollBarWidth As Long
    Static VScrollBarHeight As Long
    Static VScrollBarWidth As Long
    Static SVIndent As Single   
    Static LVIndent As Single
    Static HIndent As Single
    Dim VScrollValue As Long
    Dim HScrollValue As Long
   
    Static WidthPersentage As Single
    Static HeightPersentage As Single
   
    If ScaleHeight = 0 Then Exit Sub
   
    If scrolling = 0 Then
        WidthPersentage = ScaleWidth / DefScaleWidth
        HeightPersentage = ScaleHeight / DefScaleHeight
   

        SVIndent = Max(DefSVIndent * HeightPersentage, 0)
       
        LVIndent = Max(DefLVIndent * HeightPersentage, 0)
       
        HIndent = Max(DefHIndent * WidthPersentage, 0)
       
        'Dim HScroll_1 As HScrollBar
        If WidthPersentage < 1 Then
            If HorizScrollMode = 0 Then
                HorizScrollMode = 1
                HScroll_1.Visible = True
                HScroll_1.Max = DefScaleWidth - ScaleWidth
            End If
        Else
            If HorizScrollMode > 0 Then
                HScroll_1.Visible = False
                HorizScrollMode = 0
            End If
        End If
       
        If HeightPersentage < 1 Then
            If VertScrollMode = 0 Then
                VertScrollMode = 1
                VScroll_1.Visible = True
                VScroll_1.Max = DefScaleHeight - ScaleHeight
            End If
        Else
            If VertScrollMode > 0 Then
                VScroll_1.Visible = False
                VertScrollMode = 0
            End If
        End If
       
        If VertScrollMode > 0 Then
            VScrollBarHeight = IIf(HorizScrollMode > 0, ScaleHeight - 255, ScaleHeight) '
            VScrollBarWidth = 255
            VScrollValue = CLng(HeightPersentage)
           
            VScroll_1.Height = VScrollBarHeight
            VScroll_1.Width = VScrollBarWidth
            VScroll_1.Top = 0
            VScroll_1.Left = ScaleWidth - VScrollBarWidth
           
            VScroll_1.Value = VScrollValue
        Else
            VScrollBarHeight = 0 '
            VScrollBarWidth = 0
        End If
        If HorizScrollMode > 0 Then
            HScrollBarWidth = IIf(VertScrollMode > 0, ScaleWidth - 255, ScaleWidth) '
            HScrollBarHeight = 255
           
            HScrollValue = CLng(WidthPersentage)
           
            HScroll_1.Height = HScrollBarHeight
            HScroll_1.Width = HScrollBarWidth
            HScroll_1.Top = ScaleHeight - HScrollBarHeight
            HScroll_1.Left = 0
           
            HScroll_1.Value = HScrollValue
        Else
            HScrollBarWidth = 0 '
            HScrollBarHeight = 0
        End If
    Else
        HScrollValue = HScroll_1.Value
        VScrollValue = VScroll_1.Value
    End If
    FileTree.Top = -VScrollValue
    FileTree.Left = -HScrollValue
    FileTree.Height = ScaleHeight - FileTree.Top * 2 - HScrollBarHeight
    FileTree.Width = ScaleWidth / 2
   
    lblBranch_caption.Top = FileTree.Top + DefSVIndent
    lblBranch_caption.Left = FileTree.Left + FileTree.Width + HIndent
    lblBranch_caption.Width = Max(ScaleWidth - FileTree.Left - FileTree.Width - HIndent - VScrollBarWidth, DefTextWidth) '
    Branch_caption.Top = lblBranch_caption.Top + lblBranch_caption.Height
    Branch_caption.Left = lblBranch_caption.Left
    Branch_caption.Width = lblBranch_caption.Width
   
    lblBranch_caption_alias.Top = Branch_caption.Top + Branch_caption.Height + SVIndent
    lblBranch_caption_alias.Left = lblBranch_caption.Left
    lblBranch_caption_alias.Width = lblBranch_caption.Width
    Branch_caption_alias.Top = lblBranch_caption_alias.Top + lblBranch_caption_alias.Height
    Branch_caption_alias.Left = lblBranch_caption.Left
    Branch_caption_alias.Width = lblBranch_caption.Width
   
    lblText_caption.Top = Branch_caption_alias.Top + Branch_caption_alias.Height + LVIndent
    lblText_caption.Left = lblBranch_caption.Left
    lblText_caption.Width = lblBranch_caption.Width
    Text_caption.Top = lblText_caption.Top + lblText_caption.Height
    Text_caption.Left = lblBranch_caption.Left
    Text_caption.Width = lblBranch_caption.Width
    Text_caption.Height = Max(DefTextHeight * HeightPersentage, MinTextHeight)
    'и т.д.
End Sub

На форме:
FileTree - это TreeView, все lbl - это label'ы, остальное - это TextBox'ы разные, отображающие текст, относящийся к выделенной ветке дерева. Всё, что с 'Def' начинается - это константы, для простоты так сделано. Если в процедуру передан параметр scrolling =1, значит, это вызов из ScrollBar_Change или Scrollbar_Scroll, иначе - Form_Load или Form_Resize. Всё, вроде нормально, но эти scrollBar'ы погано смотрятся - свойства BackColor или какого-то общего, типа style, у них нету, поэтому они белые, блин. Мигают все время почему-то. Короче уродство это всё, или у меня мозгов не хватает
Последний раз редактировалось Eugenio 07.12.2004 (Вт) 9:49, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 07.12.2004 (Вт) 9:46

Придется юзать API
Есть ли у меня вопрос? У меня всегда есть вопрос

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2004 (Вт) 12:12

Eugenio писал(а):Придется юзать API
Что же в этом плохого?
Они для того и есть, чтобы их юзали.
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 07.12.2004 (Вт) 12:53

tyomitch писал(а):
Eugenio писал(а):Придется юзать API
Что же в этом плохого?
Они для того и есть, чтобы их юзали.

Да ничего, конечно. Но непонятно как-то. Чего это в VB нет нормальных scrollBar'ов?
ЗЫ.Если природная лень не остановит и природная тупость не помешает, попробую состряпать контрол - сам невидимый, но позволяющий человеческие scrollBar'ы показывать.

Кстати, когда я возился с HScrollBar'ами и VScrollBar'ами, у меня не вышло их удалять в run-time: и непонятно, почему:
"Cannot remove within this context"
Есть ли у меня вопрос? У меня всегда есть вопрос

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2004 (Вт) 13:04

Случайно не из их событий удалял? ;-)
Объект нельзя удалять из обработчика его события.
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 07.12.2004 (Вт) 13:13

Черт, черт, а ведь из процедуры, вызванной из события :shock:
И ведь даже не отразил.
Удивляться-то и правда нечему :lol:
Есть ли у меня вопрос? У меня всегда есть вопрос

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 13.01.2005 (Чт) 0:39


ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 19.01.2005 (Ср) 0:18

Вот User Control, не мой, автор неизвестен

Метод UpdatePos работает помоему неправильно (как я понимаю он должен означать resize), я бы его именил на
Код: Выделить всё
Sub UpdatePos()
   UserControl_Resize
End Sub

Так показывает скролы. Можно заменить PictureBox на все что угодно

PS
Прошу прощения за подряд идущее сообщение - включил файл
У вас нет доступа для просмотра вложений в этом сообщении.


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList