Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Проблема... Конкретная :-( Добавлено: 25.10.04 07:33  

Автор вопроса:  dNW
Вообщем я запихиваю свою прогу в ТРЭЙ. При нажатий там правой кнопки мыши прога показывает ПопАп меню, которое я создал при помощи АПИ. Но проблема в том, что менюшка эта не прячется при щелчке за ее пределом! Куда бы я не клацнул - она висит все-равно! Надо обязательно кликать любое из ее подменю! Че делать??

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 Unheilig



ICQ: 336859855 

Вопросов: 9
Ответов: 32
 Web-сайт: www.tarjaturunen.narod.ru
 Профиль | | #1
Добавлено: 25.10.04 09:05
Известная проблема :(
Вот рабочий класс(всё с камментами, думаю разберешься):

'*********************************************************************
'* TrayIcon *
'* Библиотека для работы с SystemTray *
'*-------------------------------------------------------------------*
'
' Ивенты:
' OnIcon ( MouseButton as integer )
' ; генерируется при действии над иконкой в трее.
' ; MouseButton соответствует - Enum TRAYICON_MOUSE_*.
' Свойства:
' hWnd (Long) ; hWnd окна, к которому привязана иконка
' Icon (Long) ; указатель на иконку. Иконка должна быть 16 цветная.
' ToolTipText ; всплывающий текст
'
' Методы:
' Add ( ) ; добавление иконки в трей. Заранее нужно установить все свойства.
' Modify ( ) ; изменение иконки в трее.
' Delete ( ) ; удаление иконки из трея
' CallEvent ( X as single, Y as single )
' ; вызывается из Form_MouseDown, ей передаются значения X и Y
'
'---------------------------------------------------------------------
' Version 0.90 Beta * Copyright (с) А.Щербаков * May 17, 2000
'*********************************************************************
   Option Explicit

'декларация функций Win32API
   Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
   Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
   Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'константы и структуры Win32API
   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 Type NOTIFYICONDATA
       cbSize As Long
       hwnd As Long
       uID As Long
       uFlags As Long
       uCallbackMessage As Long
       hIcon As Long
       szTip As String * 64
   End Type
   Private NID As NOTIFYICONDATA

'---------------------------------------------------------------------

'переменные и структуры модуля
   Private m_hWnd As Long
   Private m_Icon As Long
   Private m_ToolTipText As String
   Public Enum TrayIcon_Mouse
      TRAYICON_MOUSE_NONE = 0
      TRAYICON_MOUSE_LEFTDOWN = 1
      TRAYICON_MOUSE_LEFTUP = 2
      TRAYICON_MOUSE_LEFTDBLCLICK = 3
      TRAYICON_MOUSE_RIGHTDOWN = 4
      TRAYICON_MOUSE_RIGHTUP = 5
      TRAYICON_MOUSE_RIGHTDBLCLICK = 6
   End Enum

'ивенты
   Public Event OnIcon(MouseButton As Integer)
   

'---------------------------------------------------------------------
' Свойства

'получить свойство hWnd
Public Property Get hwnd() As Long
      hwnd = m_hWnd
End Property

'присвоить свойство hWnd
Public Property Let hwnd(ByVal NewValue As Long)
      m_hWnd = NewValue
End Property


'получить свойство Icon
Public Property Get Icon() As Long
      Icon = m_Icon
End Property

'присвоить свойство Icon
Public Property Let Icon(ByVal NewValue As Long)
      m_Icon = NewValue
End Property


'получить свойство ToolTipText
Public Property Get ToolTipText() As String
      ToolTipText = m_ToolTipText
End Property

'присвоить свойство ToolTipText
Public Property Let ToolTipText(ByVal NewValue As String)
      m_ToolTipText = NewValue
End Property

'---------------------------------------------------------------------
' Методы

'добавление иконки в Tray
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_RBUTTONDOWN
      NID.cbSize = Len(NID)
    
   'вызываем функцию API
      ret = Shell_NotifyIcon(NIM_ADD, NID)
      
End Sub

'изменение иконки и ToolTip в Tray
Public Sub Modify()
   ;Dim ret As Long
   
   'заполняем структурку
      NID.hIcon = m_Icon
      NID.szTip = Left$(m_ToolTipText, 63) & Chr$(0)
      NID.uFlags = NIF_TIP + NIF_ICON
      NID.cbSize = Len(NID)
      
   'вызываем функцию API
      ret = Shell_NotifyIcon(NIM_MODIFY, NID)
      
End Sub

'удаление иконки из Tray
Public Sub Delete()
   ;Dim ret As Long
   
   'заполняем структурку
      NID.cbSize = Len(NID)
   
   'вызываем функцию API
      ret = Shell_NotifyIcon(NIM_DELETE, NID)
      
End Sub


'вызвать ивент
Public Sub CallEvent(X As Single, Y As Single)
   'проверка, было ли действие по окну или по иконке в трее
      If Y Then Exit Sub
      
   'получаем тип действия
      ;Dim MouseButton As Integer
      MouseButton = (X And &HFF) / Screen.TwipsPerPixelX
   
   'генерируем ивент
      RaiseEvent OnIcon(MouseButton)
      
End Sub

'вызов всплывающего меню
Public Sub CallPopupMenu(Window As Form, PopMenu As Menu, Optional Flags, Optional X, Optional Y, Optional DefMenu)
      
   'устанавливаем окно
      SetForegroundWindow m_hWnd
      
   'выводим всплывающее меню
      Window.PopupMenu PopMenu, Flags, X, Y, DefMenu
      
   'посылаем сообщение окну
      PostMessage m_hWnd, WM_NULL, 0, 0

End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Unheilig



ICQ: 336859855 

Вопросов: 9
Ответов: 32
 Web-сайт: www.tarjaturunen.narod.ru
 Профиль | | #2
Добавлено: 25.10.04 09:06
Если не понял - спроси, помогу (может:)

Ответить

Номер ответа: 3
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #3 Добавлено: 25.10.04 15:25
Ты уж извини, но тут много лишнего
Я заню как засунуться в ТРЭЙ
Меня интересует конкретно менюшка!

Ответить

Номер ответа: 4
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #4 Добавлено: 25.10.04 16:33
Ага и меня тоже! Если найдете ответ, свисните в мою сторону!

Ответить

Номер ответа: 5
Автор ответа:
  j3d1



ICQ: 8370005 

Вопросов: 34
Ответов: 466
 Профиль | | #5 Добавлено: 25.10.04 21:35
нужно делать активной форму(при нажатие в трэи) с дочерним хэндлом, и когда фокус с него уёдет менюха сдохнет :)

Ответить

Номер ответа: 6
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #6 Добавлено: 25.10.04 23:20
Ага, тоесть ловить сообщение о потере фокуса. WM_KILLFOCUS. Вот только как?

Ответить

Номер ответа: 7
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #7
Добавлено: 26.10.04 00:28
Кажись в НеЧаВо есть ответ...


Public Sub CallPopupMenu(Form As Form, PopMenu As Menu, Optional Flags, Optional X, Optional Y, Optional DefultMenu)
    Call SetForegroundWindow(TaskIcon.hWnd)
    Call PostMessage(TaskIcon.hWnd, 0&, 0&, 0&;)
    Call Form.PopupMenu(PopMenu, Flags, X, Y, DefultMenu)
End Sub

Ответить

Номер ответа: 8
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #8 Добавлено: 26.10.04 15:27
ВСсе ясно

Ответить

Номер ответа: 9
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #9 Добавлено: 26.10.04 23:58
2dNW:
Спрошу заодно уж: а нет ли у тебя кода, как в апишной popup-менюхе делать owner draw (полоску слева вертикальную нарисовать, к примеру)? у меня есть примерчик - но там отдельно подчёркнуто, что он не работает для popup-менюх (только для "обычных";). Самому разбираться, откровенно говоря, в лом :))

Ответить

Номер ответа: 10
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #10 Добавлено: 01.11.04 21:21
2sne:
В твоём коде "TaskIcon" - это структура NOTIFYICONDATA? или чей-то "готовый" компонент?
(пардон за реанимацию старого топика)

Ответить

Номер ответа: 11
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #11 Добавлено: 02.11.04 07:33
2Comanche:
Я думаю можно, но незнаю как. Скорее всего тут нужен какой-то АктивИкс или манифест

Тебе чтоль нужен код АПИшной менюхи?

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 02.11.04 09:04
2Comanche, по идее - да :)

Ответить

Номер ответа: 13
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #13 Добавлено: 02.11.04 12:34
2dNW:
Тебе чтоль нужен код АПИшной менюхи?

Не, спасибо, он у меня есть. Точнее - два кода:
1). обычное АПИшное меню (не popup) - там есть битмап-полосочка слева; и есть приписка, что, мол, её нарисовать можно только у обычного меню.
2). popup-меню, тоже АПИшное, - там нету этой полосочки.

Если у тебя есть что-то другое, поинтереснее, - отмыль пжалс-та на pc-er[гав!]mail[точка]ru.

2sne:
Спасибо!

Ответить

Номер ответа: 14
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #14 Добавлено: 02.11.04 13:11
Выложи код менюхи с полоской ПЛИЗ!

Ответить

Номер ответа: 15
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #15 Добавлено: 02.11.04 17:37
http://formtoini.narod.ru/Downloads/titledmenu.zip

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам