Ну вобщем... На форме лежит кнопка, линия, не важно... какие нибудь ещё компоненты.
И нужно, чтобы окно(то бишь форма) приняла форму этих контролов. (по их контуру)
Нееее... не прозрачность. Прозрачность - это прозрачность. Мой же вопрос к теме Окно произвольной формы.
Так вот, оно должно стать формы расположенных на нем контролов.
Конечно это похоже на реализацию прозрачности - с виду. Но если желать окно прорачным, то оно будет все равно воспринимать события клик, mousedown и так далее...
Именно в этом отличие
Ну а как по-твоему делаются окна произвольной формы? Либо задают ключевой цвет, и по нему устанавливают прозрачность формы, либо через всякие API для работы с регионами *Rgn()
Прошу прощения, мне бы исходники ))))
заглянуть интересно, всё таки ж написали люди
В л/сл благодарю. Если самому такой повторить не получится, то буду использовать эту
Готов поспорить с Sacred Phoenix, что при написании этого примера использовали не
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
А это:
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long
Ладно, заканчиваю... прошу прощения за выпендрежь и неконкретную формулировку задачи.
У меня такая проблема. Везде куда не гляну примеры произвольной формы типа этого:http://vbkoders.info/faqans-4-28.html
BeginPath hdc
CurrentX = 0
CurrentY = 0
Print TXT
' Здесь вместо текста можно рисовать фигуры
EndPath hdc
'Функции API для изменения контура формы
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Coordinates, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Type Coordinates
X As Long
Y As Long
End Type
Dim XY() As Coordinates
'Переменная для переноса окна
Dim cdrMoving As Coordinates
'Форма меняет свой внешний вид
Private Sub Form_Load
' Переменная, в которую запишем область формы
Dim hRgn As Long
' Массив углов формы
ReDim XY(7) As Coordinates
' Заполняем массив значениями
XY(0).X = 98
XY(0).Y = 335
XY(1).X = 428
XY(1).Y = 48
XY(2).X = 633
XY(2).Y = 203
XY(3).X = 436
XY(3).Y = 356
XY(4).X = 303
XY(4).Y = 263
XY(5).X = 169
XY(5).Y = 392
XY(6).X = 97
XY(6).Y = 338
XY(7).X = 98
XY(7).Y = 335
' Генерируем соответствующий полигон
hRgn = CreatePolygonRgn(XY(0), 7, 2)
' И меняем форму окна
Call SetWindowRgn(Me.hWnd, hRgn, True)
'Окно меняет свои размеры
Me.Width = 11595
Me.Height = 10065
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
cdrMoving.X = X: cdrMoving.Y = Y
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Me.Left = X + Me.Left - cdrMoving.X
Me.Top = Y + Me.Top - cdrMoving.Y
End If
End Sub
ну я с CreatePolygonRgn работал, только если брать считывать все все координаты лежащих на форме контролов, а потом присваивать ... - не вариант короче. Нужно именно, чтобы принимала форму изображения на форме.
Вощем так, -АлександР-, бери цикл For Each и скрытый пиктурабокс с белым фоном. Циклом на пиктурабоксе нарисуй черные прямоугольники, которые соответствуют видимым элементам управления на форме. Далее апишками опрозрачнивай форму с помощью получившейся картинки (непомню какими апишками , но есть какая-то, что заданный цвет превращяет в прозрачный).