C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Visual C# メニューバーの表示・非表示の方法

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■94529 / inTopicNo.1)  Visual C# メニューバーの表示・非表示の方法
  
□投稿者/ C#初心者 (10回)-(2020/04/16(Thu) 23:40:25)

分類:[C#] 

使用環境:Windows10 64bit,visual studio 2019

簡単なアプリを勉強で作製中です.
デザインをシンプルにしたいのでForm枠を非表示としており,
メニューバー(menustrip)を上部に配置しています(画面上は最前面).
通常はメニューバーはデフォルトで非表示(VisibleをFalseとし),
イベントハンドラ(MouseMove等)時に表示させたいです.(↓参照)

private void Menu_memo_MouseMove(object sender, MouseEventArgs e)
{
Menu_memo.Visible = true;
}

ですが,マウスを動かしてもメニューが表示されません.
どうすれば良いか分からないのでご教示いただければ幸いです.
引用返信 編集キー/
■94531 / inTopicNo.2)  Re[1]: Visual C# メニューバーの表示・非表示の方法
□投稿者/ KOZ (112回)-(2020/04/17(Fri) 02:07:55)
No94529 (C#初心者 さん) に返信
> 通常はメニューバーはデフォルトで非表示(VisibleをFalseとし),
> イベントハンドラ(MouseMove等)時に表示させたいです.(↓参照)

Visible を False にするとイベントも入ってこないので、
フォームを含め、他のコントロールのイベントを拾うしかありません。

イベントでは、マウス座標をいったんスクリーン座標にし、さらに
フォームの座標に変換します。

その座標が、Menu_memo の座標範囲内なら表示、でなければ非表示にします。

using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1() {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {
        Menu_memo.Visible = false;
        AllAddHandler(this);
    }

    void AllAddHandler(Control con) {
        con.MouseMove += All_MouseMove;
        if (con.HasChildren) {
            foreach (Control child in con.Controls) {
                AllAddHandler(child);
            }
        }
    }

    private void All_MouseMove(object sender, MouseEventArgs e) {
        var con = (Control)sender;
        var screenLocation = con.PointToScreen(e.Location);
        var formLocation = this.PointToClient(screenLocation);
        Menu_memo.Visible = Menu_memo.Bounds.Contains(formLocation);
    }
}



引用返信 編集キー/
■94573 / inTopicNo.3)  Re[2]: Visual C# メニューバーの表示・非表示の方法
□投稿者/ C#初心者 (11回)-(2020/04/21(Tue) 19:01:59)
No94531 (KOZ さん) に返信
> ■No94529 (C#初心者 さん) に返信
>>通常はメニューバーはデフォルトで非表示(VisibleをFalseとし),
>>イベントハンドラ(MouseMove等)時に表示させたいです.(↓参照)
>
> Visible を False にするとイベントも入ってこないので、
> フォームを含め、他のコントロールのイベントを拾うしかありません。
>
> イベントでは、マウス座標をいったんスクリーン座標にし、さらに
> フォームの座標に変換します。
>
> その座標が、Menu_memo の座標範囲内なら表示、でなければ非表示にします。
>
> using System;
> using System.Windows.Forms;
>
> public partial class Form1 : Form
> {
> public Form1() {
> InitializeComponent();
> }
>
> private void Form1_Load(object sender, EventArgs e) {
> Menu_memo.Visible = false;
> AllAddHandler(this);
> }
>
> void AllAddHandler(Control con) {
> con.MouseMove += All_MouseMove;
> if (con.HasChildren) {
> foreach (Control child in con.Controls) {
> AllAddHandler(child);
> }
> }
> }
>
> private void All_MouseMove(object sender, MouseEventArgs e) {
> var con = (Control)sender;
> var screenLocation = con.PointToScreen(e.Location);
> var formLocation = this.PointToClient(screenLocation);
> Menu_memo.Visible = Menu_memo.Bounds.Contains(formLocation);
> }
> }
>
>
>
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ