А есть примерчик, чтобы не изобретать велосипед?
Улетевшее окно
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Улетевшее окно
Я юзаю вот такую незатейливую коррекцию координат окон (см. 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
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Улетевшее окно
Не, ну сравнить с 1200 то понятно )) Но некрасиво )) Сейчас у некоторых экраны сильно поболее
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Улетевшее окно
1200 - это примерно Full HD в пикселях. Сейчас мониторы с большим разрешением считаются игровыми (ну или может быть специализированными).
We are hard at work… for you.
Улетевшее окно
А там ссылка на архивчик на первой странице обсуждения, как раз процедуры установки обработчика и вызова 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
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Улетевшее окно
Понятен правильный ход: сохранить хендл AppFrame, при каждом открытии дочернего окна получить текущий размер AppFrame.
Зная размер дочернего окна - корректировать координату его открытия. А вот нужно ли усё это при каждом открытии окна ?
У меня сделана совсем тупая защита от смена разрешения экрана и действий пользователя.
Срабатывает раз в жизни и то не в каждой ...
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Улетевшее окно
Сделал так, вроде работает
Код: Выделить всё
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