В примере TrayIcon после клика по иконке форма неактивна

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

В примере TrayIcon после клика по иконке форма неактивна

Сообщение Mihail_ » 20.04.2009 (Пн) 0:04

Здравствуйте, скачал пример TrayIcon, хороший пример, все подробно закомментировано и т.д. - но столкнулся с проблемой что после события клика по иконке, форма становится неактивна до следующего клика.. Думал кнопка кнопка мыши "залипает" пробовал mouse event с отпусканием кнопок - не помогло.. Посмотрите плиз в чем проблема.
Вложения
TrayIconCLICK.rar
(3.82 Кб) Скачиваний: 39

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение iGrok » 20.04.2009 (Пн) 0:24

Бррр.. Где ты это чудо взял?
Код какой-то бредовый..

Вот это - вообще что-то сверхгениальное. Выше моего понимания...
Код: Выделить всё
Dim MouseButton As Integer
      MouseButton = (X And &HFF) / Screen.TwipsPerPixelX   
label:
cli
jmp label

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение awl100Alex » 20.04.2009 (Пн) 12:52

А вопрос-то, кстати, интересный!
Я сам задавался им не раз. Действительно, первый клик мышки, после вызова формы по иконке в трее, полностью игнорируется формой. Видимо, это как-то связано с работой самой оконной процедуры этой формы. Но как избежать такого неприятного эффекта???

iGrok
Согласен. Действительно конъюнкция установленного байта с X абсолютно бессмысленна...
Код: Выделить всё
MouseButton = (X And &HFF) / Screen.TwipsPerPixelX
<=>
Код: Выделить всё
MouseButton = X / Screen.TwipsPerPixelX

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение iGrok » 20.04.2009 (Пн) 18:21

awl100Alex писал(а):Но как избежать такого неприятного эффекта???

Элементарно, Ватсон. Делать не через одно место.

awl100Alex писал(а):iGrok
Согласен. Действительно конъюнкция установленного байта с X абсолютно бессмысленна...

Нет, не бессмысленна. Этим от четырёхбайтовой переменной фактически отрезается только последний байт, и обнуляются все остальные. Достаточно эффективный способ получить из лонга последний байт, "обрезав" лишние биты.

Меня скорее беспокоит применение подобной операции к аргументу типа Single. У меня подобная операция никаких вразумительных результатов не дала.
И совершенно уже не понятно, с какого боку тут TwipsPerPixel...
Хотя нет. Откуда берётся это вроде понял... Но почему деление применяется уже после наложения маски?
Короче, это так и остаётся выше моего понимания.
Вложения
trayicon.rar
(5.55 Кб) Скачиваний: 37
label:
cli
jmp label

un1
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.04.2009 (Пн) 19:47

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение un1 » 20.04.2009 (Пн) 20:04

Событие MouseDown в данном случае не совсем корректно! Замени его на MouseMove :alien:

В модуле:

Код: Выделить всё
   Private Const NIF_MESSAGE = &H1
   Private Const NIF_ICON = &H2
   Private Const NIF_TIP = &H4
   Private Const NIM_ADD = &H0
   Private Const NIM_MODIFY = &H1
   Private Const NIM_DELETE = &H2
   Private Const WM_RBUTTONDOWN = &H204
   Private Const WM_NULL = &H0
   'Объявляем соответствующую константу
   Private Const WM_MOUSEMOVE = &H200


Код: Выделить всё
      Public Sub Add()
      Dim ret As Long
      NID.uID = m_hWnd
      NID.hwnd = m_hWnd
      NID.hIcon = m_Icon
      NID.szTip = Left$(m_ToolTipText, 63) & Chr$(0)
      NID.uFlags = NIF_TIP + NIF_MESSAGE + NIF_ICON
     
      NID.uCallbackMessage = WM_MOUSEMOVE
     
      NID.cbSize = Len(NID)
   
      ret = Shell_NotifyIcon(NIM_ADD, NID)
     
     End Sub



На форме:

Код: Выделить всё
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    cTray.CallEvent X, Y
End Sub

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение iGrok » 20.04.2009 (Пн) 20:12

Гм. А вот теперь я понял почему так. Да, с MouseMove должно работать без проблем.

Думаю, можно ещё на MouseUp вместо MouseDown перевесить. В принципе, тоже должно работать.
label:
cli
jmp label

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение awl100Alex » 20.04.2009 (Пн) 23:28

un1
Гениально! :cheers: Всё работает! Молодец! :)

iGrok писал(а):Этим от четырёхбайтовой переменной фактически отрезается только последний байт, и обнуляются все остальные.

Теперь понятно с выделением... но почему последний???.. Выделяется младший байт, то есть первый. Отсчет ведется справа налево - ведь так?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение iGrok » 21.04.2009 (Вт) 10:52

awl100Alex писал(а):un1
Гениально! :cheers: Всё работает! Молодец! :)

iGrok писал(а):Этим от четырёхбайтовой переменной фактически отрезается только последний байт, и обнуляются все остальные.

Теперь понятно с выделением... но почему последний???.. Выделяется младший байт, то есть первый. Отсчет ведется справа налево - ведь так?

Ага. Он самый. Младший, то есть первый.
label:
cli
jmp label

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение Mihail_ » 21.04.2009 (Вт) 14:57

огромное спасибо!
все работает


p.s.
iGrok писал(а):MouseUp вместо MouseDown перевесить

если не менять код, а просто вместо MouseDown подставить MouseUp, то почему-то вообще событие не проходит


--
пример с необходимыми изменениями
Вложения
TrayIconNEW.rar
измененный пример
(4.21 Кб) Скачиваний: 34

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: В примере TrayIcon после клика по иконке форма неактивна

Сообщение iGrok » 21.04.2009 (Вт) 15:32

Mihail_ писал(а):если не менять код, а просто вместо MouseDown подставить MouseUp, то почему-то вообще событие не проходит

Нужно ещё в классе в Add менять CallBackMessage на WM_MOUSEUP.
Но пусть уж действительно будет на mousemove...
label:
cli
jmp label


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

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

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

    TopList