Имеется ввиду прямоугольная сущность, с помощью которой ты драгом выделяешь несколько иконок на рабочем столе.Имеется ввиду так называемая "резиновая лента" или нечто другое?
Минут 10, если разбираешься в API-рисовании. Я даже не знаю в какой последовательности вызывать вышеуказанные функции.И минут десять на реализацию.
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
Не знал, что DrawFocusRect XOR-функция. Но всяко придется рисовать с флагами. Другое дело что если нужен фокус выбора со стандартными параметрами, то лучше DrawFocusRect, если же надо что-то нестандартное (цвет, тип, толщина пера), то лучше через Rectangle (ИМХО!).Хакер писал(а):Эээ. DrawFocusRect же есть, зачем Rectangle со всемти этими флагами?
Имеется ввиду прямоугольная сущность, с помощью которой ты драгом выделяешь несколько иконок на рабочем столе
Сейчас этот форум просматривают: AhrefsBot и гости: 63