Как сделать что-бы компанент не мелькал

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

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

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Как сделать что-бы компанент не мелькал

Сообщение EXIS » 02.09.2007 (Вс) 19:24

Пишу компанент, будущая таблица... Так вот если схватиться за разделитель мышкой и потащить, все разделитили начинают жутко мелькать. При движении миши использую Me.Refresh Может надо как-то подругому.



Код: Выделить всё
Public Class TargetManager

    Private Columns() As Integer
    Private ColumnIndex As Integer = -1

    Public Sub AddColumn(ByVal ColumnSize As Integer)

        Dim sz As Integer

        If Columns Is Nothing Then
            sz = 1
        Else
            sz = Columns.Length + 1
        End If
        Array.Resize(Columns, sz)
        Columns(sz - 1) = ColumnSize

    End Sub

    Public Sub DeleteColumn(ByVal Index As Integer)
        If Columns.Length = 1 And Index = 0 Then
            Columns = Nothing
        Else
            Array.Copy(Columns, Index + 1, Columns, Index, Columns.Length - Index - 1)
            Array.Resize(Columns, Columns.Length - 1)
        End If
    End Sub



    Private Sub TargetManager_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim x As Integer
        Dim s As Integer

        If Columns IsNot Nothing Then
            s = 0
            For x = 0 To Columns.Length - 1
                s = s + Columns(x)
                e.Graphics.DrawLine(Pens.Black, s, 0, s, Me.Height)
            Next x
        End If

    End Sub

    Private Sub TargetManager_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Dim i As Integer
        Dim s As Integer

        If ColumnIndex = -1 Then
            Me.Cursor = Cursors.Arrow

            If Columns IsNot Nothing Then
                s = 0
                For i = 0 To Columns.Length - 1
                    s = s + Columns(i)
                    If e.X > s - 2 And e.X < s + 2 Then
                        Me.Cursor = Cursors.SizeWE
                    End If
                Next i
            End If
        Else
            s = 0
            For i = 0 To ColumnIndex - 1
                s = s + Columns(i)
            Next
            Columns(ColumnIndex) = e.X - s
            Me.Refresh()
        End If

    End Sub

    Private Sub TargetManager_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        Dim i As Integer
        Dim s As Integer
        If Columns IsNot Nothing Then
            s = 0
            For i = 0 To Columns.Length - 1
                s = s + Columns(i)
                If e.X > s - 2 And e.X < s + 2 Then
                    ColumnIndex = i
                End If
            Next i
        End If
    End Sub

    Private Sub TargetManager_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        ColumnIndex = -1
    End Sub

End Class


Как сделать что-бы граффика компанента не мелькала?

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

Сообщение Nord777 » 02.09.2007 (Вс) 22:14

поиграйся с флагами
Код: Выделить всё
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.SetStyle(ControlStyles.SupportsTransparentBackColor, False)
        Me.SetStyle(ControlStyles.Opaque, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 02.09.2007 (Вс) 22:42

А кроме этого...
Можно ли вызвать paint не через refresh а через riseevent paint() ?

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

Сообщение Nord777 » 03.09.2007 (Пн) 16:59

можешь попробовать кинуть WM_PAINT
А чем стили то не устраивают?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 03.09.2007 (Пн) 20:17

У меня тут просто еще одна старая идейка всплыла, не делать новый компанент а модифицировать как мне нужно, уже готовый DataGridView, но есть проблемка я в event Paint прописываю дополнительный код связанный с отрисовкой, а в mousemove делаю вставляю Refres, так вот когда хватаешся за разделитель и тянешь мышью, компанент начинает мелькать. флаги не помогают, нужна либо какаета буферизация компанета в графический массив или что-то другое а не refresh.

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

Сообщение Nord777 » 03.09.2007 (Пн) 21:42

Надо смотреть код.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 04.09.2007 (Вт) 20:30

Добавляешь DataGrid называешь его Grid.
Берешь второй горизонтальный разделитель и начинайте таскать вверх или вниз и прямоугольники начнут мигать, а как сделать чтоб не мигали непонятно.

Код: Выделить всё
Public Class Form1

    Dim LineGet As Integer = 0
    Dim Msx As Integer = 0
    Dim Msy As Integer = 0

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i As Integer = 0

        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.UserPaint, True)
        Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)

        Grid.GridColor = Color.Black

        Grid.ColumnHeadersVisible = False
        Grid.RowHeadersVisible = False
        Grid.RowCount = 3
        Grid.ColumnCount = 4
        Grid.Columns(1).Width = 175
        Grid.Columns(2).Width = 95
        Grid.Columns(3).Width = 167
        Grid.Rows(1).Height = 167
        Grid.Rows(2).Height = 170

        ' Заголовок высота и блокировка
        Grid.Rows(0).Height = 40

        ' Запрещаем ресайзить горизонтальный разделитель целей
        Grid.Rows(1).Resizable = DataGridViewTriState.False

        Grid.Columns(0).Width = 40
        Grid.Columns(0).Resizable = DataGridViewTriState.False
        Grid.Columns(0).ReadOnly = True

    End Sub

    Private Sub Grid_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Grid.Paint

        Dim i As Integer = 0

        Dim SpecFont As New Font("Arial", 10, FontStyle.Bold)

        e.Graphics.TranslateTransform(10, Grid.Rows(0).Height + Grid.Rows(1).Height / 2 + CInt(e.Graphics.MeasureString("Текст1", SpecFont).Width) / 2)
        e.Graphics.RotateTransform(-90)
        e.Graphics.DrawString("Текст1", SpecFont, Brushes.Black, 0, 0)

        e.Graphics.ResetTransform()
        e.Graphics.TranslateTransform(10, Grid.Rows(0).Height + Grid.Rows(1).Height + Grid.Rows(2).Height / 2 + CInt(e.Graphics.MeasureString("Текст2", SpecFont).Width) / 2)
        e.Graphics.RotateTransform(-90)
        e.Graphics.DrawString("Текст2", SpecFont, Brushes.Black, 0, 0)

        'Отрисовка задач
        e.Graphics.ResetTransform()
        e.Graphics.FillRectangle(Brushes.RoyalBlue, New Rectangle(Grid.Columns(0).Width + 5, Grid.Rows(0).Height + 5, Grid.Columns(1).Width - 7, 16))
        e.Graphics.FillRectangle(Brushes.Red, New Rectangle(Grid.Columns(0).Width + 5, Grid.Rows(0).Height + 5 + 19, Grid.Columns(1).Width - 7, 16 + 16 + 3))
    End Sub

    Private Sub Grid_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Grid.MouseUp
        If LineGet = 1 Then
            LineGet = 0
            Grid.Rows(1).Height = e.Y
        End If
    End Sub

    Private Sub Grid_MouseDown1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Grid.MouseDown
        Dim i As Integer
        i = Grid.Rows(0).Height + Grid.Rows(1).Height
        If e.Y > i - 4 And e.Y < i + 4 Then
            LineGet = 1
            Grid.Refresh()
        End If
    End Sub

    Private Sub Grid_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Grid.MouseMove

        Dim i As Integer
        If LineGet = 0 Then
            i = Grid.Rows(0).Height + Grid.Rows(1).Height
            If e.Y > i - 4 And e.Y < i + 4 Then
                Grid.Cursor = Cursors.SizeNS
            Else
                Grid.Cursor = Cursors.Default
            End If
        Else
            Msx = e.X
            Msy = e.Y
            Grid.Refresh()
        End If

    End Sub
End Class

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

Сообщение Nord777 » 06.09.2007 (Чт) 20:57

Код: Выделить всё
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Grid.GridColor = Color.Black
        Grid.ColumnHeadersVisible = False
        Grid.RowHeadersVisible = False
        Grid.RowCount = 3
        Grid.ColumnCount = 4
        Grid.Columns(1).Width = 175
        Grid.Columns(2).Width = 95
        Grid.Columns(3).Width = 167
        Grid.Rows(1).Height = 167
        Grid.Rows(2).Height = 170
        Grid.Columns(0).Width = 40
        Grid.Columns(0).ReadOnly = True

        Grid.Columns(0).Resizable = DataGridViewTriState.False
        Grid.Columns(0).ReadOnly = True

        Dim CS As New DataGridViewCellStyle()
        CS.Alignment = DataGridViewContentAlignment.MiddleCenter
        Grid.Rows(0).Cells(1).Value = "11"
        Grid.Rows(0).Cells(1).Style = CS
        Grid.Rows(0).Cells(2).Value = "22"
        Grid.Rows(0).Cells(2).Style = CS
    End Sub
End Class


Код: Выделить всё
Public Class myDataGrid
    Inherits DataGridView

    Dim SpecFont As New Font("Arial", 10, FontStyle.Bold)

    Protected Overrides Sub OnCellPainting(ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs)
        If e.RowIndex = 0 Or e.ColumnIndex = 0 Then
            e.Graphics.FillRectangle(Brushes.LightSkyBlue, e.CellBounds)
        Else
            e.Graphics.FillRectangle(Brushes.MintCream, e.CellBounds)
        End If

        If e.RowIndex = 1 And e.ColumnIndex = 1 Then
            Dim R As Rectangle = e.CellBounds
            R.Height \= 3
            e.Graphics.FillRectangle(Brushes.Red, R)
        End If

    End Sub

    Protected Overrides Sub OnRowPrePaint(ByVal e As _ System.Windows.Forms.DataGridViewRowPrePaintEventArgs)
        e.PaintParts = DataGridViewPaintParts.ContentForeground Or DataGridViewPaintParts.Border
    End Sub

End Class

вот как то так.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 06.09.2007 (Чт) 22:12

Nord777
Пример нерабочий и содержит много не точностей

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

Сообщение Nord777 » 06.09.2007 (Чт) 22:51

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

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 06.09.2007 (Чт) 23:26

Nord777 Пример абсолютно не рабочий :P
но все равно спасибо... к примеру посмотри:

1) Dim CS As New DataGridViewCellStyle()
Grid.Rows(0).Cells(1).Style = CS
Ты создал просто копию класса DataGridViewCellStyle а нужно было сделать копию класса myDataGrid

2) Inherits DataGridView в myDataGrid не совместим с DataGridViewCellStyle в Inherits нужно было прописать тогда уж
DataGridViewCellStyle а не DataGridView.

Это так на вскидку в прочем я нашел решение в SourceGrid
Отрисовка другого бэк граунда в ячейке делается так:

Код: Выделить всё
        Dim V As New myView

        Grid(1, 2).View = V
        Grid(2, 2).View = V


Код: Выделить всё
    Private Class myView
        Inherits SourceGrid.Cells.Views.Cell

        Protected Overrides Sub OnDraw(ByVal graphics As DevAge.Drawing.GraphicsCache, ByVal area As System.Drawing.RectangleF)
            MyBase.OnDraw(graphics, area)
            graphics.Graphics.DrawEllipse(Pens.Red, area)
        End Sub
    End Class

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

Сообщение Nord777 » 07.09.2007 (Пт) 16:27

Вот ведь настырный попался! ))
2) Inherits DataGridView в myDataGrid не совместим с DataGridViewCellStyle в Inherits нужно было прописать тогда уж
DataGridViewCellStyle а не DataGridView.
А я и не говорил о совместимости DataGridViewCellStyle с DataGridView.
Переопределенный компонент помещается на форму в Design tim'e простым перетаскиванием, а не создается во время исполнения, как это ты предположил. Вот такие вот дела...
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 10.09.2007 (Пн) 20:55

Допустим у меня есть таблица DataGridView, как сделать что-бы там где красная полоса нельзя было ресайзить линии, а там где голубая можно? смотрите рисунок.
Вложения
Таблица.jpg
Таблица.jpg (78.56 Кб) Просмотров: 2398

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 12.09.2007 (Ср) 21:14

Ладно скажите честно, это вообще возможно? :)

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

Сообщение Nord777 » 13.09.2007 (Чт) 18:42

Возможно, но
значит рано ты берешся за это дело. Написание визуальных компонентов - не тривиальная задача.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 18.09.2007 (Вт) 17:58

Хм... Все не читал, но как я понял ты переопределяешь класс грида? Попробуй реализовать двойную буферизацию при onPaint
С уважением,
Игорь Шувалов aka Ronin

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 18.09.2007 (Вт) 19:12

Ronin
Пожалуйста кинь ссылку на пример как это делается. Если есть конечно.

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 18.09.2007 (Вт) 21:11

Так... Ищи в примерах к книге Мэтью Макдональда "Рецепты программирования на Visual Basic .NET" издетельство "Русская редакция" microsoft. www.rusedit.ru
Там скачаешь и смотри рецепт 12.18
С уважением,
Игорь Шувалов aka Ronin

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

Сообщение Ramzes » 19.09.2007 (Ср) 13:20

Ronin писал(а):Так... Ищи в примерах к книге Мэтью Макдональда "Рецепты программирования на Visual Basic .NET" издетельство "Русская редакция" microsoft. www.rusedit.ru
Там скачаешь и смотри рецепт 12.18

неплохая книга! ее б сюда всю переписать :)

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 19.09.2007 (Ср) 20:29

Книгу смотреть лучше наверно сдесь...
http://depositfiles.com/files/1649476

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 19.09.2007 (Ср) 21:18

Ronin
Смотрел пример, но мне нужно, сначала сделать снимок DataGridView в картинку, а потом поверх него уже что-о рисовать. А я не знаю как сделать снимок компанента. А в этом примере, все заранее рисуется в буфер и выводится на экран.

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 21.09.2007 (Пт) 1:11

Хм.. Насколько я помню, у каждого компонента есть "снимок". Его можно вытащить, думаю при onpaint через e.
Переопредели рисование вообще и сделай строенную поддержку всего этого
С уважением,
Игорь Шувалов aka Ronin

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 21.09.2007 (Пт) 1:15

К примеру еще можешь сделать такую штуку - при прокрутки или изменении размера колонок блокируй свою прорисовку. Тоесть пока он двигает, у компонента - стандартный вид. а когда отпустит то все норм прорисуется. Идея понятна?
С уважением,
Игорь Шувалов aka Ronin

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

Сообщение Ramzes » 21.09.2007 (Пт) 18:12

Control.DrawToBitmap()

EXIS
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 02.05.2006 (Вт) 17:16

Сообщение EXIS » 21.09.2007 (Пт) 20:41

Развиваем тему:

Делаем проект, добавляем DataGridView именуем его как Data, вставляем следующий код:

Код: Выделить всё
Public Class Form1
    Dim gr As Graphics = Graphics.FromHwnd(Me.Handle)
    Dim bv As System.Drawing.Bitmap

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Data.ColumnCount = 5
    End Sub

    Private Sub Data_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Data.GotFocus
        bv = New System.Drawing.Bitmap(Data.Width, Data.Height)
    End Sub

    Private Sub Data_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Data.Paint
        Data.DrawToBitmap(bv, New Rectangle(0, 0, Data.Width, Data.Height))
        gr.DrawImage(bv, 1, 1)
        gr.DrawLine(New Pen(Color.Black), 0, 0, 50, 50)
    End Sub
End Class


Картинка таблицы переносится на форму при малейшем изменении таблицы. Результат в прикрепленном файле.

Ronin
Ramzes Спасибки
Вложения
Таблица.jpg
Таблица.jpg (262.55 Кб) Просмотров: 2391


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

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

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

    TopList