а с этим разве не должен был устанавливать?
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 » Многооконное приложение