PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Многооконное приложение


Многооконное приложение

Сообщений 61 страница 76 из 76

61

а с этим разве не  должен был устанавливать?

Код:
SetScrollRange_(WindowID(0),#SB_VERT, 0, 33,1);

Отредактировано mestnyi (06.10.2013 23:32:02)

0

62

С сайта майкрософт.

Примечание SetScrollRange функция предусмотрена для совместимости с предыдущими версиями.  Новые приложения должны использовать SetScrollInfo функции.

0

63

не знал значить у меня старая справка.
а перемещение как правильно реализовать, чье то у меня не получается.

Код:
Procedure WindowCallback(hWnd, Msg, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  
  Scroll.SCROLLINFO
  
  If Msg = #WM_VSCROLL Or Msg = #WM_HSCROLL
    
    Scroll\cbSize = SizeOf(SCROLLINFO)
    Scroll\fMask = #SIF_POS | #SIF_PAGE | #SIF_RANGE
    
    If Msg = #WM_VSCROLL
      GetScrollInfo_(hWnd, #SB_VERT, @Scroll)
    Else
      GetScrollInfo_(hWnd, #SB_HORZ, @Scroll)
    EndIf
    
    Select wParam & $FFFF
      Case #SB_THUMBTRACK
        nNewPos = (wParam>>16) & $FFFF
      Case #SB_LINELEFT
        nNewPos = Scroll\nPos - Scroll\nPage
      Case #SB_LINERIGHT
        nNewPos = Scroll\nPos + Scroll\nPage
      Case #SB_LINEUP
        nNewPos = Scroll\nPos - Scroll\nPage
      Case #SB_LINEDOWN
        nNewPos = Scroll\nPos + Scroll\nPage
      Case #SB_PAGELEFT
        nNewPos = Scroll\nPos - Scroll\nPage
      Case #SB_PAGERIGHT
        nNewPos = Scroll\nPos + Scroll\nPage
      Default
        ProcedureReturn 0
    EndSelect
    
    
    
    
    Scroll\fMask =  #SIF_RANGE|#SIF_POS|#SIF_PAGE
    Scroll\nPos = nNewPos
    ;Debug nNewPos
    If Scroll\nPos<0
      Scroll\nPos = 0
      Pos=Scroll\nPos
    ElseIf Scroll\nPos > Scroll\nMax-Scroll\nPage
      Scroll\nPos=Scroll\nMax
      Pos=Scroll\nPos-Scroll\nPage+1
    Else
      Pos=Scroll\nPos
    EndIf
    
    If Msg = #WM_VSCROLL
      SetScrollInfo_(hWnd, #SB_VERT, @Scroll, #True)
      Debug "VSCROLL "+Pos
    ScrollWindow_(WindowID(0), #Null, -Pos,#Null , #Null)
     Else
      
      SetScrollInfo_(hWnd, #SB_HORZ, @Scroll, #True)
      Debug "HSCROLL "+Pos
    ScrollWindow_(WindowID(0), -Pos, #Null,#Null , #Null)
        
    EndIf
    
    Result = 0
    
  EndIf
  
  ProcedureReturn Result
EndProcedure


hWnd=OpenWindow(0, 0, 0, 800, 600, "Главное окно",#WS_EX_COMPOSITED |#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #WS_HSCROLL | #WS_VSCROLL)
OpenWindow(1, 0, 0, 280, 60, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget| #WS_CHILD|#WS_POPUP, WindowID(0))

SetParent_(WindowID(1), WindowID(0))
HideWindow(0,0)
HideWindow(1,0)

SetWindowCallback(@WindowCallback(), 0)
  
  Scroll.SCROLLINFO
  Scroll\cbSize = SizeOf(SCROLLINFO)
  Scroll\fMask = #SIF_RANGE|#SIF_POS|#SIF_PAGE
  Scroll\nMin = 0
  Scroll\nMax = 0
  Scroll\nPage = 10
  Scroll\nPos = 0

  
Repeat
  Event=WaitWindowEvent()
    
If Event = #WM_SIZE
   If  WindowHeight(1)>WindowHeight(0)-41
     ShowScrollBar_(WindowID(0),#SB_VERT,#True)
     Scroll\nMax =  (WindowHeight(1)-(WindowHeight(0)-41))
     SetScrollInfo_(WindowID(0),#SB_VERT,@Scroll,1)
     EnableScrollBar_(hWnd,#SB_VERT,#ESB_ENABLE_BOTH)

   Else
     ShowScrollBar_(WindowID(0),#SB_VERT,#False)
   EndIf
   If  WindowWidth(1)>WindowWidth(0)-17
     ShowScrollBar_(WindowID(0),#SB_HORZ,#True)
     Scroll\nMax = (WindowWidth(1)-(WindowWidth(0)-17))
     SetScrollInfo_(WindowID(0),#SB_HORZ,@Scroll,1)
     EnableScrollBar_(hWnd,#SB_HORZ,#ESB_ENABLE_BOTH)

   Else
     ShowScrollBar_(WindowID(0),#SB_HORZ,#False)
   EndIf
 
   
  EndIf
  
  
Until Event=#PB_Event_CloseWindow

0

64

mestnyi написал(а):

а перемещение как правильно реализовать

В зависимости от положения полос прокрутки, программно перемещать содержимое окна.
ScrollAreaGadget примерно так и делает с одним отличием - перемещается дочернее окно (по отношению к ScrollAreaGadget) на котором находятся гаджеты.

0

65

Код:
Case #SB_THUMBTRACK
        nNewPos = (wParam>>16) & $FFFF

как получить  при уменьшении,  nNewPos с отрицательным значением?

Отредактировано mestnyi (07.10.2013 00:44:03)

0

66

mestnyi написал(а):

как получить  при уменьшении,  nNewPos с отрицательным значением?

Запомни предыдущее значение и отнимай текущее от предыдущего.

0

67

зачем отнимать он же сам отнимает

0

68

Код:
hWnd=OpenWindow(0, 0, 0, 800, 600, "Главное окно",#WS_EX_COMPOSITED |#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #WS_HSCROLL | #WS_VSCROLL)
OpenWindow(1, 5, 10, 280, 60, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget| #WS_CHILD|#WS_POPUP, WindowID(0))

 
SetParent_(WindowID(1), WindowID(0))
ResizeWindow(1, #PB_Ignore , 0, 444, 222)    

HideWindow(0,0)
HideWindow(1,0)


  
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

#PB_Ignore как работает? Если перед SetParent_(... значение не меняет, а если после то меняет. Так что ли он должен работать?

Отредактировано mestnyi (08.10.2013 22:42:56)

0

69

mestnyi написал(а):

#PB_Ignore как работает?

Работает нормально, но функция ResizeWindow не рассчитана на работу с дочерними окнами.
Нужно свою функцию писать.

Код:
Procedure ResizeWindow_CHILD(Window, x, y, Width, Height)
  Protected Size.RECT, ParentSize.RECT, ID
  
  ID = WindowID(Window)
  
  GetWindowRect_(GetParent_(ID), ParentSize)
  GetWindowRect_(ID, Size)
  
  If x=#PB_Ignore
    x=Size\left-ParentSize\left
  EndIf
  If y=#PB_Ignore
    y=Size\top-ParentSize\top
  EndIf
  If Width=#PB_Ignore
    Width=Size\right-Size\left
  EndIf
  If Height=#PB_Ignore
    Height=Size\bottom-Size\top
  EndIf
  
  MoveWindow_(ID, x, y, Width, Height, 0)
  
EndProcedure

hWnd=OpenWindow(0, 0, 0, 800, 600, "Главное окно",#WS_EX_COMPOSITED |#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #WS_HSCROLL | #WS_VSCROLL)
OpenWindow(1, 5, 10, 280, 60, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget| #WS_CHILD|#WS_POPUP, WindowID(0))

 
SetParent_(WindowID(1), WindowID(0))
ResizeWindow_CHILD(1, #PB_Ignore, 0, 444, 222)    

HideWindow(0,0)
HideWindow(1,0)


  
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

0

70

функция ResizeWindow не рассчитана на работу с дочерними окнами

, а почему movewindow также себя ведет?

0

71

mestnyi написал(а):

а почему movewindow также себя ведет

Во первых, см. корд выше. Работает нормально.
А во вторых, прежде чем такое спрашивать, подготовь пример кода.

0

72

А во вторых, прежде чем такое спрашивать, подготовь пример кода.

Код:
hWnd=OpenWindow(0, 0, 0, 800, 600, "Главное окно",#WS_EX_COMPOSITED |#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered )
OldGadgetList = UseGadgetList(WindowID(0))
OpenWindow(1, 5, 10, 280, 60, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget| #WS_CHILD|#WS_POPUP, WindowID(0))

 UseGadgetList(OldGadgetList) 
SetParent_(WindowID(1), WindowID(0))
;ResizeWindow(1, #PB_Ignore , 0, 444, 222)    
MoveWindow_(WindowID(1),0 , #PB_Ignore, 444, 222,1)
HideWindow(0,0)
HideWindow(1,0)


  
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

Во первых, см. корд выше. Работает нормально.

конечно  работает  когда  явно указано что нужно игнорировать.

Отредактировано mestnyi (10.10.2013 22:31:50)

0

73

Прочитай описание функции MoveWindow. http://msdn.microsoft.com/en-us/library … p/ms633534
Там есть хоть слово про #PB_Ignore? И учти, все константы начинающиеся с #PB_ - чисто из PureBasic и они в WinAPI не поддерживаются.

0

74

Убедил, пока  :D

Код:
hWnd=OpenWindow(0, 0, 0, 800, 600, "Главное окно",#WS_EX_COMPOSITED |#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #WS_HSCROLL | #WS_VSCROLL)
ButtonGadget(3,55,45,111,22,"rrrrrrrrrrrrrrrrrr")
OpenWindow(1, 50, 110, 480, 260, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget| #WS_CHILD|#WS_POPUP, WindowID(0))
hWn=ButtonGadget(2,55,45,111,22,"eeeeeeeeeeeeeeeeee")

SetParent_(WindowID(1), WindowID(0))

HideWindow(0,0)
HideWindow(1,0)

hWnd = 22
;hWnd = hWn
If IsWindow_(hWnd)
  Debug hWnd
EndIf
  
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

это hWnd = 22 почему проходить?

0

75

mestnyi написал(а):

это hWnd = 22 почему проходить?

Потому что в коде в это переменную записывается число 22.
Это же очевидно.

0

76

Код:
hWnd=OpenWindow(0, 0, 0, 800, 600, "Главное окно",#WS_EX_COMPOSITED |#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #WS_HSCROLL | #WS_VSCROLL)
ButtonGadget(3,55,45,111,22,"rrrrrrrrrrrrrrrrrr")
OpenWindow(1, 50, 110, 480, 260, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget| #WS_CHILD|#WS_POPUP, WindowID(0))
hWn=ButtonGadget(2,55,45,111,22,"eeeeeeeeeeeeeeeeee")

SetParent_(WindowID(1), WindowID(0))

HideWindow(0,0)
HideWindow(1,0)

hWnd = 19
;hWnd = hWn
If IsWindow_(hWnd)
  Debug hWnd
EndIf
  
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

а это hWnd = 19 почему не проходить?

Потому что в коде в это переменную записывается число 22.

:O

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Многооконное приложение