Эта фраза очень насторожила:
;при использовании многослойных окон обычное PopupMenu не работает
;поэтому удалим/закомментируем его и будем пока закрывать окно по двойному клику
|
Проверил - всё нормально работает, меню вызывается и обрабатывается как надо.
EnableExplicit
UsePNGImageDecoder()
XIncludeFile("WinSkin2.pb")
Global hWndParent, hWnd
Global hPng, hBmp
Global Quit, Moving
Global dX, dY
Global Event
Define Menu
hWndParent = OpenWindow(#PB_Any, 0, 0, 1, 1, "AlphaSkin", #PB_Window_BorderLess|#PB_Window_Invisible)
hPng = LoadImage(#PB_Any, GetPathPart(ProgramFilename()) + "Icons\back.png")
hBmp = ConvertPNG(hPng)
hWnd = wndCreateChild(hWndParent, hBmp)
wndSkin(hWnd, hBmp)
HideWindow(hWnd, #False)
Quit = #False
Moving = #False
dX = 0
dY = 0
Global xy.TPoint
CreatePopupMenu(0)
MenuItem(1, "Open")
MenuItem(2, "Save")
MenuItem(3, "Save as")
MenuItem(4, "Quit")
Repeat
Event = WaitWindowEvent()
Select Event
Case #WM_LBUTTONDOWN
;SendMessage_(WindowID(Frm\hWnd), #WM_NCLBUTTONDOWN, #HTCAPTION, 0); передвигать окно мышкой
;этот способ вызывает утечку памяти
Moving = #True
GetCursorPos_(xy)
dX = WindowX(hWnd) - xy\x
dY = WindowY(hWnd) - xy\y
Case #WM_LBUTTONUP
If Moving
GetCursorPos_(xy)
wndMove(hWnd, xy\x + dX, xy\y + dY)
Moving = #False
EndIf
Case #WM_LBUTTONDBLCLK
;Quit = #True
Case #WM_RBUTTONDOWN
; Контекстное меню правым кликом
DisplayPopupMenu(0, WindowID(hWndParent))
Case #PB_Event_Menu
Menu = EventMenu()
If Menu = 4
Quit = #True
EndIf
;
EndSelect
If Event = #PB_Event_CloseWindow
Quit = #True
EndIf
If Moving
GetCursorPos_(xy)
wndMove(hWnd, xy\x + dX, xy\y + dY)
Moving = GetAsyncKeyState_(#VK_LBUTTON)
EndIf
Delay(20)
Until (Quit)
End