Улетевшее окно

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Улетевшее окно

Сообщение RaFaeL »

Yufil писал(а): 09 Сентябрь 2017, 10:17При запросе Xpos/Ypos/Height/Width программа проверяет, что окно влезет во фрейм и подправляет, если не так...
А есть примерчик, чтобы не изобретать велосипед?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 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 раз
Контактная информация:

Улетевшее окно

Сообщение RaFaeL »

Не, ну сравнить с 1200 то понятно )) Но некрасиво )) Сейчас у некоторых экраны сильно поболее
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Улетевшее окно

Сообщение kreator »

1200 - это примерно Full HD в пикселях. Сейчас мониторы с большим разрешением считаются игровыми (ну или может быть специализированными).
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Улетевшее окно

Сообщение 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
Детали не помню, но вроде работает...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Улетевшее окно

Сообщение Игорь Столяров »

RaFaeL писал(а): 10 Ноябрь 2017, 16:33Сейчас у некоторых экраны сильно поболее
Понятен правильный ход: сохранить хендл AppFrame, при каждом открытии дочернего окна получить текущий размер AppFrame.
Зная размер дочернего окна - корректировать координату его открытия. А вот нужно ли усё это при каждом открытии окна ?
У меня сделана совсем тупая защита от смена разрешения экрана и действий пользователя.
Срабатывает раз в жизни и то не в каждой ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Улетевшее окно

Сообщение 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
Ответить