TabControl OnPaint调用

时间:2015-12-18 11:29:45

标签: c# tabcontrol onpaint

我有自定义TabControl控件。这是OnPaint方法:

Protected Overrides Sub OnPaint(e As PaintEventArgs)

        G = e.Graphics
        G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        G.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit

        MyBase.OnPaint(e)

        G.Clear(ColorFromHex("#343843"))

        For I As Integer = 0 To TabPages.Count - 1

            Rect = GetTabRect(I)

            Dim Data As AccountData = DirectCast(TabPages(I).Tag, AccountData)

            If Data IsNot Nothing Then
                TabPages(I).ImageIndex = Data.Icon / 2
            End If

            If SelectedIndex = I Then

                Using B1 As New SolidBrush(ColorFromHex("#3A3E49"))
                    G.FillRectangle(B1, New Rectangle(Rect.X - 4, Rect.Y + 1, Rect.Width + 6, Rect.Height))
                End Using

            End If

            Using B1 As New SolidBrush(ColorFromHex("#737A8A"))

                If UpperText Then

                    Using F1 As New Font("Segoe UI", 7.75, FontStyle.Bold)
                        G.DrawString(TabPages(I).Text.ToUpper, F1, B1, New Point(Rect.X + 70, Rect.Y + 10))

                        If Data Is Nothing Then
                            G.DrawString("Idle", F1, B1, New Point(Rect.X + 70, Rect.Y + 20))
                        Else
                            G.DrawString(Data.Status, F1, B1, New Point(Rect.X + 70, Rect.Y + 20))
                            G.DrawString("Lv. " & Data.Level, F1, B1, New Point(Rect.X + 70, Rect.Y + 30))
                            G.DrawString(Data.IP & " IP / " & Data.RP & " RP", F1, B1, New Point(Rect.X + 70, Rect.Y + 40))
                        End If
                    End Using

                Else

                    Using F1 As New Font("Segoe UI semibold", 9)
                        G.DrawString(TabPages(I).Text, F1, B1, New Point(Rect.X + 50, Rect.Y + 11))
                    End Using

                End If

            End Using

            If Not I = 0 Then

                Using P1 As New Pen(ColorFromHex("#3B3D49")), P2 As New Pen(ColorFromHex("#2F323C"))
                    G.DrawLine(P1, New Point(Rect.X - 4, Rect.Y + 1), New Point(Rect.Width + 4, Rect.Y + 1))
                    G.DrawLine(P2, New Point(Rect.X - 4, Rect.Y + 2), New Point(Rect.Width + 4, Rect.Y + 2))
                End Using

            End If

            If Not IsNothing(ImageList) Then
                If Not TabPages(I).ImageIndex < 0 Then
                    G.DrawImage(ImageList.Images(TabPages(I).ImageIndex), New Rectangle(Rect.X + 10, Rect.Y + 10, 48, 48))
                End If
            End If

        Next

    End Sub

如您所见,它会检查标记。如果标记不为null,则会绘制Status属性,Level属性和IP / RP属性。每个标签都与播放器相关联,因此当播放器登录时,标签设置为相应的AccountData值,然后我调用以下内容进行更新:

public void UpdateAccountData(int index, AccountData data)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(() => this.UpdateAccountData(index, data)));

                return;
            }

            this.aetherTabControl1.TabPages[index].Tag = data;
            this.aetherTabControl1.TabPages[index].Invalidate(true);
            this.aetherTabControl1.TabPages[index].Update();
            this.aetherTabControl1.TabPages[index].Refresh();
        }

我知道这很糟糕,但我不确定每次更新AccountData的属性时如何重绘它。有没有更好的方法来做到这一点,而不是每次都重新粉刷它?

感谢。

1 个答案:

答案 0 :(得分:-1)

是的,有更好的方法。
方法1:您的AccountData属性会通过标签或文本框或其他控件反映在屏幕上,对吧?!?如果,在AccountData更新后,您重置了此类控件的值,它们将自动重新绘制...

方式2:坚持你的#34;我自己重拍&#34;方法,你可以缓冲一堆东西,比如Brusher s,Color s并且可能动态地在sprite中转动图像,所以在重绘的最后,你只需要绘制一个精灵的不同部分,而不是整个事物......

相关问题