質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

902閲覧

VSを使わずにWinFormsで開発する際、コントロールがメニューバーに隠れてしまう

BeatStar

総合スコア4958

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2022/03/12 07:19

C#のWinFormsでメニューバーをつけたいのですが、なぜか一番上のコントロールが隠れてしまいます。

ちなみにButton等のコントロールはTableLayoutPanelにDockStyle.Fillで貼り付けしています。
また、Visual Studio C#は使わないという前提です。

一応Windows APIみたいにX軸やY軸等を指定して貼り付ける方法でなら今回の問題は簡単に解決します。
ですがフォームのサイズが変更された等のイベントが面倒なのでTableLayoutPanelのようなものに任せたいと思っています。
その場合、メニューバーをつけるとデフォルトでは一番上にあるコントロールがメニューバーに隠れてしまいます。
以下のコードでいえばButton button1ですね。これが隠れてしまいます。
このbutton1がメニューバーの下から開始するにはどうすればいいでしょうか?
つまり、(メニューバー等以外での)クライアント領域はメニューバーや(今回はありませんが)ステータスバーを除いた範囲にしたいのです。

C#

1// main.cs 2using System; 3using System.Windows.Forms; 4using Sample.Forms; 5 6namespace Sample{ 7 class EntryPoint{ 8 [STAThread] 9 static void Main( string[] args ){ 10 try{ 11 Application.Run( new MainForm() ); 12 }catch( System.Exception err ){ 13 MessageBox.Show( err.Message ); 14 } 15 } 16 } 17}

C#

1// MainForm.cs 2using System.Drawing; 3using System.Windows.Forms; 4 5namespace Sample{ 6 namespace Forms{ 7 class MainForm : Form{ 8 public MainForm(){ 9 10 var toolStripContainer = new ToolStripContainer(); 11 toolStripContainer.Dock = DockStyle.Fill; 12 this.Controls.Add( toolStripContainer ); 13 14 menuStrip1 = new MenuStrip(); 15 this.SuspendLayout(); 16 menuStrip1.SuspendLayout(); 17 18 toolStripContainer.Controls.Add( menuStrip1 ); 19 20 var items = new ToolStripMenuItem[2]; 21 22 // 最初のアイテムを生成 23 items[0] = new ToolStripMenuItem(); 24 items[0].Text = "ファイル(&F)"; 25 menuStrip1.Items.Add( items[0] ); 26 27 // サブメニュー(item[0]のサブ)を生成 28 items[1] = new ToolStripMenuItem(); 29 items[1].Text = "開く(&O)"; 30 items[1].Click += items1_Click; 31 items[0].DropDownItems.Add( items[1] ); 32 33 var tableLayouPanel = new TableLayoutPanel(); 34 tableLayouPanel.ColumnCount = 1; 35 tableLayouPanel.RowCount = 2; 36 tableLayouPanel.Dock = DockStyle.Fill; 37 this.Controls.Add( tableLayouPanel ); 38 39 button1 = new Button(); 40 button1.Location = new Point( 10, 30 ); 41 button1.Size = new Size( 100, 20 ); 42 button1.Text = "button1(&B)"; 43 button1.Dock = DockStyle.Fill; 44 button1.Click += button1_Click; 45 tableLayouPanel.Controls.Add( button1 ); 46 47 // レイアウトロジック再開 48 menuStrip1.ResumeLayout( false ); 49 menuStrip1.PerformLayout(); 50 this.ResumeLayout( false ); 51 this.PerformLayout(); 52 } 53 54 private void items1_Click( object sender, System.EventArgs e ){ 55 MessageBox.Show( "items[1]が押された" ); 56 } 57 58 private void button1_Click( object sender, System.EventArgs e ){ 59 MessageBox.Show( "button1が押された" ); 60 } 61 62 private Button button1; 63 64 private MenuStrip menuStrip1; 65 } 66 } 67}

ToolStripの場合はToolStripContainerというクラスがあり、それを使えばいいようですが、
メニューバー系のContainerが見つかりません。

やはりメニューバーを使うにはbutton1等のコントロールはX軸やらY軸やらを指定する方法しかないのでしょうか?

[情報]
言語: C#
.NET: .NET5 ( 5.0.201 )
VS: Visual Studio C#は使わない (訳があってインストールすらできない)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/03/12 07:54

コントロールを生成する順番を変えてみてください。
BeatStar

2022/03/12 10:42

ありがとうございます。確かにButton -> Menuという順番でやったらうまく表示できました。
guest

回答1

0

ベストアンサー

ToolStripContainerはToolStripを配置する領域(TopToolStripPanelやBottomToolStripPanel等)とその他のコンテンツを配置する領域(ContentPanel)があります。

なので、メニューはTopToolStripPanelにAddし、buttonはContentPanelにAddすればいいでしょう。

C#

1 public Form1() 2 { 3 toolStripContainer1 = new ToolStripContainer(); 4 toolStripContainer1.Dock = DockStyle.Fill; 5 Controls.Add(toolStripContainer1); 6 7 menuStrip1 = new MenuStrip(); 8 var items = new ToolStripMenuItem[2]; 9 10 // 最初のアイテムを生成 11 items[0] = new ToolStripMenuItem(); 12 items[0].Text = "ファイル(&F)"; 13 menuStrip1.Items.Add(items[0]); 14 15 // サブメニュー(item[0]のサブ)を生成 16 items[1] = new ToolStripMenuItem(); 17 items[1].Text = "開く(&O)"; 18 items[1].Click += items1_Click; 19 items[0].DropDownItems.Add(items[1]); 20 toolStripContainer1.TopToolStripPanel.Controls.Add(menuStrip1); 21 toolStripContainer1.TopToolStripPanel.Visible = true; 22 23 var tableLayouPanel = new TableLayoutPanel(); 24 tableLayouPanel.ColumnCount = 1; 25 tableLayouPanel.RowCount = 2; 26 tableLayouPanel.Dock = DockStyle.Fill; 27 toolStripContainer1.ContentPanel.Controls.Add(tableLayouPanel); 28 29 button1 = new Button(); 30 button1.Location = new Point(0, 0); 31 button1.Size = new Size(100, 20); 32 button1.Text = "button1(&B)"; 33 button1.Dock = DockStyle.Fill; 34 button1.Click += button1_Click; 35 tableLayouPanel.Controls.Add(button1); 36 37 }

またどのようなレイアウトを求めているのかは知りませんが、フォームサイズの変更によるレイアウトの調整であればDockプロパティやAnchorプロパティで十分な場合もあります。

投稿2022/03/12 08:11

編集2022/03/12 08:37
YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2022/03/12 10:43

ありがとうございます。 ToolStripContainerでよかったんですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問