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

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

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

Сообщение drronnie » 23.08.2003 (Сб) 1:10

Господа, вне вот какая мысль в голову пришла...
:idea: :idea: :idea:
Круто конечно, когда какие либо часики не в трее, а красивые со скинами прозрачные... по экрану... однако есть одно но...
Подвинуть в центр экрана - раздражают... по углам - кнопки закрывают.... хотя формочка прозрачная, через неё видишь а нажать ничего не можешь... :((
Я это к чему клоню... реально ли сделать, чтобы когда кликаешь по прозрачной форме, находящейся ONTOP (ну прозрачность тут не причём) он ловила нажатие и передавала его окну, которое находится под ней...
сам пока не пробовал сделать (надо VBещё поставить...) но вот хочу спросить... может кто-то делал... это такжу добно, чтобы показывать другую инфу... типа траффик, скорость, температуру чего либо...
Компиляция - перевод словесного поноса в машинный код.

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 23.08.2003 (Сб) 1:45

Ну, что сказать?
Идея - класс!
..но сам еще не пробовал. а надо бы... :lol:
Посмотрим - посмотрим...
Для корабля, который не знает куда плыть, нет попутного ветра...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.08.2003 (Сб) 12:59

Нет меня больше

lenar
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.08.2003 (Сб) 14:34

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

Сообщение lenar » 23.08.2003 (Сб) 14:49

:idea: А не проще ли рисовать часики на экране а не на форме, тогда никакие сообщения не надо ловить, все и так будет напрямую.

Для того чтобы нарисовать на экране надо так:


Код: Выделить всё
DC = GetDC(GetDesktopWindow)
BitBlt DC, Screen.Width/2 - 50, Screen.Height/2 - 50, 100, 100, Me.hdc, 0, 0, vbSrcCopy
The best from the VB

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

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

Сообщение drronnie » 24.08.2003 (Вс) 2:55

lenar писал(а)::idea: А не проще ли рисовать часики на экране а не на форме, тогда никакие сообщения не надо ловить, все и так будет напрямую.

Для того чтобы нарисовать на экране надо так:


Код: Выделить всё
DC = GetDC(GetDesktopWindow)
BitBlt DC, Screen.Width/2 - 50, Screen.Height/2 - 50, 100, 100, Me.hdc, 0, 0, vbSrcCopy

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

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 24.08.2003 (Вс) 6:16

Можно, например, так, когда кликнешь по форме прозрачной, программа узнаёт координаты курсора. Потом форма скрывается и имитируется клик, и форма опять появляется.

lenar
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.08.2003 (Сб) 14:34

Сообщение lenar » 24.08.2003 (Вс) 18:23

Для прозрачности есть кое-что:

Код: Выделить всё
Private Declare Function AlphaBlending Lib "msimg32.dll" Alias "AlphaBlend" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal BF As Long) As Long
Private Declare Function DrawTransparent Lib "msimg32.dll" Alias "TransparentBlt" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long

Public Function AlphaBlend(ByVal destHDC As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal destWidth As Long, ByVal destHeight As Long, ByVal srcHDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal srcWidth As Long, ByVal srcHeight As Long, ByVal AlphaSource As Long) As Long
  Dim lngBlend As Long
  lngBlend = Val("&h" & Hex(AlphaSource) & "00" & "00")
  AlphaBlending destHDC, XDest, YDest, destWidth, destHeight, srcHDC, XSrc, ycrc, srcWidth, srcHeight, lngBlend
End Function

Public Function TransparentBlt(ByVal destHDC As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal destWidth As Long, ByVal destHeight As Long, ByVal srcHDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal srcWidth As Long, ByVal srcHeight As Long, ByVal TransparentColor As Long) As Long
  DrawTransparent destHDC, XDest, YDest, destWidth, destHeight, srcHDC, XSrc, ycrc, srcWidth, srcHeight, TransparentColor
End Function
The best from the VB

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 24.08.2003 (Вс) 20:53

lenar писал(а):Для прозрачности...


Вообще, для прозрачности есть контрол.. :idea:
Нет меня больше

lenar
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.08.2003 (Сб) 14:34

Сообщение lenar » 25.08.2003 (Пн) 21:54

Зачем контролы когда есть маленький и удобный API ? По сути ведь кроме прозрачности больше ничего и не требуется...
The best from the VB

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

Сообщение drronnie » 26.08.2003 (Вт) 1:25

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

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

Сообщение GSerg » 26.08.2003 (Вт) 5:06

getcursorpos вернёт точку.
windowfrompoint вернёт окно, которому принадлежит точка.
sendmessage hwnd, wm_lbuttondown, 0&, 0& пошлёт клик.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Pivusik
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 27.08.2003 (Ср) 13:25
Откуда: Новый Уренгой

Сообщение Pivusik » 28.08.2003 (Чт) 7:47

Попробуй просто при нажатии на форму Me.hide :=)
Точноработает вот это:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
End
End Sub

:=)
©Wind

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 28.08.2003 (Чт) 15:28

Pivusik писал(а):Попробуй просто при нажатии на форму Me.hide :=)
Точноработает вот это:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
End
End Sub

:=)


Дык в том-то и дело, что форма отловит клик НА СЕБЯ, и по нему вырубится или скроется, а другому окну-то плевать на это!
Нет меня больше

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

Сообщение SergeySV » 28.08.2003 (Чт) 16:10

GSerg писал(а):getcursorpos вернёт точку.
windowfrompoint вернёт окно, которому принадлежит точка.
sendmessage hwnd, wm_lbuttondown, 0&, 0& пошлёт клик.


GSerg дело говорит. Ничего сложного в этих функциях нет и полная универсальность.

Есть только одна проблемка с windowfrompoint - если я не ошибаюсь, эта функция вернет только верхнее окно под курсором. В данном случае получается, что наше.

Тут я вижу два решения:
1. получив через getcursorpos координаты клика, скрыть окно, применить функцию windowfrompoint, узнать чэндл другого окна, обратно показать свое окно и потом уже посылать sendmessage этому окну - Резюме: написать быстро, код маленький. Недостатки: будет немного мелькать, хотя надо проверить на компе...

2. Написать универс. функцию, которая будет перебирать все открытые окна верх. уровня, получать координаты их окон и проверять не попали ли наши координаты в область какого-нибудь окна, если окон несколько по по параметру Ztop определить какое из них выше. Дальше как и в 1. Резюме: писать дольше, отлаживать. Но зато потом получишь универс. функцию, которой можешь потом еще где пользоваться (а также нельзя не отметить рост самоуважения), ну и нет мелькания окна.
Главное двигаться не быстрее, чем думает твоя голова.

amda
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 134
Зарегистрирован: 11.09.2002 (Ср) 15:14
Откуда: Russia, Волгоградская обл., г. Волжский

Сообщение amda » 29.08.2003 (Пт) 8:17

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


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

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

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 Кб) Скачиваний: 110

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

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

След.

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

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

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

    TopList