none
Смещение формы RRS feed

  • Вопрос

  • Всем привет!

    Есть главная форма размером 300х200, которая при запуске помещается и точку 0х0,
    и есть вторичная форма размером 300х200, которая помещается в точку 0х200.
    Эти две формы располагаются друг под другом безо всяких смещений.
    Так происходит на обоих моих компах с Win7, один 32-, а второй 64-битный.
    А вот в облаке с 64-битным WinServer2007
    вторичная форма смещена вниз пикселей на 10-20.

    Почему и как это преодолеть?

Ответы

  • нет нет,
    я имею ввиду прямо как у меня написано

     Point LeftBottom = new Point
     (0,
       form1.Bottom // + 1 может быть, а может и не быть
     );
    

    form2.Location = LeftBottom;





    • Изменено INFEL8 23 мая 2013 г. 10:13
    • Помечено в качестве ответа QazRdx 23 мая 2013 г. 11:15

Все ответы

  • Привет,

    Немного трудно гадать так, но может там другой DPI стоит? Можете скрин показать как должно выглядеть и как на сервере сейчас выглядит?


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    Модератор
  • Здравствуйте.

    А не могли бы вы добавить пару скриншотов с правильным и не правильным отображением форм?

    А вообще, на ваш вопрос можно ответить абстрактно: "если хотите позиционировать второй объект относительно первого, то нужно получить данные о положении и размерах первого объекта и на их основе рассчитать положение и размеры для второго" :).

  • Формы одинакового размера и примыкают друг к другу без пробелов.
    Поэтому размер DPI не имеет значения.
    Размер главной формы по вертикали, как уже говорилось, 200,
    левый верхний угол главной формы в точке 0х0,
    а левый верхний угол вторичной формы находится в точке 0х200,
    т.е. в той же самой, что и левый нижний угол главной формы.
    Может быть в той системе предусмотрен минимальный интервал между формами.
    Но где это можно посмотреть?

  • - так должно быть



    - так не должно быть.

    Мелочь, конечно, но почему это так работает?
    Не понятно.
  • скрины и объясняют смещение.
    Я как-то видел у себя подобную проблему, тоже формы размещал.

    Решил узнаванием значений размеров рамок формы.
    сверху, снизу и тд.

    потом положение пересчитывал на это.

    Облако ни разу не видел,
    но может и тут что-то такое?

    int wiMinus = System.Windows.Forms.SystemInformation./*Fixed*/FrameBorderSize.Width * 2;
                        int heiMinus = System.Windows.Forms.SystemInformation.CaptionHeight
                            + System.Windows.Forms.SystemInformation./*Fixed*/FrameBorderSize.Height * 2;

                        myRect.X = rct.Left +
                            System.Windows.Forms.SystemInformation./*Fixed*/FrameBorderSize.Width;
                        myRect.Y = rct.Top + System.Windows.Forms.SystemInformation.CaptionHeight +
                            System.Windows.Forms.SystemInformation./*Fixed*/FrameBorderSize.Height

    вот в другой проге нашёл что я использую,
    думаю, что может в эту сторону нужно копать.

    ну и учитывать положение формы или её клиентской части


    • Изменено INFEL8 22 мая 2013 г. 8:23
  • В  "Aero" и "классическом" стилях разная высота рамки и заголовка окна.

    Получить высоту окна можно так:

    Высота окна =  высота клиентской области + высота рамки окна * 2 + высота заголовка окна. 

    Соответственно для правильного отступа сверху у второй формы использовать полученную высоту первого окна. 

  • Понял, посмотрю, но позднее...
  • "... высота рамки окна * 2 + высота заголовка окна ... "
    - как это "звучит" по-английски ? 
    Попытался попользоваться экранными координатами -
    получилось смещение и по Х и по Y.


    • Изменено QazRdx 22 мая 2013 г. 23:00
  • "... высота рамки окна * 2 + высота заголовка окна ... "
    - как это "звучит" по-английски ? 


    Window frame height by 2 + window titlebar height.

    Вроде так


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    Модератор
  • Я тоже так думал, но таких свойств в форме нет.
    Нужно название свойств формы,
    которые по-русски "звучат" так,
    как предложено Дмитрием Фоминым.
    Например, "высота клиентской области"
    - это ClientSize.Height.

    • Изменено QazRdx 23 мая 2013 г. 6:57
  • Так вот же я давал выше:
    System.Windows.Forms.SystemInformation./*Fixed*/FrameBorderSize.Width;

    System.Windows.Forms.SystemInformation.CaptionHeight;
    System.Windows.Forms.SystemInformation./*Fixed*/FrameBorderSize.Height * 2;

    не то?

    нужно только знать что использовать (Fixed или нет), не знаю как (или не помню)



    • Изменено INFEL8 23 мая 2013 г. 7:12
  • Сделал так -

    Point LeftBottom = new Point 
    ( 0,
      ClientSize.Height+
      SystemInformation.FrameBorderSize.Height*2+
       SystemInformation.CaptionHeight
    );

    В эту точку помещаю 2-ю форму.
    На моих компах 2-я форма наезжает на главную форму снизу на 8 точек,
    а в облаке - все отлично.

    Как исправить, чтобы не наезжала?
  • там наверное что-то ещё учесть надо

    я тут подумал,
    а почему так не сделать?

    ....Location = new Point
     (0,
       ....Bottom // + 1 может быть, а может и не быть
     );
    // где ... - верхняя форма
    оно само сразу и посчитает куда поставить


    • Изменено INFEL8 23 мая 2013 г. 9:38
  • Именно так я и делаю - Location=LeftBottom;

    Видимо где-то должна быть информация о стиле - Аэро / Классика.
    Но где? В SystemInformation не нашел.
  • нет нет,
    я имею ввиду прямо как у меня написано

     Point LeftBottom = new Point
     (0,
       form1.Bottom // + 1 может быть, а может и не быть
     );
    

    form2.Location = LeftBottom;





    • Изменено INFEL8 23 мая 2013 г. 10:13
    • Помечено в качестве ответа QazRdx 23 мая 2013 г. 11:15
  • Именно так я и делаю
    - form2.Location=form1.LeftBottom;
    И в облаке и на моих компах работают две копии
    одной и той же программы.
  • Так у Вас же отличается формула рассчёта положения 2-й формы от того, что я написал.
    Дайте эту формулу, если это не она в предыдущем сообщении.
  • Простое решение конечно есть,
    с логикой, в которой в зависимости от SystemInformation.ComputerName,
    вторичная форма помещается в ту или другую точку.
    Но если уж заикнулись о стиле,
    то хорошо бы его раскопать.
  • Покажите пожалуйста, как Вы считаете местоположение 2-й формы.
    (наверное формула для LeftBottom, которая)

    Я сильно сомневаюсь, что при "именно так" у Вас эта формула.

    • Изменено INFEL8 23 мая 2013 г. 10:39
  • Я не знаю, как еще детальнее показать.
    Показано в точности, как в программе.
  • ну значит когда Вы говорили "именно так", то не так значит Вы посотрели, и у Вас не "именно так".
    Я предлагал вот так:
    form2.Location = new Point
     (0,
       form1.Bottom // + 1 может быть, а может и не быть
     );
    Заметтье, просто Bottom, а ни какой не LeftBottom.

    А у Вас что-то другое.

    ПС.
    А можете выложить куда-нибудь код рамещения второй формы?
    попробовать, вдруг и у меня не будет нормально размещаться на 7-ке с Аеро включённым.
    • Изменено INFEL8 23 мая 2013 г. 10:54
  • INFEL8, сорри!
    Вы правы на все 100!
    Bottom,Bottom,Bottom!
    Thanks!
  • Ура, осталось решить 1 вопрос.
    +1 или не +1? вот в чём вопрос...

    я не пробовал, не знаю,
    но по первому впечатлению +1 там нужен.

    Пробовали?
    • Изменено INFEL8 23 мая 2013 г. 11:28
  • Все нормально.
    Больше ничего не надо.
    Все на месте - и у меня и в облаках,
    на седьмом небе.