Показать сообщение отдельно
Старый 10.10.2011, 23:04   #8
kvitaliy
Оператор ЭВМ
 
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений
(для 5 пользователей)
Re: Скин с альфа-каналом (UpdateLayeredWindow_)

Эта фраза очень насторожила:
;при использовании многослойных окон обычное 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
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
barsunduk (11.10.2011)