Ответы с форумов MSDN

Рамка окна без визуальных стилей в Windows

Date: 03.10.2016 10:27:50

возможно, в режиме исполнения юзаются стили оформления, а конструктор о них не знает.

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

Application.EnableVisualStyles();

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

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

Message 1112

Date: 03.10.2016 11:57:16

ну как вариант, проверьте будет ли работать DwmEnableComposition(false) в Win10 если запустить в режиме совместимости с Win7. И если да, неким образом завставлять пользователя всегда запускать приладу в этом режиме (например, создать инсталлятором ярлык с таким режимом) :D

Message 1111

Date: 03.10.2016 16:09: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();
        }

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

        

Message 1108

Date: 05.10.2016 3:02:44

"Но при закрытии формы не закрывается главное окно."

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

public static Form TopLevelWindow;

В Form1_Load строку:

MainForm,TopLevelWindow=this;

В MainForm_OnClose строку:

TopLevelWindow.Close();



Message 1107

Date: 05.10.2016 17:24:16

Желание разработчика отображать окно без стилей вполне легально. Не обязательно навязывать, это может быть и как пользовательская настройка, не? Да и процесс убиения стилей обратим: вызов SetParent(hwnd, (IntPtr)0); делает вполне то, что ожидалось.

Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub