2013-05-28 2 views
0

Я использую этот код, чтобы скрыть минимизируют/максимальное управление формы и только показать границуНеизвестного поведение в WinForms

protected override System.Windows.Forms.CreateParams CreateParams 
{ 
    get 
    { 
     var parms = base.CreateParams; 

     parms.Style &= ~0x00C00000; // remove WS_CAPTION 
     parms.Style |= 0x00040000; // include WS_SIZEBOX 
     return parms; 
    } 
} 

форма выглядит в Visual Studio enter image description here

И после запуска приложение выглядит так: enter image description here

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

+0

На скриншоте дизайн, что чуть ниже этикетке «Вы хотите установить»? – DonBoitnott

+0

У меня есть индикатор выполнения ниже этой метки. –

+0

Позвольте мне проверить, что sir –

ответ

2

Причиной этого случая является то, что Form.Size свойство, которое определяет ширину и высоту вы формируете включает размер границы окна , В Дизайнере форм нет границы, поэтому вы видите всю форму, как она была выложена. Однако, когда окно визуализируется Windows, добавленная граница подсчитывается против указанного размера.

Чтобы противодействовать этому, после загрузки или отображения формы вы можете добавить к размеру окна в два раза больше значения размера границы. Вы можете получить этот размер границы на P/InvokingGetSystemMetrics Win32 API function с использованием SM_CXSIZEFRAME (32) в качестве параметра для извлечения ширины или SM_CYSIZEFRAME (33) для извлечения высоты.

Вот о том, что вы ищете:

[DllImport("user32.dll")] 
private static extern int GetSystemMetrics(int index); 

private static int WindowBorderWidth 
{ 
    get { return GetSystemMetrics(32); } 
} 

private static int WindowBorderHeight 
{ 
    get { return GetSystemMetrics(33); } 
} 

protected override void OnLoad(EventArgs e) 
{ 
    int increaseWidth = WindowBorderWidth * 2; 
    int increaseHeight = WindowBorderHeight * 2; 

    this.Size = new Size(
     this.Size.Width + increaseWidth, 
     this.Size.Height + increaseHeight 
    ); 
} 
+0

Это работает отлично, но я обновлял текст меток при загрузке формы, теперь на форме текст метки загрузки не обновляется. –

+0

Спасибо. Я поместил код загрузки своей формы в эту функцию 'protected override void OnLoad', и теперь он отлично работает. –

+0

Этот код неправильный, он не будет работать должным образом в .NET 4.5 –

1

Я не могу воспроизвести это точно. Первая возможная проблема заключается в том, что это похоже на унаследованную форму, это может вызвать проблемы, если элементы управления в базовой форме имеют набор привязки с включенным нижним или правым анкером. Который позиционирует элемент управления на основе размера базовой формы, а не унаследованной формы. Исправьте это, только включив эти якоря в производной форме.

Во-вторых, и, более вероятно, проблема заключается в том, что вы боретесь с проблемой appcompat в Aero. Жирные границы являются значительной проблемой в Aero, так как приложение определяет размер внешнего окна. Но действительно заботит размер внутреннего окна, размер клиентского прямоугольника. Если Aero не справится с этим, окно будет иметь слишком маленькую клиентскую область, не оставляя достаточно места для элементов управления. Он делает это , лежащий о размере окна, тайно делая его больше, чем попросил приложение. А затем, когда вы спрашиваете размер, сообщите меньший размер, чем на самом деле.

Ваше переопределение CreateParams превращается из-за нестандартных стилей окна. Соответственно, клиентская область окна меньше по размеру границ, по умолчанию 6 пикселей.

Эта ложь вызывает множество других тонких проблем, трудно получить, например, выравнивание окон. Эта проблема была наконец решена в .NET 4.5, первой версии .NET, которая больше не нуждается в поддержке XP. И поэтому больше не нужна ложь. Он отмечает EXE-файл вашей программы как требующий Vista или выше. Который отвращает ложь.

Неясно, из какого вопроса вы хотите идти. В таком случае, вероятно, лучше всего просто увеличить размер окна. Вы делаете это в методе формы в OnLoad(), что-то вроде этого:

protected override void OnLoad(EventArgs e) { 
     this.ClientSize = new Size(NoButton.Right + 10, NoButton.Bottom + 10); 
     base.OnLoad(e); 
    } 
+0

Я получаю StackOverflow Exception :) 'Необработанное исключение типа« System.StackOverflowException »произошло в System.Windows.Forms.dll' –

+0

В этой строке' this.ClientSize = new Size (buttion1.Right + 10, button1.Bottom + 10); ' –

+1

Вы назвали' base.OnLoad (e) 'или' this.Onload (e) 'или просто' OnLoad (e) '? Часть «base» очень важна, чтобы убедиться, что вы вызываете своего родителя, а не вызываете себя и не можете быть удалены из вызова. –

Смежные вопросы