системное меню для окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

системное меню для окна

Сообщение Sirik » 13.04.2006 (Чт) 8:53

есть окно (свойство BorderStyle=0) и естественно что системного меню для него нет.
как создать такое меню с такими пунктами: Закрыть, Свернуть, Востановить ?

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 13.04.2006 (Чт) 9:02

Положить свои надписи, кнопочки....
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.04.2006 (Чт) 9:07

м-да... мне надо создать меню которое вызывается из 'Панели задач'

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.04.2006 (Чт) 10:17

Создать свое меню, с помощью сабклассинга отловить момент, когда кликают правой кнопкой по проге в панели задач и показать его. Хотя не уверен, что этот момент можно таким макаром отловить.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение GSerg » 13.04.2006 (Чт) 11:13

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 16.04.2006 (Вс) 10:35

поиск всегда рулит только не сейчас
данный метод мне не подходит, так как я использую котролы для создания не стандарного вида окна, т.е. Border всегда должен быть 0

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 20.04.2006 (Чт) 12:11

ну что никто не знает как?

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

Сообщение alibek » 20.04.2006 (Чт) 12:25

В поиск.
TrackPopupMenu
Lasciate ogni speranza, voi ch'entrate.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 20.04.2006 (Чт) 14:47

отобразить и создать меню не так и сложно, проблемма в том, как отловить момент клика в Панели задач

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.04.2006 (Чт) 16:06

с помощью сабклассинга отловить момент, когда кликают правой кнопкой по проге в панели задач
Тебе что, лень было проверить? Кому оно надо? Мне?
Код: Выделить всё
WM_NCACTIVATE
WM_ACTIVATE
WM_ACTIVATEAPP
WM_KILLFOCUS
WM_WINDOWPOSCHANGING
WM_ACTIVATEAPP
WM_NCACTIVATE
WM_ACTIVATE
WM_SETFOCUS
4186
127
787
Вон сколько событий происходит при клике в панели задач на прогу, состоящую из единственного окна с BorderStyle=0. Найди нужное.
Лучший способ понять что-то самому — объяснить это другому.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 20.04.2006 (Чт) 16:08

как ловить?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.04.2006 (Чт) 16:11

с помощью сабклассинга
А вот тут по-любому в поиск. Ищи SetWindowLong и GWL_WNDPROC
Последний раз редактировалось Antonariy 20.04.2006 (Чт) 16:12, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 20.04.2006 (Чт) 16:12

м-да, кричать так зачем?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.04.2006 (Чт) 16:14

В смысле зачем использовать крупный шрифт? Это типа намек, а не широко ли известный поиску зверь этот сабклассинг?
Лучший способ понять что-то самому — объяснить это другому.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 20.04.2006 (Чт) 16:19

мне не очень
пример дашь?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.04.2006 (Чт) 16:30

Уговорил.

В форме

Код: Выделить всё
Private Sub Form_Load()
    OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
    Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)
End Sub


В модуле

Код: Выделить всё
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public OldWindowProc As Long

Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
    Debug.Print EvntName(Msg)
    SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
End Function

Private Function EvntName(e As Long) As String
    Select Case e
        Case &H10
            EvntName = "WM_CLOSE"
        Case &H2
            EvntName = "WM_DESTROY"
        Case &HF
            EvntName = "WM_PAINT"
        Case &H1
            EvntName = "WM_CREATE"
        Case &H113
            EvntName = "WM_TIMER"
        Case &H8
            EvntName = "WM_KILLFOCUS"
        Case &H18
            EvntName = "WM_SHOWWINDOW"
        Case &H203
            EvntName = "WM_LBUTTONDBLCLK"
        Case &H202
            EvntName = "WM_LBUTTONUP"
        Case &H20
            EvntName = "WM_SETCURSOR"
        Case &H21
            EvntName = "WM_MOUSEACTIVATE"
        Case &H22
            EvntName = "WM_CHILDACTIVATE"
        Case 70
            EvntName = "WM_WINDOWPOSCHANGING"
        Case 71
            EvntName = "WM_WINDOWPOSCHANGED"
        Case 132
            EvntName = "WM_NCHITTEST"
        Case 3
            EvntName = "WM_MOVE"
        Case 7
            EvntName = "WM_SETFOCUS"
        Case 13
            EvntName = "WM_GETTEXT"
        Case 14
            EvntName = "WM_GETTEXTLENGTH"
        Case 20
            EvntName = "WM_ERASEBKGND"
        Case 512
            EvntName = "WM_MOUSEFIRST"
        Case 307
            EvntName = "WM_CTLCOLOREDIT"
        Case 309
            EvntName = "WM_CTLCOLORBTN"
        Case 133
            EvntName = "WM_NCPAINT"
        Case 5
            EvntName = "WM_SIZE"
        Case 6
            EvntName = "WM_ACTIVATE"
        Case 134
            EvntName = "WM_NCACTIVATE"
        Case 312
            EvntName = "WM_CTLCOLORSTATIC"
        Case 28
            EvntName = "WM_ACTIVATEAPP"
        Case 130
            EvntName = "WM_NCDESTROY"
        Case 36
            EvntName = "WM_GETMINMAXINFO"
        Case 129
            EvntName = "WM_NCCREATE"
        Case 160
            EvntName = "WM_NCMOUSEMOVE"
        Case 131
            EvntName = "WM_NCCALCSIZE"
        Case 161
            EvntName = "WM_NCLBUTTONDOWN"
        Case 123
            EvntName = "WM_CONTEXTMENU"
        Case 533
            EvntName = "WM_CAPTURECHANGED"
        Case &H4E
            EvntName = "WM_NOTIFY"
        Case Else
            EvntName = e
    End Select
End Function
Лучший способ понять что-то самому — объяснить это другому.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 21.04.2006 (Пт) 10:45

спасибо, подошло значение 787

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 21.04.2006 (Пт) 14:45

Код: Выделить всё
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Const GWL_STYLE = (-16)
Const GWL_EXSTYLE = (-20)
Const WS_SYSMENU = &H80000
Const WS_EX_APPWINDOW = &H40000

Dim GWL As Long
Dim GWLEX As Long

Private Sub Form_Load()
    GWLEX = GetWindowLong(hwnd, GWL_EXSTYLE)
    Call SetWindowLong(hwnd, GWL_EXSTYLE, GWLEX Or WS_EX_APPWINDOW)
   
    GWL = GetWindowLong(hwnd, GWL_STYLE)
    Call SetWindowLong(hwnd, GWL_STYLE, GWL Or WS_SYSMENU)
   
End Sub


а если попробовать так?
потом просто разблокировать некоторые пункты меню.


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

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

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

    TopList  
cron