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

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

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

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

C#

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

Windows Forms

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

解決済

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

BeatStar
BeatStar

総合スコア4721

.NET Core

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

C#

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

Windows Forms

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

1回答

0評価

0クリップ

319閲覧

投稿2022/03/12 07:19

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

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

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

C#

// main.cs using System; using System.Windows.Forms; using Sample.Forms; namespace Sample{ class EntryPoint{ [STAThread] static void Main( string[] args ){ try{ Application.Run( new MainForm() ); }catch( System.Exception err ){ MessageBox.Show( err.Message ); } } } }

C#

// MainForm.cs using System.Drawing; using System.Windows.Forms; namespace Sample{ namespace Forms{ class MainForm : Form{ public MainForm(){ var toolStripContainer = new ToolStripContainer(); toolStripContainer.Dock = DockStyle.Fill; this.Controls.Add( toolStripContainer ); menuStrip1 = new MenuStrip(); this.SuspendLayout(); menuStrip1.SuspendLayout(); toolStripContainer.Controls.Add( menuStrip1 ); var items = new ToolStripMenuItem[2]; // 最初のアイテムを生成 items[0] = new ToolStripMenuItem(); items[0].Text = "ファイル(&F)"; menuStrip1.Items.Add( items[0] ); // サブメニュー(item[0]のサブ)を生成 items[1] = new ToolStripMenuItem(); items[1].Text = "開く(&O)"; items[1].Click += items1_Click; items[0].DropDownItems.Add( items[1] ); var tableLayouPanel = new TableLayoutPanel(); tableLayouPanel.ColumnCount = 1; tableLayouPanel.RowCount = 2; tableLayouPanel.Dock = DockStyle.Fill; this.Controls.Add( tableLayouPanel ); button1 = new Button(); button1.Location = new Point( 10, 30 ); button1.Size = new Size( 100, 20 ); button1.Text = "button1(&B)"; button1.Dock = DockStyle.Fill; button1.Click += button1_Click; tableLayouPanel.Controls.Add( button1 ); // レイアウトロジック再開 menuStrip1.ResumeLayout( false ); menuStrip1.PerformLayout(); this.ResumeLayout( false ); this.PerformLayout(); } private void items1_Click( object sender, System.EventArgs e ){ MessageBox.Show( "items[1]が押された" ); } private void button1_Click( object sender, System.EventArgs e ){ MessageBox.Show( "button1が押された" ); } private Button button1; private MenuStrip menuStrip1; } } }

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

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Zuishin

2022/03/12 07:54

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

2022/03/12 10:42

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

.NET Core

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

C#

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

Windows Forms

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