Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28

Форма становится прозрачной, а кнопка - нет

17.07.2014, 09:23. Показов 6603. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаем проект Visual Basic, на форму кидаем кнопку и пишем код в эту форму:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
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 Sub Form_Load() 
    Dim Ret As Long 
    Ret = GetWindowLong(hwnd, GWL_EXSTYLE) 
    Ret = Ret Or &H80000 
    SetWindowLong hwnd, (-20), Ret 
     
    SetLayeredWindowAttributes hwnd, 0, 128, 2 
End Sub
И наша форма становится прозразна на 50 процентов. Теперь немножко переделываем код для кнопки:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
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 Sub Form_Load() 
    Dim Ret As Long 
    Ret = GetWindowLong(Command1.hwnd, GWL_EXSTYLE) 
    Ret = Ret Or &H80000 
    SetWindowLong Command1.hwnd, (-20), Ret 
   
    SetLayeredWindowAttributes Command1.hwnd, 0, 128, 2 Or 1 
     
End Sub
... и кнопка почему то не становится на 50% прозрачнее Где ошибка?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2014, 09:23
Ответы с готовыми решениями:

Во общем ситуация такая. Есть форма на форме кнопка. Кнопка запускает метод. После запуска метода форма умирае
Во общем ситуация такая. Есть форма на форме кнопка. Кнопка запускает метод. После запуска метода форма умирает. Как решить? В голове...

Как сделать так что бы кнопка с картинкой была прозрачной?
Я зная что можно сделать кнопке BackColor = transparent но тогда оно отображает фон самой формы а мне надо чтобы оно отображало фон...

Кнопка становится не кликабельной
Пробую добавить кнопку на RichTextBox и скрыть ее после того как курсор покинул область RichTextBox. И наоборот, когда курсор в области...

67
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 01:25
Студворк — интернет-сервис помощи студентам
Прикольно конечно, но это не то, не обижайтесь
спасибо за старания
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.07.2014, 06:34
Цитата Сообщение от Антихакер32 Посмотреть сообщение
вам таки удалось
а исходник не хотите показать
А мне кажется, это не так, то что хотел ТС не удалось сделать!
Ему вряд ли нужна дырка вместо кнопки, по которой и кликнуть то толком трудно, надо точно в надпись попадать
Но если нужен именно такой код, то это элементарно, всего несколько строк
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
' !!!! В свойствах Кнопки выставить  Command1.Style = 1   !!!
Const LWA_COLORKEY = &H1
 Const LWA_ALPHA = &H2
 Const GWL_EXSTYLE = (-20)
 Const WS_EX_LAYERED = &H80000
 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 Sub Form_Load()
 'Me.BackColor = &HFFFFFF  ' Форма будет прозрачной!
 Command1.BackColor = &HFFFFFF
 Dim Ret As Long
 Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
 Ret = Ret Or WS_EX_LAYERED
 SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret
 SetLayeredWindowAttributes Me.hWnd, &HFFFFFF, 0, LWA_COLORKEY
 End Sub
Причем, любой элемент формы с цветом &HFFFFFF ( можно менять!) будет невидимым, но прозрачным, с регулируемой прозрачностью отдельный контрол сделать этим способом не выйдет!
2
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
18.07.2014, 08:35  [ТС]
dimas5552, еще вопрос, тебе нужна полностью прозрачная кнопка или частично?
Вот так пойдет?
Да, именно так. Полностью прозрачная или частично это вы про степень прозрачности? В идеале хотелось бы что бы ее прозрачность регулировалась как для формы слоями но если это сделать невозможно то хотя бы полностью прозрачную.

Pro_grammer Спасибо за код, однако заметил такой нюанс - когда нажимаешь на заголовок окна то оно становится деактивным и прячется под другие окна...

Добавлено через 24 минуты
Господа! Минуточку! Я тут про что подумал - кнопка то прозрачная то вроде как и есть но ведь она сквозь форму просвечивает... То есть если под кпопку поместить картинку то и картинка в этом месте будет прозрачна. Это не есть гуд.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 10:32
Вам же Pro_grammer сказал:
Цитата Сообщение от Pro_grammer Посмотреть сообщение
но прозрачным, с регулируемой прозрачностью отдельный контрол сделать этим способом не выйдет!
ну я понял, это то-же самое что уже выкладывалось на нашем форуме много раз
единственно, что вы решили расскрасит кнопку уникальным цветом например: &HFFFFFF
я тоже хотел такое сделать, но хотел чтоб кнопка была динамически созданной
Но Command1.Style = 1 нельзя-было поставить динамически

Добавлено через 8 минут
А вот для регулируемой прозрачности скорее всего придется
километровую портянку писать, чтоб кнопка была независимой от родительского окна
наподобие того как я это реализовал в спойлере, и передвижения придется синхронизировать
тогда и регулируемую прозрачность с альфой можно делать

Добавлено через 6 минут
Кстати в спойлере, уже все разжеванно как надо
осталось добавить код полупрозрачности, каких тут милион
хотелось бы чтоб [TS] сам смог это сделать, не мне-же это надо
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 11:50
Ну так у тебя сразу спросили же.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А мне кажется, это не так, то что хотел ТС не удалось сделать!
ТС сначала написал что так и надо, когда ему SoftIce скинул пример., я даже удивился сначала.
Цитата Сообщение от dimas5552 Посмотреть сообщение
В идеале хотелось бы что бы ее прозрачность регулировалась как для формы слоями но если это сделать невозможно то хотя бы полностью прозрачную.
Чем тебя прозрачный лейбл не устраивает? Все те же события у него практически есть.
Цитата Сообщение от dimas5552 Посмотреть сообщение
Господа! Минуточку! Я тут про что подумал - кнопка то прозрачная то вроде как и есть но ведь она сквозь форму просвечивает... То есть если под кпопку поместить картинку то и картинка в этом месте будет прозрачна. Это не есть гуд.
Так что ты написал, то тебе и дали.
Так тебя полупрозрачные контролы нужны? Типа такого?
Название: Безымянный.png
Просмотров: 93

Размер: 60.6 Кб
TheTrick.rar
Если да, то, сразу скажу что без WINAPI и сабклассинга так не сделаешь (ну если конечно делать именно контролы, а так можно и все в одной форме просто расписать).
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 12:09
Вот я тоже зделал:


Модуль:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Option Explicit
'
Public Const GWL_WNDPROC = -4
' Сообщения windows
'
Public Const HWND_TOP = 0
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
'
Public Const WM_ACTIVATE = &H6
Public Const WM_CLOSE = &H10
Public Const WM_MOVE = &H3
Public Const WM_SIZE = &H5
 
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
'
Dim SWL As Long
Dim mhWnd As Long
Dim mParent As Object
 
 
Function Hook(Parent As Object) As Long
    On Error GoTo errr
    Set mParent = Parent
    mhWnd = mParent.hwnd
    SWL = SetWindowLong(mhWnd, GWL_WNDPROC, AddressOf WindowProc)
errr:
End Function
 
Sub UnHook()
    Call CallWindowProc(SWL, mhWnd, WM_CLOSE, 0, 0)
End Sub
 
Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Dim o As Object
   On Error GoTo errr
   Select Case Msg
   Case WM_SIZE
        Call mParent.WSize
        Exit Function
   Case WM_ACTIVATE
        Call mParent.WActivate
        Exit Function
    Case WM_MOVE
        Call mParent.WMove
        Exit Function
   End Select
   WindowProc = CallWindowProc(SWL, hwnd, Msg, wParam, lParam)
errr:
End Function


Форма: на которую не надо ничего кидать
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Option Explicit
'
'   Динамически созданная полупрозрачная кнопка
'   © Антихакер32™
'
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Sub SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED As Long = &H80000
Dim mLeft&, mTop&
Dim WithEvents cmm As CommandButton
 
 
Private Sub Form_Load()
    Const Alpha = 50 'Прозрачность от 0 до 255
    
    Set cmm = Controls.Add("vb.CommandButton", "cmm")
    With cmm
        cmm.Caption = "Динамическая, прозрачная кнопка"
        .Width = 5000
        .Visible = 1
        SetParent .hwnd, 0 'GetDesktopWindow
        SetWindowPos .hwnd, -1, 100, 100, 0, 0, SWP_NOSIZE 'Or SWP_NOMOVE
        SetWindowLong .hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED
        SetLayeredWindowAttributes .hwnd, 0, Alpha, 2
        .left = .left + mLeft
        .top = .top + mTop
    End With
    Hook Me
End Sub
 
Private Sub Form_Terminate()
    UnHook
End Sub
 
Public Sub WMove()
    With cmm
        .left = .left + (Me.left - mLeft)
        .top = .top + (Me.top - mTop)
    End With
    mLeft = Me.left: mTop = Me.top
End Sub
Миниатюры
Форма становится прозрачной, а кнопка - нет  
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 12:12
Цитата Сообщение от The trick Посмотреть сообщение
Если да, то, сразу скажу что без WINAPI и сабклассинга так не сделаешь
Тоже пришлось сабкласить, причем зделал очень примитивно
чтоб любой школьник сразу понял что к чему
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 12:33
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Тоже пришлось сабкласить, причем зделал очень примитивно
чтоб любой школьник сразу понял что к чему
Это глючное решение, которое не работает.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.07.2014, 12:35
Цитата Сообщение от Антихакер32 Посмотреть сообщение
причем зделал очень примитивно
И к сожалению не верно.
У тебя кнопка и форма живут разной жизнью - кнопка прячется за формой, а если форму свернуть и развернуть, то кнопка и вовсе пропадает.
Проще сделать по этому типу:
Цитата Сообщение от SoftIce Посмотреть сообщение
Это просто одна форма с дыркой посередине, а под ней вторая полупрозрачная.
Хотя бы работать будет правильно.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 12:50
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И к сожалению не верно.
У тебя кнопка и форма живут разной жизнью
Ну этого и нужно было добиться, а чтоб они все делали синхронно
там есть еще передоваемые сообщения например WActivate и тп
в которых можно прописать еще действий для таких случаев

Цитата Сообщение от The trick Посмотреть сообщение
Это глючное решение, которое не работает.
вы могли бы и не коментировать, ваше мнение никогда другим не бывает

Добавлено через 6 минут
Хотя да, нужно было сделать так,
для формы сделать квадрат где будет дырка
а саму кнопку полупрозрачной, и побольше сообщений для синхронизации
тогда нельзя будет отличить от дочерней кнопки, и эфективнее бы смотрелось
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 12:55

Не по теме:

Цитата Сообщение от Антихакер32 Посмотреть сообщение
вы могли бы и не коментировать, ваше мнение никогда другим не бывает
Не нужно говорить мне что я должен делать. Ок? Это мое право, я написал абсолютную правду.


По теме. dimas5552, так просто прозрачные контролы не получится реализовать. В Windows есть только одна возможность полупрозрачных окон - слоеные. Остальное делается так или иначе отрисовкой вручную как тебе надо. Это очень просто реализовать перехватом сообщения WM_PAINT. Если ты хочешь отрисовывать без мерцания (как в моем примере), то создаешь DIB секцию при изменении размеров - вот тебе буфер.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 14:31
Вот с учетом пожеланий Pro_grammer
который правильно указал на недостатки прошлого кода

итак
Модуль:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Option Explicit
'
Public Const GWL_WNDPROC = -4
' Сообщения windows
'
Public Const WM_ACTIVATE = &H6
Public Const WM_CLOSE = &H10
Public Const WM_MOVE = &H3
Public Const WM_SIZE = &H5
 
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
'
Dim SWL As Long
Dim mhWnd As Long
Dim mParent As Object
 
 
Function Hook(Parent As Object) As Long
    On Error GoTo errr
    Set mParent = Parent
    mhWnd = mParent.hWnd
    SWL = SetWindowLong(mhWnd, GWL_WNDPROC, AddressOf WindowProc)
errr:
End Function
 
Sub UnHook()
    Call CallWindowProc(SWL, mhWnd, WM_CLOSE, 0, 0)
End Sub
 
Public Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Dim o As Object
   On Error GoTo errr
   Select Case Msg
   Case WM_SIZE
        Call mParent.WSize
        Exit Function
   Case WM_ACTIVATE
        Call mParent.WActivate
        Exit Function
    Case WM_MOVE
        Call mParent.WMove
        Exit Function
   End Select
   WindowProc = CallWindowProc(SWL, hWnd, Msg, wParam, lParam)
errr:
End Function


Форма:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Option Explicit
'
'   Динамически созданная полупрозрачная кнопка
'   © Антихакер32™
'
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags 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 GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Const HWND_TOP = 0
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const LWA_COLORKEY = &H1
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED As Long = &H80000
Dim mLeft&, mTop&, mRECT As RECT
Dim WithEvents cmm As CommandButton
Dim WithEvents pic As PictureBox
 
Private Sub Form_Load()
    Const Alpha = 200 'Прозрачность от 0 до 255
    
    Set pic = Controls.Add("vb.PictureBox", "pic")
    With pic
        .BorderStyle = 0: .BackColor = &HFFFF5: .Visible = 1
        SetWindowLong Me.hWnd, GWL_EXSTYLE, GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED
        SetLayeredWindowAttributes Me.hWnd, .BackColor, 0, LWA_COLORKEY
    End With
    
    Set cmm = Controls.Add("vb.CommandButton", "cmm")
    With cmm
        cmm.Caption = "Динамическая, прозрачная кнопка"
        SetParent .hWnd, 0: .Visible = 1
        SetWindowLong .hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED
        SetLayeredWindowAttributes .hWnd, 0, Alpha, 2
    End With
    Hook Me
End Sub
 
Public Sub WSize()
    Const L = 100, T = 100
    On Error Resume Next
     With pic
        .Move L, T, Me.ScaleWidth - L * 2, 500
        WMove
    End With
End Sub
 
Private Sub Form_Terminate()
    UnHook
End Sub
 
Public Sub WMove()
    GetWindowRect pic.hWnd, mRECT
    With mRECT
        SetWindowPos cmm.hWnd, HWND_TOPMOST, .Left, .Top, .Right - .Left, .Bottom - .Top, 0
    End With
End Sub
 
Public Sub WActivate()
    cmm.Visible = Me.Visible And GetForegroundWindow = Me.hWnd
End Sub


результат !*



Исходник: Полупрозрачная кнопка.rar (2.5 Кб)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 14:52
Антихакер32, опять промах.

Опять на панели задач, твоя кнопка. А теперь посмотри внимательно что ТС написал и что ему надо.
То есть если под кпопку поместить картинку то и картинка в этом месте будет прозрачна. Это не есть гуд.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 15:09
У меня, все работает корректно, я не виноват что вам ненравится все,
что-бы я не выложил, я болше жду ответ от TS и Pro_grammer'а
мне бы хотелось, узнать мнения этих замечательных людей
0
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
18.07.2014, 15:15  [ТС]
Спасибо за ответы, с прозрачной кнопкой "через" форму мы худо бедно разобрались, теперь вторая часть вопроса как раз и есть в том что бы кнопка не просвечивала через форму, т.е. как в примере Антихакера32 где при сворачивании\разворачивании формы кнопка терялась, только без глюков...
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 15:19
Цитата Сообщение от Антихакер32 Посмотреть сообщение
У меня, все работает корректно, я не виноват что вам ненравится все,
что-бы я не выложил, я болше жду ответ от TS и Pro_grammer'а
мне бы хотелось, узнать мнения этих замечательных людей
WTF? Ты думаешь я вру? Я не ты. Открой свое окно и новое любое окно, активируй сначала свое, потом чужое. Ну что?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 16:02
Ну у меня искуственно созданное событие WActivate
тоесть любая активность родителькой формы, должна передоваться данной процедуре
и спасибо за конструктивный диалог

Добавлено через 8 минут
Цитата Сообщение от dimas5552 Посмотреть сообщение
только без глюков...
Visual Basic
1
2
3
4
5
6
7
8
Public Sub WActivate()
    On Error Resume Next
    If GetForegroundWindow = Me.hWnd Then
        SetParent cmm.hWnd, 0
    Else
        SetParent cmm.hWnd, hWnd
    End If
End Sub
Добавлено через 7 минут
Тоесть там условие во время активности
назначить родительской форме если оно не наверху
и наоборот если наверху, сделать кнопку и форму по отдельности
типа того

Так вроде еще правильнее
вместо самого верхнего я передаю позицию для кнопки просто верхнего окна

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Option Explicit
'
'   Динамически созданная полупрозрачная кнопка
'   © Антихакер32™
'
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags 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 GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Const HWND_TOP = 0
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const LWA_COLORKEY = &H1
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED As Long = &H80000
Dim mLeft&, mTop&, mRECT As RECT
Dim WithEvents cmm As CommandButton
Dim WithEvents pic As PictureBox
 
Private Sub Form_Load()
    Const Alpha = 200 'Прозрачность от 0 до 255
    
    Set pic = Controls.Add("vb.PictureBox", "pic")
    With pic
        .BorderStyle = 0: .BackColor = &HFFFF5: .Visible = 1
        SetWindowLong Me.hWnd, GWL_EXSTYLE, GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED
        SetLayeredWindowAttributes Me.hWnd, .BackColor, 0, LWA_COLORKEY
    End With
    
    Set cmm = Controls.Add("vb.CommandButton", "cmm")
    With cmm
        cmm.Caption = "Динамическая, прозрачная кнопка"
        SetParent .hWnd, 0: .Visible = 1
        SetWindowLong .hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED
        SetLayeredWindowAttributes .hWnd, 0, Alpha, 2
    End With
    Hook Me
End Sub
 
Public Sub WSize()
    Const L = 100, T = 100
    On Error Resume Next
     With pic
        .Move L, T, Me.ScaleWidth - L * 2, 500
        WMove
    End With
End Sub
 
Private Sub Form_Terminate()
    UnHook
End Sub
 
Public Sub WMove()
    GetWindowRect pic.hWnd, mRECT
    With mRECT
        SetWindowPos cmm.hWnd, 0, .Left, .Top, .Right - .Left, .Bottom - .Top, 0
    End With
End Sub
 
Public Sub WActivate()
    On Error Resume Next
    If GetForegroundWindow = Me.hWnd Then
        SetParent cmm.hWnd, 0
    Else
        SetParent cmm.hWnd, hWnd
    End If
    WMove
End Sub
Const HWND_TOP = 0
Const HWND_TOPMOST = -1

Не по теме:

PS, если я в каждой теме, где реально пытаюсь помочь
в решении самых экзотических задач, нарушения, то уже в следующей
теме точно не смогу ответить :)

0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 16:07
dimas5552, не стоит брать этот метод. Т.к. он содержит много ошибок.
Не будет работать фокус.
Не будут работать свойства Default, Cancel.
Не будут обрабатываться некоторые события. В частности те которые обрабатываются контейнером (Click и т.п.).
Кнопка будет появляться на панели задач. Соответственно ее можно будет закрыть.
Ресайз формы будет работать некорректно.
Стиль Graphical не будет работать, соответственно иконку не получится вставить.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.07.2014, 16:15
...

Добавлено через 6 минут
Ну так потому-что динамически созданна
если бы я сказал так, кинте на форму тото и тото
затем установите свойства, а лучше воспользуйтесь готовым решением
так-как вы всеравно ничего не поймете, тогда да, но я выложил код
в котором на пустой форме создается кнопка, и онаже становиться еще и отдельным окном

если вы хотите поговорить, лучше укажите где что исправить чтоб было по Вашему
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
18.07.2014, 16:29
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Ну так потому-что динамически созданна
если бы я сказал так, кинте на форму тото и тото
затем установите свойства, а лучше воспользуйтесь готовым решением
так-как вы всеравно ничего не поймете, тогда да, но я выложил код
в котором на пустой форме создается кнопка, и онаже становиться еще и отдельным окном
Это не имеет значение. Хоть нединамически создана. У тебя WithEvents cmm.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
если вы хотите поговорить, лучше укажите где что исправить чтоб было по Вашему
По-моему? По-правильному.
Я уже дал правильную наводку, обработка WM_PAINT. Либо любой другой ручной способ отрисовки. Мне не хочется проверять, но я уверен что кнопка держит в wParam HDC, соответственно ее можно отрисовать в буфер, а с буфера отрисовать на форму с полупрозрачностью. Код будет не больше твоего.
ТС говорил что ему нужно все это сделать просто. Хотя сейчас уже и сабклассинг его устраивает, тогда чем мой метод не устроил?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2014, 16:29
Помогаю со студенческими работами здесь

Почему кнопка НЕ СТАНОВИТСЯ НЕВИДИМОЙ?
Среда Visual Basic STUDIO’2010 Professional Почему кнопка НЕ СТАНОВИТСЯ НЕВИДИМОЙ? Form1.Button12.Visible = False строка кода...

Кнопка сохранения текста не становится активной
Здравствуйте помогите разобраться..Есть текстовый редактор . на нем кнопки "загрузить ""сохранить"...

кнопка становится активной после некоторых действий
Собственно суть такова: Форма загружается с деактивированными кнопками (свойство enabled = false) По мере заполнения текстбоксов и прочих...

При выделеном тексте кнопка становится активной
помогите как задать условие если выделяеш текств в RichTextBox кнопка становится активной

Форма не становится поверх остальных окон
Скажите пожалуйста, в чем ошибка private void поверхОкон_CheckedChanged(object sender, EventArgs e) { if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru