Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
2066 / 1483 / 384
Регистрация: 26.06.2017
Сообщений: 4,252
1

Операция с Visual Styles привела к ошибке, поскольку сейчас нет активных стилей отображения

03.02.2021, 22:14. Показов 3158. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Создаю собственную прорисовку ComboBox (см. код ниже), взято отсюда. Однако при добавлении элемента UserControl1 на форму возникает сообщение: Visual Styles-related operation resulted in an error because no visual style is currently active. (Операция с Visual Styles привела к ошибке, поскольку сейчас нет активных стилей отображения.). Никак не соображу, что делаю не так. Проблема исчезает при комментировании SetStyle, но тогда не вызывается OnPaint. В чём проблема?
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Imports System.ComponentModel
Imports System.Windows.Forms.VisualStyles
 
Public Class UserControl1
    Inherits ComboBox
 
    Private Sub InitializeMe()
        Font = New Font("Lato", 10)
        ForeColor = Color.FromArgb(105, 203, 242)
        'DropDownStyle = ComboBoxStyle.DropDownList
        'Me.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable
 
        SetStyle(ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True)
 
        Me.PerformLayout()
    End Sub
 
    Public Sub New()
        MyBase.New()
        InitializeComponent()
        InitializeMe()
    End Sub
 
    Private _textFormatFlags As TextFormatFlags = TextFormatFlags.VerticalCenter Or TextFormatFlags.Left
 
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim ctrlRectangle As Rectangle = Me.ClientRectangle
        Dim buttonW As Integer = 15
        Dim border As Integer = 5
        Dim textRectange As Rectangle = ctrlRectangle
        textRectange.Width -= buttonW
        textRectange.Width -= border
        Dim buttonRectangle As Rectangle = Rectangle.FromLTRB(textRectange.Right + border, textRectange.Top, ctrlRectangle.Right, textRectange.Bottom)
        Using br As Brush = New SolidBrush(BackColor)
            e.Graphics.FillRectangle(br, ctrlRectangle)
        End Using
        Dim sf As StringFormat = New StringFormat(StringFormatFlags.NoWrap)
        sf.LineAlignment = StringAlignment.Center
        Using br As Brush = New SolidBrush(ForeColor)
            e.Graphics.DrawString("OKiOkiText", Font, br, textRectange, sf)
        End Using
        Me.DropDownWidth = GetDropDownWidth()
        ComboBoxRenderer.DrawDropDownButton(e.Graphics, buttonRectangle, ComboBoxState.Normal)
    End Sub
 
    Public Function GetDropDownWidth() As Integer
        Dim w As Integer = ClientRectangle.Width
        For Each s As Object In Items
            Dim curW As Integer = TextRenderer.MeasureText(s.ToString(), Font).Width
            If curW > w Then
                w = curW
            End If
        Next
        Return w
    End Function
 
    Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
        If e.Index < 0 OrElse e.State = DrawItemState.ComboBoxEdit Then
            Return
        End If
        Dim g As Graphics = e.Graphics
        Dim ctrlRectangle As Rectangle = e.Bounds
        Dim buttonW As Integer = 0
        Dim border As Integer = 0
        Dim textRectange As Rectangle = ctrlRectangle
        textRectange.Width -= buttonW
        textRectange.Width -= border
        Dim textToPaint As String = ""
        Using br As Brush = New SolidBrush(e.BackColor)
            g.FillRectangle(br, ctrlRectangle)
        End Using
        Dim drawColor As Color = ColorDeactiveItem
        If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
            drawColor = ColorActiveItem
        End If
        Using br As Brush = New SolidBrush(drawColor)
            g.FillRectangle(br, textRectange)
        End Using
        If e.Index <> -1 AndAlso Items.Count > 0 Then
            textToPaint = GetItemText(Items(e.Index))
                Using br As Brush = New SolidBrush(e.ForeColor)
                    e.Graphics.DrawString(textToPaint, e.Font, br, textRectange)
                End Using
        End If
    End Sub
 
End Class
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2021, 22:14
Ответы с готовыми решениями:

Установка PHP5 привела к ошибке
Установил пхп5. настроил пхп.ини по старому принципу. Перезагружаю апач и выдает ошибку без каких...

Шаблонное название стилей - core-styles
Добрый день. Часто вижу, что среди стилей сайта, файл стилей под названием &quot;core-styles&quot; или...

Операция не может быть завершена, поскольку эти папки или файл открыты
Здраствуйте!Прошу помощи у вас ибо сам уже закалебался мучится с этой проблемой!Как вы поняли я не...

Сообщение об ошибке "Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна"
Доброго всем вечера! После последнего обновления Windows 10 некоторые приложения начали выдавать...

6
4638 / 3596 / 853
Регистрация: 02.02.2013
Сообщений: 3,474
Записей в блоге: 2
04.02.2021, 17:31 2
Думаю, что если убрать InitializeComponent, все благополучно разрешиться.
Ну и, наверное, нужно определить
VB.NET
1
2
Public Property ColorDeactiveItem As Color = Color.LightGray
Public Property ColorActiveItem As Color = Color.Black
Изображения
 
1
2066 / 1483 / 384
Регистрация: 26.06.2017
Сообщений: 4,252
04.02.2021, 18:21  [ТС] 3
ovva, увы но не выходит.
Вложения
Тип файла: zip TestApplication.zip (75.7 Кб, 4 просмотров)
0
4638 / 3596 / 853
Регистрация: 02.02.2013
Сообщений: 3,474
Записей в блоге: 2
04.02.2021, 19:55 4
Цитата Сообщение от Uswer Посмотреть сообщение
Однако при добавлении элемента UserControl1 на форму возникает сообщение
Такой проблемы не наблюдается. Это никакой не UserControl, а обычный класс, наследуемый от ComboBox. Для получения картинки выше использовался ваш код лишь слегка подредактированный.
Цитата Сообщение от Uswer Посмотреть сообщение
увы но не выходит
Вы бы пояснили, какого эффекта вы ожидаете.
0
2066 / 1483 / 384
Регистрация: 26.06.2017
Сообщений: 4,252
04.02.2021, 22:01  [ТС] 5
Цитата Сообщение от ovva Посмотреть сообщение
Вы бы пояснили, какого эффекта вы ожидаете.
Хочу такого эффекта как у Вас, а имею вот что (см. картинку).
Миниатюры
Операция с Visual Styles привела к ошибке, поскольку сейчас нет активных стилей отображения  
0
4638 / 3596 / 853
Регистрация: 02.02.2013
Сообщений: 3,474
Записей в блоге: 2
04.02.2021, 22:29 6
Цитата Сообщение от Uswer Посмотреть сообщение
такого эффекта как у Вас
Вот код соответствующий приложенной картинке
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        'UCB добавленный на форму UserComboBox
        UCB.Items.AddRange({"1111", "2222", "3333"})
    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
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Imports System.ComponentModel
Imports System.Windows.Forms.VisualStyles
Public Class UserComboBox
    Inherits ComboBox
    Private Sub InitializeMe()
        Font = New Font("Lato", 10)
        ForeColor = Color.FromArgb(105, 203, 242)
        DropDownStyle = ComboBoxStyle.DropDownList
        Me.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable
        SetStyle(ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True)
        Me.PerformLayout()
    End Sub
 
    Public Sub New()
        MyBase.New()
        InitializeMe()
    End Sub
 
    Public Property ColorDeactiveItem As Color = Color.LightGray
    Public Property ColorActiveItem As Color = Color.Black
 
    Private _textFormatFlags As TextFormatFlags = TextFormatFlags.VerticalCenter Or TextFormatFlags.Left
 
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim ctrlRectangle As Rectangle = Me.ClientRectangle
        Dim buttonW As Integer = 15
        Dim border As Integer = 5
        Dim textRectange As Rectangle = ctrlRectangle
        textRectange.Width -= buttonW
        textRectange.Width -= border
        Dim buttonRectangle As Rectangle = Rectangle.FromLTRB(textRectange.Right + border, textRectange.Top, ctrlRectangle.Right, textRectange.Bottom)
        Using br As Brush = New SolidBrush(BackColor)
            e.Graphics.FillRectangle(br, ctrlRectangle)
        End Using
        Dim sf As StringFormat = New StringFormat(StringFormatFlags.NoWrap)
        sf.LineAlignment = StringAlignment.Center
        Using br As Brush = New SolidBrush(ForeColor)
            e.Graphics.DrawString("OKiOkiText", Font, br, textRectange, sf)
        End Using
        Me.DropDownWidth = GetDropDownWidth()
        ComboBoxRenderer.DrawDropDownButton(e.Graphics, buttonRectangle, ComboBoxState.Normal)
    End Sub
 
    Public Function GetDropDownWidth() As Integer
        Dim w As Integer = ClientRectangle.Width
        For Each s As Object In Items
            Dim curW As Integer = TextRenderer.MeasureText(s.ToString(), Font).Width
            If curW > w Then
                w = curW
            End If
        Next
        Return w
    End Function
 
    Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
        If e.Index < 0 OrElse e.State = DrawItemState.ComboBoxEdit Then
            Return
        End If
        Dim g As Graphics = e.Graphics
        Dim ctrlRectangle As Rectangle = e.Bounds
        Dim buttonW As Integer = 0
        Dim border As Integer = 0
        Dim textRectange As Rectangle = ctrlRectangle
        textRectange.Width -= buttonW
        textRectange.Width -= border
        Dim textToPaint As String = ""
        Using br As Brush = New SolidBrush(e.BackColor)
            g.FillRectangle(br, ctrlRectangle)
        End Using
        Dim drawColor As Color = _ColorDeactiveItem
        If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
            drawColor = _ColorActiveItem
        End If
        Using br As Brush = New SolidBrush(drawColor)
            g.FillRectangle(br, textRectange)
        End Using
        If e.Index <> -1 AndAlso Items.Count > 0 Then
            textToPaint = GetItemText(Items(e.Index))
            Using br As Brush = New SolidBrush(e.ForeColor)
                e.Graphics.DrawString(textToPaint, e.Font, br, textRectange)
            End Using
        End If
    End Sub
End Class

PS. Среда:
- VS2010 Ultimate, а у вас, как я понял, версия Express
- NET 4.0 Client, м.б. попробовать поставить полную версию NET 4.0
0
2066 / 1483 / 384
Регистрация: 26.06.2017
Сообщений: 4,252
04.02.2021, 23:01  [ТС] 7
Решено.
ovva, спасибо за помощь. Кому будет интересно почему у меня (и возможно у Вас) так, то внимательно читаем ms-доки . Дело в стиле темы оформления операционной системы, если включен классический стиль, то имеем InvalidOperationException при вызове методов класса ComboBoxRenderer.

Ну и в догонку как правильно решить задачку:
VB.NET
1
2
3
4
5
If Not ComboBoxRenderer.IsSupported Then
    ControlPaint.DrawComboButton(e.Graphics, buttonRectangle, ButtonState.Normal)
Else
    ComboBoxRenderer.DrawDropDownButton(e.Graphics, buttonRectangle, ComboBoxState.Normal)
End If
P.S. Для меня остаётся загадкой почему ComboBoxRenderer не реализует отрисовку элементов для классического стиля.
1
04.02.2021, 23:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2021, 23:01
Помогаю со студенческими работами здесь

Сообщение об ошибке: "Не удалось запустить приложение, поскольку его параллельная конфигурация неправильная"
Всех приветствую. Пожалуйста помогите разобраться с проблемой:cry:. Вот только сегодня установил...

Операция горизонтального отображения прямоугольной матрицы
Можете помочь? Нужно написать функцию для операции горизонтального отображения прямоугольной...

Очередь: операция удаления и отображения текущего состояния
2. Розробити програму роботи з чергою, яка реалізує операції додавання, видалення елементів з черги...

Стек: операция удаления и отображения текущего состояния
1. Розробити програму роботи зі стеком, яка реалізує операції додавання, видалення елементів зі...

Visual Studio 2013: С# Debug - не может начать отладку, поскольку цель отладки отсутствует
Всем привет! У меня такая проблема, вообщем я установил визуал студио 2013, и начал учить С#,...

Visual studio 2015 Не удалось запустить приложение, поскольку его параллельная конфигурация неправильная
Здравствуйте. Установила приложение visual studio 2015 и выдает такую ошибку : Не удалось...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru