Различные аспекты рисования UserControl

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Различные аспекты рисования UserControl

Сообщение ger_kar » 13.04.2016 (Ср) 10:24

Раньше с графическими методами VB особо не работал, а сейчас при использовании их для рисования контрола выявилось несколько интересных нюансов:
1) При использовании метода Line линия прорисовывается до последней заданной координаты, но сама последняя координата не прорисовывается.
Например (координаты в пикселах): Line (2, 2) - (2, 10) Нарисует линию с последним закрашенным пискселем по координатам 2:9, а пиксел с координатами 2:10 останется не закрашенным. (Для меня это показалось очень странным поведением).
2) У UserControl есть границы определяемые свойствами ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight, так вот если попробовать нарисовать границы вокруг контрола используя координаты этих границ, то верхняя и левая границы будут отрисованы нормально, а вот с правой и нижней выйдет облом, так как нарисованные линии уйдет за границы контрола и будут не видны, и для того, что бы они стала таки видимыми, их следует рисовать отступив от краёв на один пиксел, что тоже очень странно.

Ну, а теперь собственно вопрос. Хочу нарисовать контрол с закругленными краями, и соответственно лишние уголки нужно сделать прозрачными. Встает вопрос использования свойств MaskColor и MaskPicture. Так как контрол должен изменяться в размерах, то статическая битовая маска ну никак не подходит, и ее надо делать динамически. Для этого можно использовать такой код:
Код: Выделить всё
...
'Ставим цвет маски, для прозрачных мест
UserControl.MaskColor = vbRed
'Рисуем маску
...
'Применяем маску
Set UserControl.MaskPicture = UserControl.Image

'Рисуем дальше
...
Все будет работать как нужно только при условии установки свойства AutoRedraw = True, если же эту установку сбросить в False и делать отрисовку в событии Paint, то такой метод установки прозрачности нифига не работает. Почему? И вообще можно использовать и Paint и делать прозрачные области у контрола одновременно?
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Различные аспекты рисования UserControl

Сообщение The trick » 13.04.2016 (Ср) 16:23

Юзай регионы. CreateRoundRectRgn
UA6527P

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Различные аспекты рисования UserControl

Сообщение ger_kar » 13.04.2016 (Ср) 16:28

Ну, при помощи WinAPI можно конечно сделать. Но мне таки охота узнать возможно этот вопрос решить средствами VB или нет. Почему в одном случае технология срабатывает, а в другом нет. Т.е. это ограничения реализации или все таки я что то неправильно делаю?
Бороться и искать, найти и перепрятать

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Различные аспекты рисования UserControl

Сообщение bon818 » 13.04.2016 (Ср) 18:19

А такое подойдет ?
UserControl.BackColor = 0 цвет
UserControl.BackStyle = 0 прозрачность для этого цвета

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Различные аспекты рисования UserControl

Сообщение ger_kar » 14.04.2016 (Чт) 11:44

bon818 писал(а):А такое подойдет ?
Не, такое не прокатывает.

Но моя задача наверное вообще VB средствами не разрешима и видимо придется юзать таки Win API
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Различные аспекты рисования UserControl

Сообщение ger_kar » 14.04.2016 (Чт) 12:09

Тут по ходу моих зарисовок еще одна проблемка образовалась. Как можно получить цвет бордюра TextBox для текущего стиля Windows XP?
Пытался получить так:

Код: Выделить всё
...
Declare Function OpenThemeData Lib "uxtheme.dll" (ByVal hwnd As Long, ByVal pszClassList As Long) As Long
Declare Function GetThemeInt Lib "uxtheme.dll" (ByVal hTheme As Long, ByVal iPartID As Long, ByVal iStateID As Long, ByVal iPropId As Long, ByRef pValue)
As Long
...
hTheme = OpenThemeData(Text.hwnd, StrPtr("EDIT"))

'Первый вариант
HRESULT = GetThemeInt(hTheme, EP_EDITTEXT, ETS_NORMAL, TMT_BORDERCOLOR, BorderColor)
'Второй вариант
HRESULT = GetThemeInt(hTheme, EP_BACKGROUNDWITHBORDER, ETS_NORMAL, TMT_BORDERCOLOR, BorderColor)

HRESULT возвращает 0 (ОК). Стало быть ошибок вроде как и не было, но и цвет при этом тоже не возвращается - BorderColor=0

С iPartID, iStateID, iPropId я всяко экспериментировал и даже пробовал перебирать их в цикле.
Код: Выделить всё
        For I = 1 To 200
            For J = 1 To 200
                For Z = 0 To 10000
                    HResult = GetThemeInt(hTheme, I, J, Z, BorderColor)
                    If Result <> 0 Then Stop
                    If HResult = 0 Then Stop
                Next
            Next
        Next
Но кроме нуля в BorderColor больше ничего не возвращается.
Где тут подвох?
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Различные аспекты рисования UserControl

Сообщение ger_kar » 14.04.2016 (Чт) 18:49

Вопрос с получением цвета я решил, просто заменив вызов GetThemeInt на GetThemeColor, у этих функций даже аргументы совпадают, как выяснилось. Но остался вопрос. В интернете я видел примеры кода получения цвета именно через GetThemeInt, вот тут например, да и исходя из описания функции на MSDN она для этого предназначена, но почему то не работает. Правда есть замечание, что она типа для Windows Vista и выше или Windows Server 2003 и выше, но думаю не это влияет, так как функция в XP присутствует, да и Windows Server 2003 по сути от XP не сильно отличается в плане интерфейсных фишек.
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Yandex-бот и гости: 42

    TopList