Высота формы обрезается, когда ControlBox имеет значение false и установлено Location - PullRequest
1 голос
/ 09 сентября 2011

Я ищу способ обойти что-то вроде ошибки в WinForms или Win32.У меня есть метод для позиционирования формы перед ее показом, но когда я показываю ее, высота форм с ControlBox, установленным в false, уменьшается, обрезая некоторые элементы управления.

Чтобы воспроизвести это, необходимо выполнитьформа в конструкторе с ControlBox, установленным в false (удаляет кнопки закрытия / минимизации / максимизации), а Text - непустая строка (заголовок не удаляется), а затем в коде после создания формы присваивает свойству Location какое-либо значение перед вызовомShow / ShowDialog.

Кажется, проблема в том, что высота изменяется на то, что было бы, если бы текст был пустым (без заголовка).Если я отредактирую * .designer.cs вручную и установлю значение ControlBox после , установив Text, проблема исчезнет.Но ручное изменение сгенерированного кода не кажется практичным или полезным для обслуживания.

Я пытался установить для ControlBox значение true в коде перед изменением местоположения, я пытался сохранить высоту до установки местоположения (возвращаемая высотаболее короткое значение), и я попытался сделать недействительной форму перед установкой Location, чтобы она уловила тот факт, что текст заполнен.Кажется, ни один из них не исправляет неверное значение высоты.В Reflector мои попытки отследить происходящее быстро исчезают в public static extern bool SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter, int x, int y, int cx, int cy, int flags) после установки некоторых значений стиля формы - я предполагаю, что здесь происходит какое-то волшебство, чтобы настроить размер формы.

// Method is called after dialog is created but before Show() is called
public static void PlaceDialog(Form dialog)
{   
 dialog.Location = new Point(1, 1);    
}

Любые идеи по поводу обходаЯ мог бы использовать в PlaceDialog, чтобы это исправить?Единственный, который я нашел, чтобы работать до сих пор, очень уродлив и нарушает ряд формальных событий:

// Method is called after dialog is created but before Show() is called
public static void PlaceDialog(Form dialog)
{ 
 if (dialog.ControlBox == false)
 {
   dialog.ControlBox = true;
   dialog.Show();
   dialog.ControlBox = false;
   dialog.Hide();
 }  
 dialog.Location = new Point(1, 1);    
}

1 Ответ

3 голосов
/ 09 сентября 2011

Попробуйте изменить или добавить следующее:

dialog.FormBorderStyle = FormBorderStyle.None;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...