скрытие и показ формы

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

скрытие и показ формы

Сообщение amer » 14.06.2008 (Сб) 19:42

Добрый день!

проблема такова:
при наведении мыши на форму она (форма) должна скрываться, а при уходе опять показываться....

в событии Form_MouseMove форму пробовал прятать с помощью SendMessage и она прячется а вот обратно не показывается...
потом стал делать ее прозрачной функцией SetLayeredWindowAttributes и она показывается но осталась проблема....

дело в том, что я ее показываю в событии Timer1_Timer и следовательно она " то потухнет - то погаснет" может кто подскажет где ее показывать...

findwindow пробовал, но почему-то разные hwnd ...

и еще, когда прорисовывается форма с помощью регионов происходит подергивание.... :(

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

зы чтобы вызвать контекстное меню нужно удерживать ctrl

ps ps не бросайте на произвол судьбы...
Вложения
m.rar
(69.1 Кб) Скачиваний: 72
Последний раз редактировалось amer 15.06.2008 (Вс) 23:24, всего редактировалось 3 раз(а).

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 15.06.2008 (Вс) 0:34

Попробуй средствами WinApi узнавать расположение курсора на экране и уже в зависимости от него скрывать/показывать форму.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 2:52

попробовал, что-то у меня наверное с логикой...
все равно хрень получается

народ! посмотрите в чем дело?...
плиз

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 15.06.2008 (Вс) 3:55

Выложи вариант с WinApi, должно работать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.06.2008 (Вс) 7:02

amer
Опиши строго (мне), когда форма должна быть видна, а когда должна быть скрытой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 11:47

эта прога типа FClock, в этом самом FClock мне не нравится будильник, а по сему я решил написать свою...

когда наводим мышу на форму - форма скрывается
когда мышь НЕ над формой - форма видна

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.06.2008 (Вс) 11:50

amer ты понимаешь смысл слово "строго"? "типа FClock" это совсем даже не строго.


когда наводим мышу на форму - форма скрывается
когда мышь НЕ над формой - форма видна

1) А зачем этот usertease?
2) У тебя окно меняет свою геометрическую форму (из-за региона). Таким образом, даже если мышь не двигается, условие видимости то выполняется, то нет. Ты это понимаешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 11:56

простите не понимаю :oops:
для меня это пока - китайская грамота
если можно объясните по-проще, что нужно изменить...

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Сообщение ndemidov » 15.06.2008 (Вс) 12:06

WindowFromPoint, и сравнивай с хэндлом своей формы. Но придётся использовать какой-нибудь таймер.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 12:17

Хакер
я понял! :lol:

ndemidov
вариант с WindowFromPoint и висит сейчас но работает не так, как нужно...

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 12:28

ndemidov
что такое сабклассинг, чем он отличается от использования
WindowFromPoint в данном случае...

Хакер
что же делать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.06.2008 (Вс) 12:32

amer
Изменить логику.

Поставить захват на форму (SetCapture), и в MouseMove, проверять (с помощью PtInRegion) находится ли курсор над необрезанной облатсью формы, и в завимисоти от этого, делать её видимой или невидимой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 12:52

Хакер
для чего нужна SetCapture, в смысле, что она делает?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.06.2008 (Вс) 12:54

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

Иначе как ты собрался определять, что мышка покинула пределы формы?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 12:57

и что делает ReleaseCapture

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.06.2008 (Вс) 12:59

Снимает захват, установленный ранее с помощью SetCapture. :roll:

Разве это не очевидно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 13:04

спс пробую...

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 18:08

Хакер все равно дергается
что может быть не так?

Код: Выделить всё
Private Sub Form_Load()
    cSet False
    Me.FontSize = sFont
    WindowSize frmMain
    WindowPosition Me, False
    SetWindowLong Me.hwnd, GWL_EXSTYLE, WS_EX_LAYERED
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)   
    If Shift = 2 Then
        ReleaseCapture
        SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0&
    End If
    If Button = 2 Then
        PopupMenu mnuMain
    End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift <> 2 Then
        SetLayeredWindowAttributes Me.hwnd, 0, 0, LWA_ALPHA
    End If
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift = 2 Then
        SetCapture hwnd
    End If
End Sub

Private Sub Timer1_Timer()
   ...
    GetCursorPos mCoord
    If PtInRegion(hRgn, mCoord.X, mCoord.Y) <> 0 Then Exit Sub
        hRgn = GetTextRgn()
        SetWindowRgn Me.hwnd, hRgn, True
        SetLayeredWindowAttributes Me.hwnd, 0, (255 * sTransp) / 100, LWA_ALPHA
End Sub

Последний раз редактировалось amer 15.06.2008 (Вс) 23:27, всего редактировалось 1 раз.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.06.2008 (Вс) 20:26

закачал новую версию...
уже лучше, но все равно не так, как бы хотелось :cry:

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 16.06.2008 (Пн) 0:14

Заметил следующее:
наводим мышь на форму и
если таймер установлен на 500мс то моргание один раз в секунду
если таймер 1000мс то моргание один раз в две секунды
т.е. не зависимо от проверки в процедуре таймера происходит через раз прорисовка формы

почему так никак не врубаюсь....

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 16.06.2008 (Пн) 1:12

с помощью дебуга выяснил, что не работает строка
If PtInRegion(hRgn, mCoord.X, mCoord.Y) = 1 Then Exit Sub

PtInRegion=0

может это зависит от ScaleMode формы

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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 16.06.2008 (Пн) 7:50

amer писал(а):с помощью дебуга выяснил, что не работает строка
If PtInRegion(hRgn, mCoord.X, mCoord.Y) = 1 Then Exit Sub

PtInRegion=0

может это зависит от ScaleMode формы

в чем нужно задавать координаты в пикселях, твипах, точках....?
а то может получается координаты региона в одних единицах измерения а экрана в других...
При прочих равных условиях, VB предполагает использование твипов, а функции Win API используют пиксели.
Весь мир матрица, а мы в нем потоки байтов!

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 16.06.2008 (Пн) 14:45

меня кажется осенило....
когда наводим на форму - она скрывается и поэтому при проверке находится ли мыша над ней ЕЁ - нету!!!!!! :lol: 8)
ps блин.... тормоз....2 дня!

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 17.06.2008 (Вт) 10:05

всем спс за участие
сделал как хотел...
только нужно сделать кнопочку для автозагрузки и синхронизацию часов через проксю.....

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

homeworld
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 07.12.2006 (Чт) 13:17

Сообщение homeworld » 17.06.2008 (Вт) 11:14

Давай, выкладывай, пригодится.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 17.06.2008 (Вт) 23:36

Застрял на прокси сервере....
долго думал, что нужно писать в winsock (localport, remoteport...)
и понял следующее: администратор того прокси должен сделать "проброс порта 37", а в проге ничего менять не нужно!

я правильно понял?

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 18.06.2008 (Ср) 2:47

Наверное это окончательный вариант
Люди! потестите и отпишитесь на предмет ошибок, предложений по усовершенствованию и разного рода идей

ps по поводу назначенных заданий... не знаю, можно сделать, но лично я ни разу не пользовался такой фишкой... оно надо?
Вложения
mClock.rar
(71.56 Кб) Скачиваний: 46
Последний раз редактировалось amer 05.07.2008 (Сб) 18:40, всего редактировалось 8 раз(а).

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 18.06.2008 (Ср) 5:28

amer, все нравится. Сделано прикольно, но при смене времени на секундах виден фон формы. Как из программы попасть в настройки, если бы не код, для меня осталось бы загадкой :)
При самом маленьком размере строки чуток перехлестываются.
А для смены цвета не лучше ли коммондиалог вызывать?
Нужно запоминать как минимум положение формы при ее закрытии.
Время не синхронизируется. Что за "протокол SNTP"? У меня отключены все фаерволы при тесте.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 18.06.2008 (Ср) 9:55

при смене времени на секундах виден фон формы - как с этим бороться я пока не знаю :(
для смены цвета не лучше ли коммондиалог вызывать? - для этого нужно добавлять контрол, а я хотел, минимизировать размер проги и вызов всяких библиотек...
Нужно запоминать как минимум положение формы при ее закрытии - если закрывать формы не крестиком вверху формы , а кнопкой ОК то все запоминается
Время не синхронизируется. - может быть потому, что трафик идет через прокси...
Что за "протокол SNTP"? У меня отключены все фаерволы при тесте. - специальный протокол для синхронизации времени

ps в папку проги засуну read.me - там описание программы будет

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.06.2008 (Ср) 10:02

NTP, а не SNTP тогда.
Lasciate ogni speranza, voi ch'entrate.

След.

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

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

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

    TopList  
cron