none
Разная прорисовка окна приложения в режиме разработки и в режиме исполнения RRS feed

Ответы

  • Стоило с этого начать. В WinForms класс окна зашит в код Windows и то как оно выгладит зависит от ОС на которой выполняется программа. То есть одна и та же программа в XP, Win7 и Win10 будет выглядит по разному. Это нормально и так и должно быть. Если хотите единый стиль, то вы должны разработать его самостоятельно, что на WinForms  сделать трудновато.

    VB.Net - WPF, UWP

    3 октября 2016 г. 10:13
    Отвечающий
  • Нашел другое решение, ВЫСОКОЙ степени извращенности,как заставить винду отображать окно как в конструкторе.

    Я начал думать, как редактор отображает окно без украшательств. И я понял, что это из-за того, что окно является дочерним для другого окна. Украшательства работают только для окон верхнего уровня! Значит надо запихнуть наше окно в окно-обертку у которого нет ни рамки ни заголовка ни рожна, и вообще оно прозрачное. Что приводит меня вот к такому коду:

    //Form1.cs
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace WindowsForms_test
    {
        public partial class Form1 : Form //невидимое окно-обертка
        {       

            [DllImport("user32.dll")]
            public static extern int SetParent(IntPtr hWnd, IntPtr NewParent);

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //создаем невидимое окно
                this.WindowState = FormWindowState.Maximized;//окно на весь экран
                this.TransparencyKey = this.BackColor;//окно все прозрачное
                this.FormBorderStyle = FormBorderStyle.None;//окно не имеет рамки

                FormMain f = new FormMain();//создаем настоящее окно
                f.BackColor = SystemColors.ControlLight;//чтобы не совпадало с ключем прозрачности окна-обертки
                IntPtr hwnd=f.Handle;
                SetParent(hwnd, this.Handle);//засовываем настоящее окно в невидимое окно            
                f.Show();             
            }
        }
    }

    //FormMain.cs
    using System;
    using System.Windows.Forms;

    namespace WindowsForms_test
    {
        public partial class FormMain : Form
        {
            public FormMain() //реальное главное окно
            {
                InitializeComponent();
            }

            /* Здесь ваши поля, методы, свойства и т.п. */
        }
    }

            
    3 октября 2016 г. 16:09

Все ответы

  • И вы надеетесь на наличие здесь экстрасенса, который поймет о чем именно идет речь?

    VB.Net - WPF, UWP

    30 сентября 2016 г. 11:28
    Отвечающий
  • Попробуйте убрать в XAML

    mc:Ignorable="d"
    d:DesignHeight="768" d:DesignWidth="1024"

    А задать просто Height и Width

    я задаю обычно MinHeight MinWidth
    • Изменено DevingAs 30 сентября 2016 г. 12:26
    30 сентября 2016 г. 12:26
  • Какую технологию используете WinForms, WPF ...?
    30 сентября 2016 г. 17:24
  • Разработка WinForm

    Форма в режиме разработки

    Форма в режиме исполнения

    Форма в режиме исполнения

    Наложение форм режима исполнения и режима разработки

    Наложение форм режима исполнения и режима разработки

    3 октября 2016 г. 10:03
  • Стоило с этого начать. В WinForms класс окна зашит в код Windows и то как оно выгладит зависит от ОС на которой выполняется программа. То есть одна и та же программа в XP, Win7 и Win10 будет выглядит по разному. Это нормально и так и должно быть. Если хотите единый стиль, то вы должны разработать его самостоятельно, что на WinForms  сделать трудновато.

    VB.Net - WPF, UWP

    3 октября 2016 г. 10:13
    Отвечающий
  • возможно, в режиме исполнения юзаются стили оформления, а конструктор о них не знает.

    если в файле Program.cs (если пишете на c#), метод Main, убрать строку

    Application.EnableVisualStyles();

    что изменится?

    P.S. Потестил в Win7, не пашет. Единственное что различается - это внешний вид кнопок. Без стилей они квадратные как в Win98. Рамка окна все равно использует включенную в системе прозрачность. Удалось приблизить вид приложения к "конструкторному" только глобальным отключением Аэро через DwmEnableComposition(false); из dwmapi.dll (которое почему то еще и вызвало разбалансировку стека :D). Так что совет - не пытайтесь сделать то, что хотите сделать. Пусть пользователь сам решает, как приложение будет отображаться. 

    • Изменено VadimTagil 3 октября 2016 г. 10:49 добавлено
    3 октября 2016 г. 10:27
  • Все без изменения
    3 октября 2016 г. 10:52
  • Судя по всему так оно и есть. Ведь сначала запускается главное окно приложения и стиль его соответствует стилю OC. У меня Win10. Только сейчас я обратил внимание, что и другие приложения, запускаемые на компе, имеют такой же (угловатый вид). С сайта MSDN я скачал официальную версию .NET. По анализу кода class Form прорисовкой окна не занимается, а вызывает для этого более низкоуровневую обработку. Разработка скорее всего трудновата, ведь это главное окно приложения. Судя по всему придется рассмотреть другие платформы для разработки.
    3 октября 2016 г. 11:06
  • Судя по всему так оно и есть. Ведь сначала запускается главное окно приложения и стиль его соответствует стилю OC. У меня Win10. Только сейчас я обратил внимание, что и другие приложения, запускаемые на компе, имеют такой же (угловатый вид). С сайта MSDN я скачал официальную версию .NET. По анализу кода class Form прорисовкой окна не занимается, а вызывает для этого более низкоуровневую обработку. Разработка скорее всего трудновата, ведь это главное окно приложения. Судя по всему придется рассмотреть другие платформы для разработки.
    То есть вы мне не поверили))) Стандартный внешний вид окна и элементов управления определяется ОС. Это сделано для стандартизации, что бы все программы в конкретной версии ОС смотрелись одинаково.

    VB.Net - WPF, UWP

    3 октября 2016 г. 11:10
    Отвечающий
  • ну как вариант, проверьте будет ли работать DwmEnableComposition(false) в Win10 если запустить в режиме совместимости с Win7. И если да, неким образом завставлять пользователя всегда запускать приладу в этом режиме (например, создать инсталлятором ярлык с таким режимом) :D
    3 октября 2016 г. 11:57
  • запускается главное окно приложения и стиль его соответствует стилю OC

    Именно! За долгие годы пользователи привыкли к тому, что внешний вид большинства приложений имеет единый стиль. Это упрощает использование софта, устраняет необходимость переучиваться для исполльзования каждого приложения.

    В прошлом веке, во времена DOS и других подобных ОС у каждой программы был свой интерфейс, свои команды, свои приёмы работы. Это сильно затрудняло работу пользователей. Потом появилась Windows с единым интерфейсом. И жизнь простых юзверей стала легка и приятна!

    другие приложения, запускаемые на компе, имеют такой же (угловатый вид)

    Кому не нравится вид, тот может изменить тему своей ОСи. Пожалуйста, не решайте за пользователей, что им удобней! У кого плохое зрение, тот увеличит шрифт и добавит контрастности. И т. п.

    С сайта MSDN я скачал официальную версию .NET.

    Это не зависит от .NET.

    По анализу кода class Form прорисовкой окна не занимается, а вызывает для этого более низкоуровневую обработку.

    Верно.

    Разработка скорее всего трудновата, ведь это главное окно приложения.

    Если вы не будете пытаться изменить стандартное поведение операционной системы, то разработка элементарна. Ваше дело - разместить компоненты на формах и задать их поведение. Внешний вид - не ваша забота.

    Судя по всему придется рассмотреть другие платформы для разработки.

    Раньше разработчики WinForms, VCL и других похожих фреймворков делали стандартные интерфейсы, привычные пользователям. А теперь, похоже, бедным юзерам придётся всё больше и больше мучаться. Досадно.

    3 октября 2016 г. 15:56
  • Нашел другое решение, ВЫСОКОЙ степени извращенности,как заставить винду отображать окно как в конструкторе.

    Я начал думать, как редактор отображает окно без украшательств. И я понял, что это из-за того, что окно является дочерним для другого окна. Украшательства работают только для окон верхнего уровня! Значит надо запихнуть наше окно в окно-обертку у которого нет ни рамки ни заголовка ни рожна, и вообще оно прозрачное. Что приводит меня вот к такому коду:

    //Form1.cs
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace WindowsForms_test
    {
        public partial class Form1 : Form //невидимое окно-обертка
        {       

            [DllImport("user32.dll")]
            public static extern int SetParent(IntPtr hWnd, IntPtr NewParent);

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //создаем невидимое окно
                this.WindowState = FormWindowState.Maximized;//окно на весь экран
                this.TransparencyKey = this.BackColor;//окно все прозрачное
                this.FormBorderStyle = FormBorderStyle.None;//окно не имеет рамки

                FormMain f = new FormMain();//создаем настоящее окно
                f.BackColor = SystemColors.ControlLight;//чтобы не совпадало с ключем прозрачности окна-обертки
                IntPtr hwnd=f.Handle;
                SetParent(hwnd, this.Handle);//засовываем настоящее окно в невидимое окно            
                f.Show();             
            }
        }
    }

    //FormMain.cs
    using System;
    using System.Windows.Forms;

    namespace WindowsForms_test
    {
        public partial class FormMain : Form
        {
            public FormMain() //реальное главное окно
            {
                InitializeComponent();
            }

            /* Здесь ваши поля, методы, свойства и т.п. */
        }
    }

            
    3 октября 2016 г. 16:09
  • Переходите на WPF и будет все отображать, как Вы пожелаете, без таких костылей, которые Вы тут нагородили.
    3 октября 2016 г. 17:33
  • Переходите на WPF и будет все отображать, как Вы пожелаете
    У окон приложений WPF внешний вид точно так же определяется операционной системой. И по умолчанию в Десятке он будет "плоский, угловатый".
    4 октября 2016 г. 8:05
  • Нашел другое решение, ВЫСОКОЙ степени извращенности,как заставить винду отображать окно как в конструкторе.

    Я начал думать, как редактор отображает окно без украшательств. И я понял, что это из-за того, что окно является дочерним для другого окна. Украшательства работают только для окон верхнего уровня! Значит надо запихнуть наше окно в окно-обертку у которого нет ни рамки ни заголовка ни рожна, и вообще оно прозрачное. Что приводит меня вот к такому коду:

    //Form1.cs
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace WindowsForms_test
    {
        public partial class Form1 : Form //невидимое окно-обертка
        {       

            [DllImport("user32.dll")]
            public static extern int SetParent(IntPtr hWnd, IntPtr NewParent);

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //создаем невидимое окно
                this.WindowState = FormWindowState.Maximized;//окно на весь экран
                this.TransparencyKey = this.BackColor;//окно все прозрачное
                this.FormBorderStyle = FormBorderStyle.None;//окно не имеет рамки

                FormMain f = new FormMain();//создаем настоящее окно
                f.BackColor = SystemColors.ControlLight;//чтобы не совпадало с ключем прозрачности окна-обертки
                IntPtr hwnd=f.Handle;
                SetParent(hwnd, this.Handle);//засовываем настоящее окно в невидимое окно            
                f.Show();             
            }
        }
    }

    //FormMain.cs
    using System;
    using System.Windows.Forms;

    namespace WindowsForms_test
    {
        public partial class FormMain : Form
        {
            public FormMain() //реальное главное окно
            {
                InitializeComponent();
            }

            /* Здесь ваши поля, методы, свойства и т.п. */
        }
    }

            
    Ок. вполне работает. Код из     private void Form1_Load моно вставить непосредственно в конструктор формы главного окна. Но при закрытии формы не закрывается главное окно.
    4 октября 2016 г. 16:27
  • Переходите на WPF и будет все отображать, как Вы пожелаете

    У окон приложений WPF внешний вид точно так же определяется операционной системой. И по умолчанию в Десятке он будет "плоский, угловатый".
    Как плоский угловатый, когда можно меню сделать хоть круглым, хоть овальным, сгладить углы в разработанном с нуля меню? WPF очень гибок, не могу проверить в вин 10, но думаю, что на любой ОС с нужными фреймворком все будет, как Вы пожелаете.
    4 октября 2016 г. 17:43
  • Как плоский угловатый, когда можно меню сделать хоть круглым, хоть овальным, сгладить углы в разработанном с нуля меню? WPF очень гибок, не могу проверить в вин 10, но думаю, что на любой ОС с нужными фреймворком все будет, как Вы пожелаете.

    Нестандартный интерфейс можно сделать и в WinForms, просто WPF это делается легче, но суть ответа Petalvik была в том, что без вмешательств все технологии используют базовые классы ОС и выглядят так как нужно в конкретной версии ОС.

    Автору вопроса нужно понять банальную вещь - не вмешательство во внешний вид не вредит программе и абсолютно не важно как она выглядит на каких ОС. Различия в отображении в VS и при исполнении опять же безвредны, так как отличается неклиентская часть. Но, в случаях, когда интерфейс программы должен быть единым (корпоративным), используются технологии, позволяющие легче создавать собственные стили для приложения (например WPF).

    Итог: если вы боитесь, что показанное на скриншотах сломает вашу программу, то не бойтесь. Если вам это просто не нравится, то изучайте WPF и стилизацию приложений.

    PS. Извращение с внешним невидимым окном, которые выше придумали, как раз не самый лучший подход, так как вызовет массу потенциальных проблем, о которых вы пока не догадываетесь.


    VB.Net - WPF, UWP

    4 октября 2016 г. 18:08
    Отвечающий
  • "Но при закрытии формы не закрывается главное окно."

    Это легко устранить, но есть одна тонкость. Просто вызов MainForm.Owner.Close() вызывает переполненеие стека :) Так что добавьте в MainForm статическое поле

    public static Form TopLevelWindow;

    В Form1_Load строку:

    MainForm,TopLevelWindow=this;

    В MainForm_OnClose строку:

    TopLevelWindow.Close();



    5 октября 2016 г. 3:02
  • "Автору вопроса нужно понять банальную вещь - не вмешательство во внешний вид не вредит программе и абсолютно не важно как она выглядит на каких ОС. Различия в отображении в VS и при исполнении опять же безвредны, так как отличается неклиентская часть. Но, в случаях, когда интерфейс программы должен быть единым (корпоративным), используются технологии, позволяющие легче создавать собственные стили для приложения (например WPF).

    Итог: если вы боитесь, что показанное на скриншотах сломает вашу программу, то не бойтесь. Если вам это просто не нравится, то изучайте WPF и стилизацию приложений"

    В ответ хочется задать вопрос? Почему многие предпочитают ездить на машинах типа Audi, BMW, а не на ВАЗ 4 и 7? Ведь это тоже машины и выполняют функции машин (перевозят), как и функциональность программы. Но почему то хочется сесть в машину, где есть некое изящество, нет резких углов одна линия плавно переходит в другую. И это не маловажный фактор при выборе машины. Почему при выборе программы, нужно обращать внимание только на функциональность?  ОК, Буду изучать WPF 

    5 октября 2016 г. 8:42
  • В ответ хочется задать вопрос? Почему многие предпочитают ездить на машинах типа Audi, BMW, а не на ВАЗ 4 и 7? Ведь это тоже машины и выполняют функции машин (перевозят), как и функциональность программы. Но почему то хочется сесть в машину, где есть некое изящество, нет резких углов одна линия плавно переходит в другую. И это не маловажный фактор при выборе машины. Почему при выборе программы, нужно обращать внимание только на функциональность?  ОК, Буду изучать WPF 

    Сравнение немного не верное. Вас отговаривают не от более красивого дизайна автомобиля, а от размещения педали газа на потолке.

    У меня у самого почти все приложения WPF имеют нестандартный внешний вид, но изменения выверены с привычками пользователя и не вредят ему. Если вы сделаете так же, то в этом нет ничего плохого, но по опыту больше половины разработчиков меняют внешний вид настолько, что пользователь в ужасе бежит от такого приложения.


    VB.Net - WPF, UWP

    5 октября 2016 г. 9:12
    Отвечающий
  • Желание разработчика отображать окно без стилей вполне легально. Не обязательно навязывать, это может быть и как пользовательская настройка, не? Да и процесс убиения стилей обратим: вызов SetParent(hwnd, (IntPtr)0); делает вполне то, что ожидалось.
    5 октября 2016 г. 17:24
  • В ответ хочется задать вопрос? Почему многие предпочитают ездить на машинах типа Audi, BMW, а не на ВАЗ 4 и 7? Ведь это тоже машины и выполняют функции машин (перевозят), как и функциональность программы. Но почему то хочется сесть в машину, где есть некое изящество, нет резких углов одна линия плавно переходит в другую. И это не маловажный фактор при выборе машины. Почему при выборе программы, нужно обращать внимание только на функциональность?  ОК, Буду изучать WPF 

    Сравнение немного не верное. Вас отговаривают не от более красивого дизайна автомобиля, а от размещения педали газа на потолке.

    У меня у самого почти все приложения WPF имеют нестандартный внешний вид, но изменения выверены с привычками пользователя и не вредят ему. Если вы сделаете так же, то в этом нет ничего плохого, но по опыту больше половины разработчиков меняют внешний вид настолько, что пользователь в ужасе бежит от такого приложения.


    VB.Net - WPF, UWP

    Педаль газа на потолке, это когда стандартные элементы, кнопки, иконки, минимизации, закрытие окна располагать в ином, отличном от стандарта месте. А я всего-навсего хочу, чтобы таблица (Grid) выглядела не как будто на нее надели шапку чуть набекрень и немного не того размера, а гармонично вписывалась в форму и была единой и целой формой.

    5 октября 2016 г. 19:43