Рамка выделения.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Рамка выделения.

Сообщение Antonariy » 04.06.2008 (Ср) 14:03

Хочу в treeview добавить multiselect, а рисовать собственную рамку в лом. Может есть какие-то специализированные апи для работы с рамкой выделения? Как ее ListView рисует?
Лучший способ понять что-то самому — объяснить это другому.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.06.2008 (Ср) 14:15

Имеется ввиду так называемая "резиновая лента" или нечто другое? Если речь про нее, то вроде нет никаких специальных API - Rectangle, SetROP2 и R2_XORPEN в руки. И минут десять на реализацию.
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.06.2008 (Ср) 14:33

Имеется ввиду так называемая "резиновая лента" или нечто другое?
Имеется ввиду прямоугольная сущность, с помощью которой ты драгом выделяешь несколько иконок на рабочем столе.
И минут десять на реализацию.
Минут 10, если разбираешься в API-рисовании. Я даже не знаю в какой последовательности вызывать вышеуказанные функции.
Неохота тратить целый день на самостоятельные разборки. Есть готовый пример?
Лучший способ понять что-то самому — объяснить это другому.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.06.2008 (Ср) 14:44

Угу, именно про "резиновую ленту" и речь. Щаз попробую наваять примерчик. Правда потом придется обработать напильником по месту.
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.06.2008 (Ср) 15:15

Итак вот оно:

В Declaration
Код: Выделить всё
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetROP2 Lib "gdi32" (ByVal hdc As Long, ByVal nDrawMode As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Const R2_NOTXORPEN As Long = 10 ' режим смешивания при котором при повторном рисовании старое страется

Private Const PS_DASH As Long = 1   ' стиль пера (пунктирная линия)
Private Const PS_DOT = 2            ' стиль пера (пунктирная линия)



Private hPen As Long        ' описатель пера
Private hOldPen As Long     ' описатель "старого" пера
Private oldROP2 As Long     ' "старый" режим смешивания
Private bDraw As Boolean    ' указывает на режим рисования

Private nX1 As Long         ' координаты прямоугольника
Private nY1 As Long
Private nX2 As Long
Private nY2 As Long


В код обработки мышиных событий объекта на котором рисуем:
Код: Выделить всё
Private Sub picDrawZone_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbLeftButton Then
        ' создаем перо
        hPen = CreatePen(PS_DOT, 1, vbRed) ' или PS_DASH (штрих линия)
        ' выбираем перо
        hOldPen = SelectObject(picDrawZone.hdc, hPen)
        ' устанавливаем режим смешения
        oldROP2 = SetROP2(picDrawZone.hdc, R2_NOTXORPEN)
        ' устанавливаем режим рисования
        bDraw = True
        ' запоминаем исходные координаты
        nX1 = X
        nY1 = Y
    End If
End Sub

Private Sub picDrawZone_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If bDraw Then
        ' при первом вызове не рисуем
        ' для проверки лучше использовать флаг вместо проверки на нули
        If nX2 <> 0 And nY2 <> 0 Then
            ' стираем предыдущий прямоугольник
            Rectangle picDrawZone.hdc, nX1, nY1, nX2, nY2
        End If
        ' запоминаем новые координаты и рисуем новый прямоугольник
        nX2 = X
        nY2 = Y
        Rectangle picDrawZone.hdc, nX1, nY1, nX2, nY2
    End If
End Sub

Private Sub picDrawZone_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If bDraw Then
        ' стираем предыдущий прямоугольник
        Rectangle picDrawZone.hdc, nX1, nY1, nX2, nY2
        ' восстанавливаем перо и режим смешения
        SelectObject picDrawZone.hdc, hOldPen
        SetROP2 picDrawZone.hdc, oldROP2
        ' обнуляем координаты
        nX2 = 0
        nY2 = 0
        ' отменяем режим рисования
        bDraw = False
    End If
End Sub

EDIT: поправил, вместо R2_XORPEN = 7, надо юзать R2_NOTXORPEN = 10. Иначе рамка будет рисоваться инвертным цветом.
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.06.2008 (Ср) 16:46

Спасибо :)
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.06.2008 (Ср) 20:30

Эээ. DrawFocusRect же есть, зачем Rectangle со всемти этими флагами?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.06.2008 (Чт) 7:50

Хакер писал(а):Эээ. DrawFocusRect же есть, зачем Rectangle со всемти этими флагами?
Не знал, что DrawFocusRect XOR-функция. Но всяко придется рисовать с флагами. Другое дело что если нужен фокус выбора со стандартными параметрами, то лучше DrawFocusRect, если же надо что-то нестандартное (цвет, тип, толщина пера), то лучше через Rectangle (ИМХО!).
Весь мир матрица, а мы в нем потоки байтов!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.06.2008 (Чт) 9:54

А DrawFocusRect разве закрашивает свой рект? У меня рисуется только контур.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.06.2008 (Чт) 11:26

Нет. Она делает ровно то, что отражено в её названии.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.06.2008 (Чт) 11:35

Имеется ввиду прямоугольная сущность, с помощью которой ты драгом выделяешь несколько иконок на рабочем столе

Так ведь там как раз закрашеный рект, по крайней мере, в ХР. Какую, интересно, функцию юзать, чтобы квадрат выбора был именно таким?
Артур
 
   

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 05.06.2008 (Чт) 13:13

Вот что получилось. Выделение с помощью ctrl работает, мышкой - глючит. Почему глючит знаю, не знаю, почему не работает EnumTree, которая должна эту проблему решить. И еще не знаю как заставить treeview перерисовать конкретный айтем.
Вложения
tvm.rar
(46.13 Кб) Скачиваний: 72
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 06.06.2008 (Пт) 17:11

С EnumTree разобрался, вопрос про перерисовку актуален.
Код эволюционировал в кирпич.
Лучший способ понять что-то самому — объяснить это другому.


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

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

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

    TopList