WinFormsまたはWin32のバグのようなものを探しています。フォームが表示される前にフォームを配置する方法がありますが、コントロールボックスをfalseに設定したフォームの高さを減らすと、いくつかのコントロールが切り捨てられます。ControlBoxがfalseで場所が設定されているときにフォームの高さがカットされます
これを再現する手順は、ControlBoxをfalseに設定して(閉じる/最小化/最大化ボタンを削除する)、Textが空でない文字列(タイトルバーは削除されません)に設定してから、フォームを作成した後のコードは、Show/ShowDialogを呼び出す前にLocationプロパティを何かに設定します。
問題は、Textが空(タイトルバーなし)の場合の高さが変更されているように見えます。 * .designer.csを手動で編集し、テキストを設定した後で、ControlBoxの値をに設定すると、問題はなくなります。しかし、生成されたコードを手動で変更することは、保守には実用的ではないようです。
位置を変更する前にControlBoxをtrueに設定しようとしましたが、位置を設定する前に高さを保存しようとしましたが(返される高さは短い値です)、位置を設定する前に無効にしてみましたテキストが記入されたという事実をピックアップします。これらのどれも、不正な高さの値を修正するように見えません。 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);
}
私は 'のvarのborderStyleを追加しました= dialog.FormBorderStyle; dialog.FormBorderStyle = FormBorderStyle.None; dialog.FormBorderStyle = borderStyle; '場所を変更する前に - あなたの提案によって枠線のスタイルを反転させて、完全に動作しているようです。フォームが正しく配置されている(計算でフォームの高さを使用することもできます)、高さは正しいです。 – David