вырезать контрол

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
JIeT4uK
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 23.03.2003 (Вс) 4:48
Откуда: Украина, Донецк

вырезать контрол

Сообщение JIeT4uK » 04.02.2007 (Вс) 21:25

есть необходимость вывести десяток кнопок "неправильной формы"
нашел функцию которая в принципе это все делает

Код: Выделить всё
Public Function lGetRegion(pic As PictureBox, lBackColor As Long) As Long
   Dim lRgn As Long
   Dim lSkinRgn As Long
   Dim lStart As Long
   Dim lX As Long
   Dim lY As Long
   Dim lHeight As Long
   Dim lWidth As Long

   'создаем пустой регион, с которого начнем работу
   lSkinRgn = CreateRectRgn(0, 0, 0, 0)
   With pic
     'подсчитаем размеры рисунка в Pixel
     lHeight = .Height / Screen.TwipsPerPixelY
     lWidth = .Width / Screen.TwipsPerPixelX
     For lX = 0 To lHeight - 1
         lY = 0
         Do While lY < lWidth
           'ищем нужный Pixel
           Do While lY < lWidth And GetPixel(.hDC, lY, lX) = lBackColor
               lY = lY + 1
           Loop
           If lY < lWidth Then
               lStart = lY
           Do While lY < lWidth And GetPixel(.hDC, lY, lX) <> lBackColor
               lY = lY + 1
           Loop
           If lY > lWidth Then lY = lWidth
               'нужный Pixel найден, добавим его в регион
               lRgn = CreateRectRgn(lStart, lX, lY, lX + 1)
               CombineRgn lSkinRgn, lSkinRgn, lRgn, RGN_OR
               DeleteObject lRgn
           End If
         Loop
     Next
   End With
   lGetRegion = lSkinRgn
End Function


если применить ее для каждого контрола из массива, то все ОК (но это десять раз вызываеть одну и туже функцию)

есть ли вариант вариант вызвать ее один раз (например для одного контрола), а потом все остальные контролы сделать такими же ??

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.02.2007 (Вс) 22:34

Угу.
Что внутри этой функции, тебе понятно? Или она для тебя как магическое заклинание?
Изображение

JIeT4uK
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 23.03.2003 (Вс) 4:48
Откуда: Украина, Донецк

Сообщение JIeT4uK » 04.02.2007 (Вс) 23:09

понятно

AstSV
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 14.01.2007 (Вс) 15:37

Сообщение AstSV » 04.02.2007 (Вс) 23:19

Сдаётся мне, что кнопку лучше сделать заранее, а же потом размещать их на форме и лепить картинки. В противном случае ты стеснён размерами PictureBox при размещении элементов на форме и "неправильная" форма кнопки немного теряет смысл. Можно обойтись и прозрачностью. Потом, так или иначе ты решишь менять форму кнопки по ходу выполнения программы (режимы UP, Down, Disabled или ещё что-то). Я тоже нашёл этот пример и долго парился, пока не сделал OCX.

JIeT4uK
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 23.03.2003 (Вс) 4:48
Откуда: Украина, Донецк

Сообщение JIeT4uK » 04.02.2007 (Вс) 23:32

не могу понять почему регион вычисленный например для контрола с индексом 0, не применяется для остальных!!!!

JIeT4uK
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 23.03.2003 (Вс) 4:48
Откуда: Украина, Донецк

Сообщение JIeT4uK » 05.02.2007 (Пн) 23:48

ну объясните же кто нибудь в чем проблема!!!!!!!!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.02.2007 (Вт) 0:23

Покажи весь код, как применяешь регион к другим контролам.

JIeT4uK
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 23.03.2003 (Вс) 4:48
Откуда: Украина, Донецк

Сообщение JIeT4uK » 06.02.2007 (Вт) 6:17

под рукой щас VB Нет, попробую по памяти

R=lGetRegion(pic(0),vbRed)

SetWindowRgn pic(0).hwnd,R,1
SetWindowRgn pic(1).hwnd,R,1
SetWindowRgn pic(2).hwnd,R,1

и не важно какой из контролов будет в этом списке первым, применится только к тому который первым стоит.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.02.2007 (Вт) 6:22

Гм, может тебе тогда применять к разным окнам разные копии этого региона?
Изображение

JIeT4uK
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 23.03.2003 (Вс) 4:48
Откуда: Украина, Донецк

Сообщение JIeT4uK » 06.02.2007 (Вт) 9:30

та думал я об этом,

R=lGetRegion(pic(0),vbRed)
R1=R
R2=R
SetWindowRgn pic(0).hwnd,R,1
SetWindowRgn pic(1).hwnd,R1,1
SetWindowRgn pic(2).hwnd,R2,1

и все равно болт

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.02.2007 (Вт) 11:08

Копии -- это CombineRgn(RGN_COPY).
У тебя всё равно одна копия.
Изображение


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

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

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

    TopList