Проблема вызова формы из tray... Помогите!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Александр80
Bonachón
Bonachón
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Проблема вызова формы из tray... Помогите!

Сообщение Александр80 » 28.12.2004 (Вт) 1:34

Помогите! При вызове из TRAY формы, фокус не на ней...
Me.SetFocus (делает окно ативным оно синее, но....) не помогает, для того, чтобы к примеру свернуть я должен нажать два раза на значок свернуть ... Для того чтобы переместить форму, тоже самое, с первого раза не перемещает :(
Вот кусочек кода:

Private Sub cTray_OnIcon(MouseButton As Integer)
Debug.Print MouseButton
If MouseButton = TRAYICON_MOUSE_LEFTDOWN Then VisTrue
'Отжатие правой кнопки мыши...... Работает нормально
If MouseButton = TRAYICON_MOUSE_RIGHTUP Then cTray.CallPopupMenu Me, MnuProg, 2, , , MnuTrue
End Sub

Public Sub VisTrue()
Me.WindowState = 0
Me.Visible = True
Me.SetFocus

End Sub

Подскажите, пожалуйста... :)
Строго не судите, я только учусь... :oops:

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 28.12.2004 (Вт) 2:42

Попробуй это
Код: Выделить всё
Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long

или
Код: Выделить всё
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

или это
Код: Выделить всё
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
الفيجوال بيسك الرابح

Александр80
Bonachón
Bonachón
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Сообщение Александр80 » 29.12.2004 (Ср) 0:33

Спасибо за подсказку, но как мне кажется, дело не в фокусе...
А в координатах расположения иконки для отображения меню... С меню все понятно и все работает, а при простом клике на иконке форма отображается, но .....посмотирете сами.
Подскажите, как можно это исправить?
Я выложу весь код, администраторы простите, как мог укоротил... :(

Для работы создайте меню Name - "menu"
и пункт меню Name - "MnuPrev"

в Class Modules
Option Explicit
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
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)
Public Property Get hwnd() As Long
hwnd = m_hWnd
End Property
Public Property Let hwnd(ByVal NewValue As Long)
m_hWnd = NewValue
End Property
Public Property Get Icon() As Long
Icon = m_Icon
End Property
Public Property Let Icon(ByVal NewValue As Long)
m_Icon = NewValue
End Property
Public Property Get ToolTipText() As String
ToolTipText = m_ToolTipText
End Property
Public Property Let ToolTipText(ByVal NewValue As String)
m_ToolTipText = NewValue
End Property
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)
ret = Shell_NotifyIcon(NIM_ADD, NID)
End Sub
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)
ret = Shell_NotifyIcon(NIM_MODIFY, NID)
End Sub
Public Sub Delete()
Dim ret As Long
NID.cbSize = Len(NID)
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
Public Sub ShowFrm()
SetForegroundWindow m_hWnd
Form1.WindowState = 0
Form1.Visible = True
PostMessage m_hWnd, WM_NULL, 0, 0
End Sub

В форму (Form1)
Option Explicit
Dim WithEvents cTray As TrayIcon
Private Sub Form_Load()
Set cTray = New TrayIcon
End Sub
Private Sub butAdd_Click()
cTray.hwnd = hwnd
cTray.Icon = Icon
cTray.ToolTipText = "Привет!"
cTray.Add
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
cTray.Delete
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbRightButton Then cTray.CallEvent X, Y
If Button = vbLeftButton Then cTray.ShowFrm
'cTray.CallEvent X, Y
End Sub
Private Sub cTray_OnIcon(MouseButton As Integer)
Debug.Print MouseButton
If MouseButton = TRAYICON_MOUSE_LEFTUP Then cTray.ShowFrm
If MouseButton = TRAYICON_MOUSE_RIGHTUP Then cTray.CallPopupMenu Me, menu, 2, , , MnuPrev
End Sub
Private Sub Form_Resize()
If Form1.WindowState = 1 Then MibimizeFrm
End Sub
Public Sub MibimizeFrm()
Form1.Visible = False
cTray.hwnd = hwnd
cTray.Icon = Icon
cTray.ToolTipText = "Привет!"
cTray.Add
End Sub
Private Sub MnuPrev_Click()
cTray.ShowFrm
End Sub
Нажмите минимизировать и посмотрите, что происходит... Помогите пожалуйста!

Александр80
Bonachón
Bonachón
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Сообщение Александр80 » 29.12.2004 (Ср) 1:24

Оказывается на сайте есть точно такой же пример, и даже с комментарием... :D (чего у меня не было)

http://www.vbstreets.ru/VB/Sources/66107.aspx

Где я раньше был... :(
Но я всеравно, чего-то не понимаю... :(


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList