Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
.NET 4.x

Как создать красивый контакт лист User control

05.03.2015, 01:08. Показов 1678. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток форумчане.

Говорю сразу программирую недавно на VB .NET
читал, искал по форуму,гуглил решение моей проблемы лежит на поверхности и опытный программист
сразу сможет разобраться в моей ситуации и дать кусочек кода или натолкнуть как то меня на путь истинный.
я пробывал понять что то в wpf но не шарю я там с этим xaml ни в какую.
Давайте ближе к делу. пишу настольный клиент vk.com, столкнулся с выводом списка друзей.
в загрузке и парсинга данных проблем нет, проблема в создании красивого контрола
который бы отображал все это дело в удобном формате. конкретно это список item'ов
в каждом итеме 1 картинка и 2 строки. Мое решение пало на динамическое создание в FlowLayoutPanel элементов
выглядит это так:

на форме FlowLayoutPanel1 c параметрами WrapContents = False , AutoScroll = True , FlowDerection = Top\Down
и кнопка в ней код:


Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Dim xml As New XmlDocument
        Dim node As System.Xml.XmlNode
        xml.Load("https://api.vk.com/method/friends.get.xml?user_id=1&order=hints&fields=photo_50,online,last_seen")
        While xml.DocumentElement.HasChildNodes
            node = xml.DocumentElement.FirstChild
 
            Dim panel As New Windows.Forms.Panel With {.Width = 255, .Height = 54, .Tag = node.Item("uid").InnerXml}
            Dim label1 As New Windows.Forms.Label With {.Left = 55, .Top = 5, .Text = node.Item("first_name").InnerXml & " " & node.Item("last_name").InnerXml}
            Dim image As New Windows.Forms.PictureBox With {.Left = 2, .Top = 2, .Width = 50, .Height = 50, .ImageLocation = node.Item("photo_50").InnerXml}
 
 
            Dim label2 As New Windows.Forms.Label
            With label2
                .Left = 55
                .Top = 30
                If node.Item("online").InnerXml = 1 Then
                    .Text = "Online"
                    .ForeColor = Color.Green
                Else
                    .Text = "Offline"
                    .ForeColor = Color.Red
                End If
 
            End With
            panel.Controls.Add(label1)
            panel.Controls.Add(label2)
            panel.Controls.Add(image)
 
            xml.DocumentElement.RemoveChild(node)
            FlowLayoutPanel1.Controls.Add(panel)
            FlowLayoutPanel1.Refresh()
        End While


ну некрасиво( помогите чтоб можно было в лист бокс грузить как нить такое же)))
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2015, 01:08
Ответы с готовыми решениями:

Как создать на С# user control для VBA (VB6)
Добрый день! Меня интересует пример кода графического контрола который написан на C#/.NET и предназначен для использования в Visual...

Какая разница между Web server control, Composite control и User Control
Подскажите, пожалуйста, какая разница между Web server control, Composite control и User Control, а то я ща тут наделаю делов)

Создать user control
Нужно создать пользовательский контрол, который включает текстовое поле и это поле будет получать от сервака список данных и показывать его...

14
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
06.03.2015, 01:11  [ТС]
Может есть хотя бы способ оптимизировать подобную вещь, что бы список загружался быстрее и программа не подвисала во время загрузки Хотя понимаю что тут только многопоточность поможет но я еще не доучил язык настолько хорошо что бы многопоточность использовать.
Пробывал создавать пользовательский элемент управления, и его динамически дублировать в FlowLayoutPanel,
но опять таки делается это не с большей скоростью чем создавать каждый элемент.

Новый вопрос такой можете ли привести пример WPF контрола в котором будет listbox с datatemplate что бы можно было добавлять туда итемы что то в таком формате:
CustomListbox.items.add(Label1 = 1234" , Label2 = "5678" , Image = "http://mysite.ru/image/001.jpg")
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
06.03.2015, 01:56
Самое простое: использовать обычный listbox с DrawMode = OwnerDrawVariable
0
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
06.03.2015, 21:12  [ТС]
А можно хотя бы небольшой примерчик я только начал учить, нагуглил пару примеров и решил что несмогу сам реализовать, могу только попробывать допилить примерчик под свои нужды, и то многое еще не понимаю как работает темболее все что связано с классами не говоря уже про прорисовку ))

Добавлено через 18 часов 45 минут
Сутки искал как прорисовать image в listbox item ни нашел ни чего на vb.net ни на c#
Есть примеры раскрашивание текста, можете кинуть пример как пририсовать Image перед текстом? можно на c#
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
06.03.2015, 21:47
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Тут правильнее говорить, что мы рисуем текст после картинки, а не картинку перед текстом
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Class Form1
    ' Событие, вызываемое при прорисовке каждого элемента списка
    Private Sub ListBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox1.DrawItem
        e.DrawBackground() 'фон
        Dim pt As Point = e.Bounds.Location
        'Прямоугольник залитый цветом, соответствующим индексу элемента в массиве
        Dim bmp As New Bitmap(50, 50)
        Graphics.FromImage(bmp).FillRectangle(New SolidBrush(colors(e.Index)), 0, 0, bmp.Width, bmp.Height)
        'Рисуем картинку
        e.Graphics.DrawImage(bmp, pt)
        'Отступ на ширину картинки +5 пикселей, чтобы прорисовать текст
        pt.Offset(bmp.Width + 5, 0)
        'Рисуем текст
        e.Graphics.DrawString(strings(e.Index), Me.Font, New SolidBrush(colors(e.Index)), pt)
        e.DrawFocusRectangle() 'прямоугольник выделения
    End Sub
 
    Private colors() As Color = New Color(3) {Color.Black, Color.Brown, Color.CadetBlue, Color.Red}
    Private strings() As String = New String(3) {"Я", "буду", "изучать", "классы"}
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListBox1.Items.AddRange(strings)
    End Sub
 
    'Событие, вызываемое при определении размеров элемента списка
    Private Sub ListBox1_MeasureItem(sender As Object, e As MeasureItemEventArgs) Handles ListBox1.MeasureItem
        e.ItemHeight = 50 'высота строки
    End Sub
End Class
Изображения
 
Вложения
Тип файла: zip ListBoxOwnerDraw.zip (16.1 Кб, 35 просмотров)
1
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
06.03.2015, 21:50  [ТС]
Вот сюда по этому коду добавляет image в итем но как сделать чтобы вместо Image
был PictureBox и текст справа?

Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Private Sub listBox1_MeasureItem(ByVal sender As Object, ByVal e As MeasureItemEventArgs)
        MessageBox.Show("listBox1_MeasureItem")
        ' Cast the sender object back to ListBox type.
        Dim theListBox As ListBox = CType(sender, ListBox)
        ' Получить путь к файлу, содержащаяся в каждом элементе.
        Dim drv As DataRowView = CType(theListBox.Items(e.Index), DataRowView)
        Dim fileString As String = drv.Row("fullpath").ToString
        ' Создайте объект изображения и загрузить файл изображения в него
        Dim img As Image = Image.FromFile(fileString)
        e.ItemHeight = Convert.ToInt32((img.Height * 0.15))
        e.ItemWidth = Convert.ToInt32((img.Width * 0.15))
    End Sub
 
    Private Sub listBox1_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs)
        MessageBox.Show("listBox1_DrawItem")
        ' If the item is the selected item, then draw the rectangle
        ' filled in blue. The item is selected when a bitwise And  
        ' of the State property and the DrawItemState.Selected 
        ' property is true.
        If ((e.State And DrawItemState.Selected) _
                    = DrawItemState.Selected) Then
            e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds)
        Else
            ' Otherwise, draw the rectangle filled in beige.
            e.Graphics.FillRectangle(Brushes.Beige, e.Bounds)
        End If
        Dim drv As DataRowView = CType(listBox1.Items(e.Index), DataRowView)
        Dim img As Image = Image.FromFile(drv.Row("fullpath").ToString)
        img = img.GetThumbnailImage(e.Bounds.Width, e.Bounds.Height, Nothing, IntPtr.Zero)
        e.Graphics.DrawImage(img, e.Bounds.X, e.Bounds.Y)
        ' Draw the focus rectangle around the selected item.
        e.DrawFocusRectangle()
    End Sub


Добавлено через 1 минуту
ViterAlex, Опередили))) спасибо за пример щас начну разбирать))))
рисуем картинку перед текстом как и у вас в примере, как разберу обращусь если будет что то не понятно!)
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
06.03.2015, 21:56
Цитата Сообщение от geniy3dmix Посмотреть сообщение
как сделать чтобы вместо Image
был PictureBox и текст справа
Зачем тебе там PictureBox?
0
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
06.03.2015, 22:04  [ТС]
Потому что PictureBox умеет брать картинку с url PictureBox1.imagelocation = "http://mysite.ru/image/001.jpg"
тоесть мне нужно чтобы можно было добавить в listbox строку так ListBox1.items.add("http://mysite.ru/image/001.jpg" , "Вася Пупкин")

Добавлено через 2 минуты
ну и собветственно при прорисовке слева отрисуется аватар по url в picturebox'e а справа отрисуется сам текст
хотя мне не важно как добавлять итемы но в дальнейшем в любом случае придется их чистить функцией listbox1.items.clear()
и возможно проводить операции со строками по индексу
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
06.03.2015, 22:17
ты идёшь неправильным путём, подстраиваясь под возможности контрола. Нужно действовать наоборот.
Я бы сначала скачивал xml, парсил или десериализовал его в классы и работал бы с классами. Тем более, что тебе эту операцию нужно будет проделывать неоднократно
0
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
07.03.2015, 16:10  [ТС]
ViterAlex, Это конечно правильно, но с моими знаниями языка пока что это слишком сложно, хочу сделать что то минимум сейчас, а в дальнейшем уже допиливать по мере более глубокого изучения.
Изучаю к сожалению ни по книгам, а по разбору msdn и чужих исходников и на основе полученных знаний уже что то делаю свое.

Добавлено через 53 минуты
Вообщем попробывал что то сделать не получилось самому picturebox пихнуть,
пихнул тот же image вообщем вот что получилось. Но походу вообще не правильно мыслю.
В массиве картинок используются пути к файлам jpg. как грузить из url так и не понял(

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private images() As String = New String(3) {"C:\Users\Sher\Pictures\Пленка\8f7b973444b395c13b023076d6e898ee.jpg", "C:\Users\Sher\Pictures\Пленка\8f7b973444b395c13b023076d6e898ee.jpg", "C:\Users\Sher\Pictures\Пленка\8f7b973444b395c13b023076d6e898ee.jpg", "C:\Users\Sher\Pictures\Пленка\8f7b973444b395c13b023076d6e898ee.jpg"}
    Private strings() As String = New String(3) {"21341241", "2123123123", "312312312", "4123123"}
    Private status() As String = New String(3) {"Онлайн", "оффлайн", "оффлайн", "оффлайн"}
 
    Private Sub ListBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox1.DrawItem
        e.DrawBackground()
        Const SizeIc = 50
        Dim RectIc As New Rectangle(e.Bounds.Left, e.Bounds.Top, SizeIc, e.Bounds.Height)
        Dim RectText As New Rectangle(e.Bounds.Left + SizeIc, e.Bounds.Top, e.Bounds.Width - SizeIc, e.Bounds.Height)
        Dim myBrush As Brush = Brushes.Black
        Dim fileString As String = images(e.Index)
        Dim img As Image = Image.FromFile(fileString)
        Dim pt As Point = e.Bounds.Location
        pt.Offset(50, 5)
        Dim pt1 As Point = e.Bounds.Location
        pt1.Offset(50, 20)
        e.Graphics.DrawImage(img, RectIc)
 
        e.Graphics.DrawString(strings(e.Index), Me.Font, New SolidBrush(Color.Black), pt)
        e.Graphics.DrawString(status(e.Index), Me.Font, New SolidBrush(Color.Black), pt1)
        e.DrawFocusRectangle()
    End Sub
 
    Private Sub ListBox1_MeasureItem(sender As Object, e As MeasureItemEventArgs) Handles ListBox1.MeasureItem
        e.ItemHeight = 50 'высота строки
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListBox1.Items.AddRange(strings)
    End Sub
Добавлено через 27 минут
ViterAlex, Замутил я примерно то что хотел=)
но вот как то так это должно выглядеть но я жестоко накосячил походу где то,
вообщем даже всего с 4мя элементами жестокие лаги в списке)))

Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Private images() As String = New String(3) {"http://upload.wikimedia.org/wikipedia/commons/3/30/HMLA-469_Logo.jpg", "http://upload.wikimedia.org/wikipedia/commons/3/30/HMLA-469_Logo.jpg", "http://upload.wikimedia.org/wikipedia/commons/3/30/HMLA-469_Logo.jpg", "http://upload.wikimedia.org/wikipedia/commons/3/30/HMLA-469_Logo.jpg"}
    Private strings() As String = New String(3) {"21341241", "2123123123", "312312312", "4123123"}
    Private status() As String = New String(3) {"Онлайн", "оффлайн", "оффлайн", "оффлайн"}
 
    Private Sub ListBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox1.DrawItem
        e.DrawBackground()
        Const SizeIc = 50
        Dim RectIc As New Rectangle(e.Bounds.Left, e.Bounds.Top, SizeIc, e.Bounds.Height)
        Dim RectText As New Rectangle(e.Bounds.Left + SizeIc, e.Bounds.Top, e.Bounds.Width - SizeIc, e.Bounds.Height)
        Dim myBrush As Brush = Brushes.Black
 
        Dim b() As Byte
        Dim myReq As HttpWebRequest = CType(WebRequest.Create(images(e.Index)), HttpWebRequest)
        Dim myResp As WebResponse = myReq.GetResponse
        Dim stream As Stream = myResp.GetResponseStream
 
 
        Dim img As Image = Image.FromStream(myResp.GetResponseStream)
        Dim pt As Point = e.Bounds.Location
        pt.Offset(50, 5)
        Dim pt1 As Point = e.Bounds.Location
        pt1.Offset(50, 20)
        e.Graphics.DrawImage(img, RectIc)
 
        Dim pic As New PictureBox With {.ImageLocation = images(e.Index)}
 
        e.Graphics.DrawString(strings(e.Index), Me.Font, New SolidBrush(Color.Black), pt)
        e.Graphics.DrawString(status(e.Index), Me.Font, New SolidBrush(Color.Black), pt1)
        e.DrawFocusRectangle()
    End Sub
 
    Private Sub ListBox1_MeasureItem(sender As Object, e As MeasureItemEventArgs) Handles ListBox1.MeasureItem
        e.ItemHeight = 50 'высота строки
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListBox1.Items.AddRange(strings)
    End Sub


Добавлено через 6 часов 48 минут
Убрал вроде как глюки интерфейса, примерно получись то что мне нужно.
вот только как правильно сделать все тоже самое только с picturebox
и что бы итемы можно было добавлять через listbox.items.add()
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 'тут храним FullName
    Private strings() As String = New String() {"кирил пупкин", "вася пупкин", "дима димыч", "дурак дураков"}
    'Здесь будет статус онлайна
    Private status() As String = New String() {"Онлайн", "оффлайн", "оффлайн", "оффлайн"}
    'массив картинок
    Private image1() As Image
 
    'какаха функция загружает и выдает в потом картинку
    Function getimage(ByVal url As String)
        Dim myReq As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
        Dim myResp As WebResponse = myReq.GetResponse
        Dim stream As Stream = myResp.GetResponseStream
        Return stream
    End Function
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim a As String = "http://upload.wikimedia.org/wikipedia/commons/3/30/HMLA-469_Logo.jpg"
        image1 = New Image() {Image.FromStream(getimage(a)), Image.FromStream(getimage(a)), Image.FromStream(getimage(a)), Image.FromStream(getimage(a))}
        ListBox1.Items.AddRange(strings)
    End Sub
 
    Private Sub ListBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox1.DrawItem
        e.DrawBackground()
        Const SizeIc = 50
        Dim RectIc As New Rectangle(e.Bounds.Left, e.Bounds.Top, SizeIc, e.Bounds.Height)
        Dim RectText As New Rectangle(e.Bounds.Left + SizeIc, e.Bounds.Top, e.Bounds.Width - SizeIc, e.Bounds.Height)
        Dim myBrush As Brush = Brushes.Black
        Dim pt As Point = e.Bounds.Location
        pt.Offset(50, 5)
        Dim pt1 As Point = e.Bounds.Location
        pt1.Offset(50, 20)
        e.Graphics.DrawImage(image1(e.Index), RectIc)
        e.Graphics.DrawString(strings(e.Index), Me.Font, New SolidBrush(Color.Black), pt)
        e.Graphics.DrawString(status(e.Index), Me.Font, New SolidBrush(Color.Aquamarine), pt1)
        e.DrawFocusRectangle()
    End Sub
 
    Private Sub ListBox1_MeasureItem(sender As Object, e As MeasureItemEventArgs) Handles ListBox1.MeasureItem
        e.ItemHeight = 50 'высота строки
    End Sub


Добавлено через 9 часов 35 минут
Думаю целесообразней использовать коллекцию строк и image чем массив?
или с коллекцией будет неудобно работать в дальнейшем?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
08.03.2015, 01:35
Обычно, разработку программы начинают с изучения уже существующих аналогов. Если бы ты это сделал, то узнал бы, что аватары не грузят каждый раз с сервера, а кешируют их на диске. К этому и ты должен идти и тогда преимущество pictureBox исчезнет и отпадёт потребность таскать тяжёлый контрол для отрисовки одной единственной картинки.
конечно, для хранения информации лучше всего использовать коллекцию, вернее динамический список List
0
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
08.03.2015, 04:03  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Обычно, разработку программы начинают с изучения уже существующих аналогов. Если бы ты это сделал, то узнал бы, что аватары не грузят каждый раз с сервера, а кешируют их на диске. К этому и ты должен идти и тогда преимущество pictureBox исчезнет и отпадёт потребность таскать тяжёлый контрол для отрисовки одной единственной картинки.
конечно, для хранения информации лучше всего использовать коллекцию, вернее динамический список List
ViterAlex, Я пытался первое время искать аналоги соц программ с открытым кодом, их бы изучал и выдергивал и разбирал бы код из них если бы была такая возможность, большенство программ подобного рода без исходников и сложно найти что то на vb или C#.

Использование PictureBox отпало так как и решил сохранять в кэш, также как это делают оф программы под мобильные платформы, и поэтому вопрос в следующем, алгоритм как я понял такой,
При запуске грузим все данные в какой нибудь класс, а картинки друзей грузим на диск
можно ведь сохранять как ("id" & ".img) правильно мыслю?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
08.03.2015, 10:37
Цитата Сообщение от geniy3dmix Посмотреть сообщение
можно ведь сохранять как ("id" & ".img) правильно мыслю?
Правильно, только в формате png. Img — это, всё-таки, образы дисков
0
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
09.03.2015, 19:34  [ТС]
ViterAlex, Вообщем боролся боролся наваял отдельный класс с кэшированием
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Imports System.Net
Imports System.Xml
 
Public Class Friends
    Public UID As New ArrayList()
    Public FullName As New ArrayList()
    Public Online As New ArrayList()
    Public Image As New ArrayList()
    Dim Temp As String = System.IO.Path.GetTempPath()
    Dim xml As New XmlDocument
    Dim node As System.Xml.XmlNode
    Private GetFriendsList As New System.Threading.Thread(AddressOf FriendsList)
 
    Public Sub MonitorStart(ByVal id As String)
        GetFriendsList.Start(id)
        GetFriendsList.IsBackground = True
    End Sub
 
    Public Function GetList()
        If GetFriendsList.IsAlive = False Then
            Form1.ListBox1.Items.Clear()
            Form1.ListBox1.Items.AddRange(FullName.ToArray)
        Else
            Return "Wait"
        End If
    End Function
 
    Public Sub Refresh()
        Dim sel As String = Form1.ListBox1.SelectedIndex()
        GetList()
        Form1.Друзья.BringToFront()
        Form1.ListBox1.SelectedIndex = sel
    End Sub
 
    Private Sub FriendsList(ByVal id As String)
        UID.Clear()
        FullName.Clear()
        Online.Clear()
        Image.Clear()
        xml.Load("https://api.vk.com/method/friends.get.xml?user_id=" & id & "&order=hints&fields=photo_50,online,last_seen")
        While xml.DocumentElement.HasChildNodes
            node = xml.DocumentElement.FirstChild
            UID.Add(node.Item("uid").InnerXml)
            If System.IO.File.Exists(Temp & "ManegerVK\" & node.Item("uid").InnerXml & ".im") = True Then
                If (My.Computer.Clock.LocalTime.Minute - System.IO.File.GetCreationTime(Temp & "ManegerVK\" & node.Item("uid").InnerXml & ".im").Minute) >= 60 Then
                    System.IO.File.Delete(Temp & "ManegerVK\" & node.Item("uid").InnerXml & ".im")
                    My.Computer.Network.DownloadFile(node.Item("photo_50").InnerXml, (Temp & "ManegerVK\" & node.Item("uid").InnerXml & ".im"))
                Else
                End If
            Else
                My.Computer.Network.DownloadFile(node.Item("photo_50").InnerXml, (Temp & "ManegerVK\" & node.Item("uid").InnerXml & ".im"))
            End If
            FullName.Add(node.Item("first_name").InnerXml & " " & node.Item("last_name").InnerXml)
            Online.Add(node.Item("online").InnerXml)
            Image.Add(System.IO.Path.GetTempPath() & "ManegerVK\" & node.Item("uid").InnerXml & ".im")
            xml.DocumentElement.RemoveChild(node)
        End While
        GetFriendsList.Abort()
        Form1.ListBox1.Items.AddRange(UID.ToArray)
    End Sub
 
   
 
End Class


и сам список
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
'Список друзей================================
    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        e.DrawBackground()
        Const SizeIc = 80
        Dim RectIc As New Rectangle(e.Bounds.Left, e.Bounds.Top, SizeIc, e.Bounds.Height)
        Dim RectText As New Rectangle(e.Bounds.Left + SizeIc, e.Bounds.Top, e.Bounds.Width - SizeIc, e.Bounds.Height)
        Dim fontName As Font = New System.Drawing.Font("Arial", 9, FontStyle.Italic)
        Dim img As Image = Image.FromFile(Friends.Image(e.Index))
        Dim pt As Point = e.Bounds.Location
        Dim pt1 As Point = e.Bounds.Location
        pt.Offset(82, 5)
        pt1.Offset(82, 20)
 
        e.Graphics.DrawImage(img, RectIc)
        e.Graphics.DrawString(Friends.FullName(e.Index), fontName, New SolidBrush(Color.CornflowerBlue), pt)
        If Friends.Online(e.Index) = 1 Then
            e.Graphics.DrawString("В Сети", Me.Font, New SolidBrush(Color.Lime), pt1)
        Else
            e.Graphics.DrawString("Не Сети", Me.Font, New SolidBrush(Color.Red), pt1)
        End If
        e.DrawFocusRectangle()
    End Sub
    
 
 
 
 
    Private Sub ListBox1_MeasureItem(ByVal sender As Object, ByVal e As MeasureItemEventArgs) Handles ListBox1.MeasureItem
        e.ItemHeight = 80 'высота строки
    End Sub


Так очищаю кэш, хотя впринцепе очистка будет в настройках, так как аватары обновляются
VB.NET
1
System.IO.Directory.Delete(System.IO.Path.GetTempPath() & "ManegerVK\", True)
вот появился вопрос, можно ли поменять цвет выделения Item в listbox'e?
и как можно организовать обновления списка в фоне, что бы не особо было заметно если ListBox на глазах у пользователя и он его крутит?

Добавлено через 9 часов 57 минут
1й вопрос отпал сделал так:
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        If e.Index < 0 Then Exit Sub
        e.DrawBackground()
        e.DrawFocusRectangle()
 
        Const SizeIc = 80
        Dim RectIc As New Rectangle(e.Bounds.Left + 5, e.Bounds.Top + 5, SizeIc - 5, e.Bounds.Height - 10)
        Dim RectText As New Rectangle(e.Bounds.Left + SizeIc, e.Bounds.Top, e.Bounds.Width - SizeIc, e.Bounds.Height)
        Dim fontName As Font = New System.Drawing.Font("Arial", 12, FontStyle.Italic)
        Dim fontOnline As Font = New System.Drawing.Font("Arial", 12, FontStyle.Italic)
        Dim img As Image = Image.FromFile(Friends.Image(e.Index))
        Dim pt As Point = e.Bounds.Location
        Dim pt1 As Point = e.Bounds.Location
        pt.Offset(82, 5)
        pt1.Offset(82, 20)
 
        If InStr(e.State.ToString, "Selected,") > 0 Then
            e.Graphics.FillRectangle(Brushes.Black, e.Bounds)
            Dim x2 As Rectangle = New Rectangle(e.Bounds.Location, New Size(e.Bounds.Width - 1, e.Bounds.Height))
            Dim x3 As Rectangle = New Rectangle(x2.Location, New Size(x2.Width, (x2.Height / 2) - 2))
            Dim G1 As New LinearGradientBrush(New Point(x2.X, x2.Y), New Point(x2.X, x2.Y + x2.Height), Color.FromArgb(60, 60, 60), Color.FromArgb(50, 50, 50))
            Dim H As New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(15, Color.Black), Color.Transparent)
            e.Graphics.FillRectangle(G1, x2) : G1.Dispose()
            e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(25, Color.White)), x3)
            e.Graphics.FillRectangle(H, x2) : G1.Dispose()
            e.Graphics.DrawImage(img, RectIc)
            e.Graphics.DrawString(Friends.FullName(e.Index), fontName, New SolidBrush(Color.Brown), pt)
            If Friends.Online(e.Index) = 1 Then
                e.Graphics.DrawString("В Сети", fontOnline, New SolidBrush(Color.Lime), pt1)
            Else
                e.Graphics.DrawString("Не Сети", fontOnline, New SolidBrush(Color.Red), pt1)
            End If
        Else
            e.Graphics.DrawImage(img, RectIc)
            e.Graphics.DrawString(Friends.FullName(e.Index), fontName, New SolidBrush(Color.Brown), pt)
            If Friends.Online(e.Index) = 1 Then
                e.Graphics.DrawString("В Сети", fontOnline, New SolidBrush(Color.Lime), pt1)
            Else
                e.Graphics.DrawString("Не Сети", fontOnline, New SolidBrush(Color.Red), pt1)
            End If
        End If


Второй вопрос еще актуален
0
 Аватар для geniy3dmix
0 / 0 / 1
Регистрация: 04.01.2014
Сообщений: 37
19.03.2015, 19:03  [ТС]
Чтобы не создавать новую тему продолжу тут,
Как можно добавить Кнопку в Item?

пробывал так:

Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 Private Sub ListBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox1.DrawItem
        If e.Index < 0 Then Exit Sub
        e.DrawBackground()
        e.DrawFocusRectangle()
 
        Const SizeIc = 35
        Dim RectIc As New Rectangle(e.Bounds.Left + 5, e.Bounds.Top + 5, SizeIc - 5, e.Bounds.Height - 10)
        Dim RectText As New Rectangle(e.Bounds.Left + SizeIc, e.Bounds.Top, e.Bounds.Width - SizeIc, e.Bounds.Height)
        Dim fontName As Font = New System.Drawing.Font("Arial", 10, FontStyle.Italic)
        ' Dim img As Image = PictureBox1.Image
        Dim pt As Point = e.Bounds.Location
        pt.Offset(30, 5)
        If InStr(e.State.ToString, "Selected,") > 0 Then
            e.Graphics.FillRectangle(Brushes.Black, e.Bounds)
            Dim x2 As Rectangle = New Rectangle(e.Bounds.Location, New Size(e.Bounds.Width - 1, e.Bounds.Height))
            Dim x3 As Rectangle = New Rectangle(x2.Location, New Size(x2.Width, (x2.Height / 2) - 2))
            e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(25, Color.White)), x3)
            '   e.Graphics.DrawImage(img, RectIc)
            e.Graphics.DrawString(titleDoc(e.Index), fontName, New SolidBrush(Color.WhiteSmoke), pt)
        Else
            '      e.Graphics.DrawImage(img, RectIc)
            e.Graphics.DrawString(titleDoc(e.Index), fontName, New SolidBrush(Color.WhiteSmoke), pt)
        End If
 
        Dim button As New Windows.Forms.Button With {.Width = 40, .Height = 20, .Text = "ololo", .Left = e.Bounds.Right - 60, .Top = e.Bounds.Top + 3}
        ListBox1.Controls.Add(button)
 
    End Sub

Но вроде как это неправильно так делать нельзя покажите пожалуйста как можно?

Добавлено через 15 часов 11 минут
актуально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2015, 19:03
Помогаю со студенческими работами здесь

Не получается создать user control
Решил создать user control, создал, но он не появляется в tool bar'е, и даже после компиляции приложения не появляется. В чем проблема? ...

User Control - как контролировать?
Предположим я сделал в проекте ВБ User Control объект. Он замечательно размещается на форме и работает сам по себе - но как и что нужно в...

Как User control упаковать в dll
Получил такое задание создать контрол и что бы он был в dll и как к его полям, если он в dll, получить доступ из формы??

Как добавить атрибут в User Control?
Создаю свой user control, не подскажите как добавить свой атрибут туда,ну тип выкидываю user control и выставляю свой атрибут?Ну и...

Как сделать User control для MonthCalendar
Подскажите как сделать User control для MonthCalendar? Никогда не работала с этим, да и на просторах интернета ничего не нашла


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru