Date: 03.10.2016 10:27:50
возможно, в режиме исполнения юзаются стили оформления, а конструктор о них не знает.
если в файле Program.cs (если пишете на c#), метод Main, убрать строку
Application.EnableVisualStyles();
что изменится?
P.S. Потестил в Win7, не пашет. Единственное что различается - это внешний вид кнопок. Без стилей они квадратные как в Win98. Рамка окна все равно использует включенную в системе прозрачность. Удалось приблизить вид приложения к "конструкторному" только глобальным отключением Аэро через DwmEnableComposition(false); из dwmapi.dll (которое почему то еще и вызвало разбалансировку стека :D). Так что совет - не пытайтесь сделать то, что хотите сделать. Пусть пользователь сам решает, как приложение будет отображаться.
Date: 03.10.2016 11:57:16
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();
}
/* Здесь ваши поля, методы, свойства и т.п. */
}
}
Date: 05.10.2016 3:02:44
"Но при закрытии формы не закрывается главное окно."
Это легко устранить, но есть одна тонкость. Просто вызов MainForm.Owner.Close() вызывает переполненеие стека :) Так что добавьте в MainForm статическое поле
public static Form TopLevelWindow;
В Form1_Load строку:
MainForm,TopLevelWindow=this;
В MainForm_OnClose строку:
TopLevelWindow.Close();
Date: 05.10.2016 17:24:16
Автор: VadimTagil