Свой элемент управления

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Свой элемент управления

Сообщение Alex[fj] » 15.04.2007 (Вс) 19:32

Как бы мне научиться создавать их?
Есть замечательные статьи Как создать свой элемент управления в VB.NET... Но там берется элемент и к нему дописываем свойства, которые нужны...
Чесно читал и разбирался, но не нашел того, о чем спрашиваю. :(
А можно ли нарисовать свой, изменив практически все? :roll:
Часный случай: меня не устраивает TrackBar, а именно его вид и ширина (она не меняется).
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 16.04.2007 (Пн) 7:28

Общий принцип: все что нужно рисуется ручками на теле контрола.
Весь мир матрица, а мы в нем потоки байтов!

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 16.04.2007 (Пн) 13:24

Да, вопрос как! :)
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 16.04.2007 (Пн) 16:17

Событие Paint

Public Event Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) As System.Windows.Forms.PaintEventHandler
Member of System.Windows.Forms.Control


e.Graphics.DrawLine(.....
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 16.04.2007 (Пн) 20:33

Да, и так можно нарисовать TrackBar?
Нельзя ли, как говориться, от руки? Ну по кусочкам в фотошопе, там...
Ну или примерчик есть (не представляю, как Sebas будет рисовать...) Каждый, ведь наверняка с таким сталкивался! :roll:
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.04.2007 (Вт) 6:58

Так можно нарисовать все, что угодно. Хоть через DrawLine, хоть кусочкамиранее нарисованными в Photoshop через DrawImage. Примера жаль под рукой нет
Весь мир матрица, а мы в нем потоки байтов!

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 17.04.2007 (Вт) 7:08

!Viper! писал(а):...хоть кусочкамиранее нарисованными в Photoshop через DrawImage. Примера жаль под рукой нет

А мне как жаль! И как через DrawImage? По форме рисовать?
Не врубаюсь... :(
Киньте, правда, пример, пожалуйста.
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

dalona
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 12.04.2007 (Чт) 10:01

Сообщение dalona » 17.04.2007 (Вт) 12:00

в VB.net 2005 это можно сделать как в приложении к этому сообщению
Может это тебе поможет, - на форме расположен PictureBox, который может содержать нужное тебе изображение. В данном примере за PictureBox форму можно таскать и сворачивать в трэй двойным щелчком левой кнопки. По правому щелчку форма закрывается. В общем загрузи и посмотри код.
Вложения
move_form_app_4.zip
Форма с элементом управления PictureBox, за который можно таскать форму.
(121.38 Кб) Скачиваний: 169

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 17.04.2007 (Вт) 13:01

Код: Выделить всё
Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(pe)
     Dim Rectn As New Rectangle(X , Y , W, H)
     Dim mImage As Image = Image.FromFile("File Name")
     pe.Graphics.DrawImage(mImage, Rectn)
End Sub


Rectn - квадрат который определяет зону прорисовки картинки
X , Y - наверно объеснять не надо
W, H - ширина и высота квадрата
mImage - картинка которую надо рисовать

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 17.04.2007 (Вт) 13:31

dalona, не в тему... Это не свой элемент управления, просто PictureBox в роли заголовка...

temur, как я таким образом нарисую TrackBar? Состоит он из двух элементов... Нет, так элементы не собирают. Эго же надо в класс залить!
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 17.04.2007 (Вт) 22:21

А мне как жаль! И как через DrawImage? По форме рисовать?

Ты спрашивал как использовать DrawImage я ответил а как ты будешь делать контрол это твое дело и за тебя никто его делать не будет! Таже функция есть у любого контрола. так что немного подумай немного книжку почитай про ВБ и все получится.

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 18.04.2007 (Ср) 13:04

...нарисую TrackBar? Состоит он из двух элементов...


Извините, но как это TrackBar состоит из 2х элементов? Поясните мне уже. а то я че-то 5 минут в ступоре сидел
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 18.04.2007 (Ср) 15:16

Ну... 1 - тело, 2 - ползунок...
И вообще, какая хрен разница сколько элементов?? Чего из темы делать дискуссионный зал? :?
Я вообще-то, за советом, за помощью...
Знаешь, помоги, не знаешь, чего влезать?
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 18.04.2007 (Ср) 15:24

temur писал(а):Ты спрашивал как использовать DrawImage я ответил а как ты будешь делать контрол это твое дело и за тебя никто его делать не будет!

Я спрашивал, как рисовать контрол. О DrawImage в тех чертах, в которых ты о нем написал, я знал...
Если я спросил бы "А что же это такое?!" твоя реплика была бы уместна! А так, не тепло, не холодно... :?
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 18.04.2007 (Ср) 17:21

Alex[fj]
зайди на codeproject.com, там поищи, там были примеры

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 18.04.2007 (Ср) 19:22

И вообще, какая хрен разница сколько элементов?? Чего из темы делать дискуссионный зал?


Ладно не сердись я просто стопанулся. Теперь дошло :)

Врядли я скажу что-то новое. Но попробую...
Например рисуешь ряд черточек графическими методами (в частности DrawLine) - это будет типа тело
Потом прямоугольник (не забудь сделать видимость объема) - это ползунок. Затем меняешь координату прямоугольника по оси Х в соответствии с величиной указанной в свойстве мин. изменения либо макс. изменения. Тебе придется самому отслеживать нажатия мышкой, клавой и пр. чтобы узнать напр какое св-во необходимо задействовать.
Такой подход тебя устроит :?:

Может в ближайшие денька два накатаю примерного кода... Правда пусть потом умные мира сего меня проверят (я не очень доверяю своим кодам :D )
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 18.04.2007 (Ср) 20:00

Ramzes, да, там есть примеры... Но только они не качаются... Зарегистрировался с горем пополам... Жму скачать - выбрасывает на ввод пароля, ввожу - кидает обратно... И по кругу :(
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 18.04.2007 (Ср) 20:04

AnarCky, спасибо, что помогаешь, но это не то... Получается путь в обход. Это хорошо один раз, но надо создать библиотеку с контролом и его использовать
В этом-то вся и загвоздка, оказалось, что это не так и легко!
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 19.04.2007 (Чт) 1:28

Тебе уже всё подсказали. Надо было просто собрать всё воедино.
Наипростейший пример, который тупо отрисовывает контрол не следя за значениями:
Код: Выделить всё
Public Class Class1
    Inherits Windows.Forms.TrackBar

    Public Sub New()
        'по умолчанию этот стиль отлючен (не происходит событие OnPaint)
        'включаем его
        Me.SetStyle(ControlStyles.UserPaint, True)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim r As Rectangle = Me.ClientRectangle
        r.Inflate(-5, -5)
        e.Graphics.FillRectangle(Brushes.Beige, r)

        r = New Rectangle(10, Me.ClientRectangle.Height / 2, Me.ClientRectangle.Width - 20, 5)
        'отрисовка серой полоски, по которой ездит ползунок
        TrackBarRenderer.DrawHorizontalTrack(e.Graphics, r)

        r = New Rectangle(10, 10, Me.ClientRectangle.Width - 20, 5)
        'отрисовка отметок
        TrackBarRenderer.DrawHorizontalTicks(e.Graphics, r, 10, VisualStyles.EdgeStyle.Etched)

        r = New Rectangle(20, Me.ClientRectangle.Height / 3, 10, 20)
        'отрисовка ползунка
        TrackBarRenderer.DrawBottomPointingThumb(e.Graphics, r, VisualStyles.TrackBarThumbState.Normal)

    End Sub

    Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
        'без коментариев
        pevent.Graphics.FillRectangle(Brushes.DarkGoldenrod, pevent.ClipRectangle)
    End Sub

End Class


вместо TrackBarRenderer можешь вставить свои процедуры рисования.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 19.04.2007 (Чт) 11:19

Alex[fj]
У тебя проблема с браузером, у меня все качаеться

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 19.04.2007 (Чт) 13:13

Nord777, спасибо! :)
Только как теперь его оживить?
Вставлять события и перерисовывать?
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 19.04.2007 (Чт) 21:15

В событии OnPaint анализируешь значение свойства Me.Value и соответственно отрисовываешь ползунок с нужным смещением
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 22.04.2007 (Вс) 10:21

Это получается, надо менять координату X?
Код: Выделить всё
r = New Rectangle(20, Me.ClientRectangle.Height / 3, 10, 20)

Код: Выделить всё
r = New Rectangle(me.value, Me.ClientRectangle.Height / 3, 10, 20)

Тогда фигня получается...

ЗЫ туплю
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 22.04.2007 (Вс) 16:01

не всё так просто. координату x надо вычислять основываясь на значении me.value(и не только), а не подставлять напрямую :)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 23.04.2007 (Пн) 8:52

Основываясь на нем тоже делал. Типа:
Код: Выделить всё
Select Case Me.Value
            Case 0
                r = New Rectangle(5, Me.ClientRectangle.Height / 3, 10, 20)
                'отрисовка ползунка
                TrackBarRenderer.DrawBottomPointingThumb(e.Graphics, r, VisualStyles.TrackBarThumbState.Hot)
            Case 1
                r = New Rectangle(10, Me.ClientRectangle.Height / 3, 10, 20)
                'отрисовка ползунка
                TrackBarRenderer.DrawBottomPointingThumb(e.Graphics, r, VisualStyles.TrackBarThumbState.Pressed)
        End Select

Все равно фигня получается... Начинашь его тянуть, отрывается кусок, глучит... :(
...на значении me.value(и не только)...

А это как понимать?
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.04.2007 (Пн) 12:11

Начинашь его тянуть, отрывается кусок, глучит...

по ходу область отсечения где то задаётся. жестко. Я не смог от этого избавится... хотя не шибко с этим парился. Я унаследовался от Control и добавил несколько свойств - всё нормально. Приду с работы - скину код.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.04.2007 (Пн) 19:42

как и обещал, вот код:
Вложения
TestTrackBar.rar
Почти не комментировал. Кода не много - разберешся.
(48.52 Кб) Скачиваний: 161
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 24.04.2007 (Вт) 20:13

Зачет! Nord777, спасибо ОГРОМНОЕ! :thumleft:
Щас будем разбираться!
Всем спасибо, закрываем тему. :D
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Alex[fj]
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 278
Зарегистрирован: 17.02.2007 (Сб) 20:10
Откуда: Питер

Сообщение Alex[fj] » 29.04.2007 (Вс) 12:04

Nord777, чудок посидел с кодом - получился доделался TrackBar. Теперь можно выбирать Вертикальность\Горизонтальность и картинки ставить на нажатие и блокировку. Вообщем можно посмотреть и одобрить! :D
А вообще, предлагаю в кирпичи - штука полезная.
Вложения
Track.zip
TrackBar
(158.53 Кб) Скачиваний: 150
Изображение
Стараюсь быть вполне хорошим (c) Лев Толстой

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 29.04.2007 (Вс) 14:20

1) При смене ориентации не меняется ClientRectangle, а надо бы.
2) При вертикальной ориентации ползунок двигается сверху-вниз, а привычней снизу-вверх
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

След.

Вернуться в Visual Basic .NET

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

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

    TopList