хитрая прозрачность окна...

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

Сообщение SergeySV » 29.08.2003 (Пт) 9:46

amda писал(а):
SergeySV писал(а): Недостатки: будет немного мелькать, хотя надо проверить на компе...


в акцессе есть такая команда, которая отключает обновление экрана.
Application.Echo False

может в API есть подобная?...


Нет, если ты окно уберешь, то каждое другое окно под ним само будет решать перерисовывать ли себя или нет. Так что если ты окно скроешь, система должна будет его убрать и перерисовать область под ним. Другое дело, что если быстро убрать и вернуть, то пользователь может ничего не заметить, потому как это все один раз произойдет (после одного клика, одно мелькание), а для человеческий глаз это не раздражает (вон в кино ставят в углу спец. метки, так не каждый их и замечает). Вообщем, пробовать надо ...
Главное двигаться не быстрее, чем думает твоя голова.

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 29.08.2003 (Пт) 10:19

Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

а про эту замечательную функцию забыли????
при клике на форму
me.hide
и событие делаем на координаты взятые GetCursorPos =)
me.show
и нинадо никаких мудреностей...
или может я че-то не понимаю? =)

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 29.08.2003 (Пт) 10:25

_NeoN_ писал(а):Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

а про эту замечательную функцию забыли????
при клике на форму
me.hide
и событие делаем на координаты взятые GetCursorPos =)
me.show
и нинадо никаких мудреностей...
или может я че-то не понимаю? =)


Так по сути именно это мы с GSerg и предложили. У тебя отличается только начало, но это лишнее: зачем ловить клик мыши через mouse_event когда его и так твоя форма получит. А дальше ты предлагаешь тоже самое, с теми же обсуждаемыми проблемами: Me.Hide - небольшое мелькание формы (но я уже высказался по этой теме топиком выше.)
Главное двигаться не быстрее, чем думает твоя голова.

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 29.08.2003 (Пт) 10:30

mouse_event ничего не отлавливает.. оно посылает событие.. как и keybd_event
примера с mouse_event нету, а вот с клавой есть..
Вложения
keybd disco.zip
дискотека на клавиатуре
(6.02 Кб) Скачиваний: 109

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 29.08.2003 (Пт) 13:17

_NeoN_ писал(а):mouse_event ничего не отлавливает.. оно посылает событие.. как и keybd_event
примера с mouse_event нету, а вот с клавой есть..


Сорри, да конечно, имитирует нажатие в выбранной точке...

Тут в принципе все понятно. Остается токо решить как посылать это сообщение:
1. скрывая форму, имитируя нажатие, востанавливая форму.
2. или находжение окна под формой и посылкой ему сообщение о нажатии мыши...

Хозяин барин, пусть выбирает...
Главное двигаться не быстрее, чем думает твоя голова.

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 29.08.2003 (Пт) 16:33

а я считаю что вообще при наведении на наше окно надо его скрывать... потому что не видно куда давить-то надо.. даже если оно маленькое можно промахнуться

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.08.2003 (Пт) 17:16

Предлагаю скрывать и показывать окно через sendmessage. На vbstreets валяется пример открытия паролей в текстбоксах, так там после установки парольного символа в ноль посылается сообщение hide, а потом сразу show. Большой приз тому, кто это заметит.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 29.08.2003 (Пт) 17:20

а красивее сделать чтобы при наведении на форму она становилась постепенно прозрачной и потом пропадала совсем, думаю 1 секунды хватит.. =)

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 29.08.2003 (Пт) 17:33

Автора че-то не видно, наверное уже что-то выбрал из предложенного, загрузился и работает...
Главное двигаться не быстрее, чем думает твоя голова.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 30.08.2003 (Сб) 3:02

Да тут я....
Всё-таки это не туда вы забрались... прозрачнее, 1 секунда...
Это конечно оригинально, но не то, что я изначально задумал....
Скрывать форму тоже не вариант... когда тачка не нагружена - ещё куда ни шло, а иначе может и очень противное зрелище появляться (у меня было)... поэтому скрывать и показывать - не вариант... хотя может быть надо ещё повозиться, а если не вариант - mouse_event - не катит, ибо не имеет такого параметра, как дескриптор....
а вот с
Код: Выделить всё
sendmessage hwnd, wm_lbuttondown, 0&, 0&

помогите, разобраться.... куда клик посылается? В какой точке? в текущей, где курсор находится? или это надо как-то через последние параметры указывать.... можно подробнее?
Компиляция - перевод словесного поноса в машинный код.

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Ответ

Сообщение Alfa » 30.08.2003 (Сб) 12:58

Клик посылается в hwnd, то есть нужно указать hwnd программы, можно наверно узнать из других функция. Например, узнать hwnd своей формы можно через Me.hwnd. Клик как я понял левой клавишой мыши. В кардинаты "0&, 0&" как я понял 0 и 0

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 31.08.2003 (Вс) 0:12

Alfa, скажем hWnd не программы а окна....
и ты уверен на счёт 0,0? а может быть первый или второй параметр задаётся как POINTAPI... Господа подскажите, кто юзал эту функцию в этих целях....
Компиляция - перевод словесного поноса в машинный код.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.08.2003 (Вс) 4:38

Судя по тому, что показывает spy++, в lparam пихается указатель на point.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 01.09.2003 (Пн) 0:23

а как на счёт wParam? можно конкретный кусочек кода?
Компиляция - перевод словесного поноса в машинный код.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 01.09.2003 (Пн) 10:06

drronnie писал(а):а как на счёт wParam? можно конкретный кусочек кода?


Из MSDN:
wParam
Indicates whether various virtual keys are down. This parameter can be one or more of the following values.
MK_CONTROL
The CTRL key is down.
MK_LBUTTON
The left mouse button is down.
MK_MBUTTON
The middle mouse button is down.
MK_RBUTTON
The right mouse button is down.
MK_SHIFT
The SHIFT key is down.
MK_XBUTTON1
Windows 2000/XP: The first X button is down.
MK_XBUTTON2
Windows 2000/XP: The second X button is down.

lParam
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.

The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.


Например так можно:
Код: Выделить всё

Public Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long


Private Const WM_LBUTTONDOWN = &H201


код:
Dim CurPos As POINTAPI

      ' получаем коорд. клика
      GetCursorPos CurPos
     
      ' передаем коорд. клика в выбр. окно - hWnd
      SendMessage hWnd, WM_LBUTTONDOWN , vbNull, CurPos


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

На счет hWnd, как я уже говорил ранее, это должен быть дескриптор окна, которое находится под твоим. Нахождение его не такая уже и тривиальная задача, это надо перебрать все не скрытые окна (и родит. и дочерние тоже), проверить их координаты и определить среди них какое выше (т.е. прям под твоим). Такая функция наверняко уже кем-нибудь написана, довольно часто она нужна, так что если кто найдет или напишет, киньте ссылку или примерчик, хотя для общего развития можно и самому накатать (а потом еще баги повылавливать :) ).

Кстати в свящи с этим еще один момент. Твое окно периодически будут заслонять другие, так что надо не забывать ставить его наверх. Где-то тут на сайте валялся пример незаслоняемого окна.
Главное двигаться не быстрее, чем думает твоя голова.

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 01.09.2003 (Пн) 13:00

ам не пользовался этим делом но у меня такое ощущение что если у вас курсор находится в координатах 596,372(например) то эти координаты будут посылаться окну как будто на него тыркнули в координаты 596,372.. то есть по оконной системе отсчета.. но это так.. если че то учти это,хотя сам не знаю :wink:

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 01.09.2003 (Пн) 17:48

_NeoN_ писал(а):ам не пользовался этим делом но у меня такое ощущение что если у вас курсор находится в координатах 596,372(например) то эти координаты будут посылаться окну как будто на него тыркнули в координаты 596,372.. то есть по оконной системе отсчета.. но это так.. если че то учти это,хотя сам не знаю :wink:


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

Кстати, подумай еще вот над каким моментом, можно не только клики передавать, но хорошо бы еще и движение мыши. Вдруг он там захочет рамку подтянуть или еще что, а курсор не меняется. Правда надо не забыть потом предусмотреть возможность выключения своего окна (через клавишу, трей или еще что)
Главное двигаться не быстрее, чем думает твоя голова.

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 01.09.2003 (Пн) 17:49

А казалось бы простой вопрос=)
хотя не каждый простой вопрос имеет простое решение=) во как

Myxa
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 04.10.2002 (Пт) 14:36
Откуда: Kazakhstan

Сообщение Myxa » 05.09.2003 (Пт) 10:34

Я тут пробовал вот так:

Код: Выделить всё
Private Sub Form_Load()
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, flags
SetWindowLong hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED
SetLayeredWindowAttributes hwnd, 0, 150, LWA_ALFA
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim i As Long
If Button = vbLeftButton Then
i = GetWindow(hwnd, GW_HWNDNEXT)
SendMessage i, WM_LBUTTONDOWN, vbNull, 0&
End Sub


здесь с помощью GetWindow получаю хендл окна под моим окном, а вот потом передаю это все с помощью SendMessage но либо я там параметры неправильно указал либо что то другое но работать это дело не хочет. Может кто просвятит на эту тему?

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 18.05.2004 (Вт) 14:09

Все гениальное - простынь
Вложения
TransparentEx.zip
"Хитрая прозрачность окна"
(17.14 Кб) Скачиваний: 74

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 20.05.2004 (Чт) 0:42

Вобщем что тут говарить это надо видеть
Код: Выделить всё
Option Explicit
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, _
ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As _
Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal _
nCombineMode As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As _
Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long
Public Sub TransparentForm(frm As Form)
frm.ScaleMode = vbPixels
Const RGN_DIFF = 4
Const RGN_OR = 2
Dim outer_rgn As Long
Dim inner_rgn As Long
Dim wid As Single
Dim hgt As Single
Dim border_width As Single
Dim title_height As Single
Dim ctl_left As Single
Dim ctl_top As Single
Dim ctl_right As Single
Dim ctl_bottom As Single
Dim control_rgn As Long
Dim combined_rgn As Long
Dim ctl As Control
If frm.WindowState = vbMinimized Then Exit Sub
wid = frm.ScaleX(frm.Width, vbTwips, vbPixels)
hgt = frm.ScaleY(frm.Height, vbTwips, vbPixels)
outer_rgn = CreateRectRgn(0, 0, wid, hgt)
border_width = (wid - frm.ScaleWidth) / 2
title_height = hgt - border_width - frm.ScaleHeight
inner_rgn = CreateRectRgn(border_width, title_height, wid - border_width, _
hgt - border_width)
combined_rgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF
For Each ctl In frm.Controls
If ctl.Container Is frm Then
ctl_left = frm.ScaleX(ctl.Left, frm.ScaleMode, vbPixels) _
+ border_width
ctl_top = frm.ScaleX(ctl.Top, frm.ScaleMode, vbPixels) + title_height
ctl_right = frm.ScaleX(ctl.Width, frm.ScaleMode, vbPixels) + ctl_left
ctl_bottom = frm.ScaleX(ctl.Height, frm.ScaleMode, vbPixels) + ctl_top
control_rgn = CreateRectRgn(ctl_left, ctl_top, ctl_right, ctl_bottom)
CombineRgn combined_rgn, combined_rgn, control_rgn, RGN_OR
End If
Next ctl
SetWindowRgn frm.hWnd, combined_rgn, True
End Sub
Private Sub Form_Resize()
TransparentForm Me
End Sub


Для оригинальности убери ControlBox = False , form1.caption = ""
:wink:
Max!

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 20.05.2004 (Чт) 12:05

Это немного из другой оперы, но прикольно. Осталось только найти практическое применение.

След.

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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 13

    TopList