Страница 2 из 2
Улетевшее окно
Добавлено: 10 Ноябрь 2017, 14:06
RaFaeL
Yufil писал(а): 09 Сентябрь 2017, 10:17При запросе Xpos/Ypos/Height/Width программа проверяет, что окно влезет во фрейм и подправляет, если не так...
А есть примерчик, чтобы не изобретать велосипед?
Улетевшее окно
Добавлено: 10 Ноябрь 2017, 16:22
Игорь Столяров
Я юзаю вот такую незатейливую коррекцию координат окон (см. abutil.clw)
Код: Выделить всё
INIClass.Update PROCEDURE (STRING ProcedureName, WINDOW W)
Info LIKE(WindowInfo),AUTO
CODE
Info.Maximized = CHOOSE (W {PROP:Maximize} <> 0)
Info.Minimized = CHOOSE (W {PROP:Iconize} <> 0)
Info.X = _nopos
Info.Y = _nopos
Info.W = _nopos
Info.H = _nopos
IF NOT Info.Minimized AND NOT Info.Maximized
!Info.X = W {PROP:XPos}
!Info.Y = W {PROP:YPos}
!!! --- Коррекция координат
If InRange(Int(W {PROP:XPos}),0,1200) and InRange(Int(W {PROP:YPos}),0,1000)
Info.X = W {PROP:XPos}
Info.Y = W {PROP:YPos}
end
!!! ---
IF W {PROP:Resize}
Info.W = W {PROP:Width}
Info.H = W {PROP:Height}
END
END
SELF.UpdateWindowInfo (ProcedureName, Info)
RETURN
Улетевшее окно
Добавлено: 10 Ноябрь 2017, 16:33
RaFaeL
Не, ну сравнить с 1200 то понятно )) Но некрасиво )) Сейчас у некоторых экраны сильно поболее
Улетевшее окно
Добавлено: 10 Ноябрь 2017, 16:38
kreator
1200 - это примерно Full HD в пикселях. Сейчас мониторы с большим разрешением считаются игровыми (ну или может быть специализированными).
Улетевшее окно
Добавлено: 10 Ноябрь 2017, 16:41
Yufil
RaFaeL писал(а): 10 Ноябрь 2017, 14:06
Yufil писал(а): 09 Сентябрь 2017, 10:17При запросе Xpos/Ypos/Height/Width программа проверяет, что окно влезет во фрейм и подправляет, если не так...
А есть примерчик, чтобы не изобретать велосипед?
А там ссылка на архивчик на первой странице обсуждения, как раз процедуры установки обработчика и вызова GetIni-Putini. Если запрашивается параметр по имени xpos/ypos/width/height, производится правка
Код: Выделить всё
IF INLIST(UPPER(Loc:Param),'XPOS','YPOS','WIDTH','HEIGHT')
If 0{Prop:Mdi}
IsMdi=True
SetTarget(,1)
!------- Определение параметров клиентского окна фрейма
XClient = 0{Prop:ClientX}
Yclient = 0{Prop:ClientY}
Wclient = 0{Prop:ClientWidth}
HClient = 0{Prop:ClientHeight}
If WClient>0{Prop:Width}
Wclient = 0{Prop:Width}
End
IF HClient>0{Prop:Height}
HClient = 0{Prop:Height}
End
SetTarget
End
CASE Upper(Loc:Param)
Of 'XPOS'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 20
ELSIF Pos#>(WClient-40)
Pos# = Wclient - 80
End
Return(POS#)
OF 'YPOS'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 20
Elsif Pos#>(HClient-40)
Pos# = HClient - 80
End
Return(POS#)
OF 'WIDTH'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 100
!Elsif Pos# > Wclient
! Pos# = Wclient
End
Return(POS#)
OF 'HEIGHT'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 100
!Elsif Pos# > Hclient
! Pos# = Hclient
End
Return(POS#)
ELSE
Return(Clip(In:S [EQ#+1 : Len(In:S)]))
END
ELSE
Return(Clip(In:S [EQ#+1 : Len(In:S)]))
END
End
End
Детали не помню, но вроде работает...
Улетевшее окно
Добавлено: 10 Ноябрь 2017, 16:48
Игорь Столяров
RaFaeL писал(а): 10 Ноябрь 2017, 16:33Сейчас у некоторых экраны сильно поболее
Понятен правильный ход: сохранить хендл AppFrame, при каждом открытии дочернего окна получить текущий размер AppFrame.
Зная размер дочернего окна - корректировать координату его открытия. А вот нужно ли усё это при каждом открытии окна ?
У меня сделана совсем тупая защита от смена разрешения экрана и действий пользователя.
Срабатывает раз в жизни и то не в каждой ...

Улетевшее окно
Добавлено: 10 Ноябрь 2017, 17:16
RaFaeL
Сделал так, вроде работает
Код: Выделить всё
INIClass.Fetch PROCEDURE (STRING ProcedureName, WINDOW W)
Info LIKE(WindowInfo),AUTO
IsMax BYTE,AUTO
CODE
SELF.FetchWindowInfo (ProcedureName, Info)
IF Info.Got
IsMax = W {PROP:Maximize}
IF NOT Info.Maximized AND IsMax
W {PROP:Maximize} = FALSE
END
SetTarget(,1)
XClient# = 0{Prop:ClientX}
YClient# = 0{Prop:ClientY}
WClient# = 0{Prop:ClientWidth}
HClient# = 0{Prop:ClientHeight}
SetTarget
IF INRANGE(Info.X,XClient#,XClient#+WClient#)
W {PROP:XPos} = Info.X
END
IF INRANGE(Info.Y,YClient#,YClient#+HClient#)
W {PROP:YPos} = Info.Y
END
IF W {PROP:Resize}
IF Info.W <> _nopos
W {PROP:Width} = Info.W
END
IF Info.H <> _nopos
W {PROP:Height} = Info.H
END
END
IF Info.Maximized AND NOT IsMax
W {PROP:Maximize} = TRUE
END
W {PROP:Iconize} = Info.Minimized
END