а с этим разве не должен был устанавливать?
SetScrollRange_(WindowID(0),#SB_VERT, 0, 33,1);
Отредактировано mestnyi (06.10.2013 23:32:02)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Многооконное приложение
а с этим разве не должен был устанавливать?
SetScrollRange_(WindowID(0),#SB_VERT, 0, 33,1);
Отредактировано mestnyi (06.10.2013 23:32:02)
С сайта майкрософт.
Примечание SetScrollRange функция предусмотрена для совместимости с предыдущими версиями. Новые приложения должны использовать SetScrollInfo функции.
не знал значить у меня старая справка.
а перемещение как правильно реализовать, чье то у меня не получается.
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а перемещение как правильно реализовать
В зависимости от положения полос прокрутки, программно перемещать содержимое окна.
ScrollAreaGadget примерно так и делает с одним отличием - перемещается дочернее окно (по отношению к ScrollAreaGadget) на котором находятся гаджеты.
Case #SB_THUMBTRACK
nNewPos = (wParam>>16) & $FFFFкак получить при уменьшении, nNewPos с отрицательным значением?
Отредактировано mestnyi (07.10.2013 00:44:03)
как получить при уменьшении, nNewPos с отрицательным значением?
Запомни предыдущее значение и отнимай текущее от предыдущего.
зачем отнимать он же сам отнимает
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)
#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функция ResizeWindow не рассчитана на работу с дочерними окнами
, а почему movewindow также себя ведет?
а почему movewindow также себя ведет
Во первых, см. корд выше. Работает нормально.
А во вторых, прежде чем такое спрашивать, подготовь пример кода.
А во вторых, прежде чем такое спрашивать, подготовь пример кода.
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)
Прочитай описание функции MoveWindow. http://msdn.microsoft.com/en-us/library … p/ms633534
Там есть хоть слово про #PB_Ignore? И учти, все константы начинающиеся с #PB_ - чисто из PureBasic и они в WinAPI не поддерживаются.
Убедил, пока
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 почему проходить?
это hWnd = 22 почему проходить?
Потому что в коде в это переменную записывается число 22.
Это же очевидно.
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.

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