每次运行项目时,带有MainMenu的窗体都会缩小 [英] Form with a MainMenu shrinks every time the project is run

查看:66
本文介绍了每次运行项目时,带有MainMenu的窗体都会缩小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我构建以下程序时,Form1的大小就会缩小20.(在某些情况下,我需要对表单进行更改,例如将someLaggyControl1移几个像素,但并非总是如此.这很奇怪.)该表单使用 MainMenu ,而不是

Whenever I build the following program Form1's size shrinks by 20. (In some cases I need to make a change to the form, such as moving someLaggyControl1 by a few pixels, but not always. It's weird.) The form uses a MainMenu for the menu, not a MenuStrip. Yes, MainMenu is older and not recommended for use, but I need to use it for several reasons, one of which being radio-button items. Changing to a MenuStrip isn't a valid solution for me.

以下是重现此问题所需的代码:

Here's the code needed to reproduce this issue:

namespace MainMenuMCVE
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            this.components = new System.ComponentModel.Container();
            this.MainMenu1 = new System.Windows.Forms.MainMenu(this.components);
            this.menuItem1 = new System.Windows.Forms.MenuItem();
            this.menuItem2 = new System.Windows.Forms.MenuItem();
            this.menuItem7 = new System.Windows.Forms.MenuItem();
            this.menuItem8 = new System.Windows.Forms.MenuItem();
            this.menuItem3 = new System.Windows.Forms.MenuItem();
            this.menuItem4 = new System.Windows.Forms.MenuItem();
            this.menuItem5 = new System.Windows.Forms.MenuItem();
            this.menuItem6 = new System.Windows.Forms.MenuItem();
            this.someLaggyControl1 = new MainMenuMCVE.SomeLaggyControl();
            this.SuspendLayout();
            // 
            // MainMenu1
            // 
            this.MainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem1,
            this.menuItem5});
            // 
            // menuItem1
            // 
            this.menuItem1.Index = 0;
            this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem2,
            this.menuItem3,
            this.menuItem4});
            this.menuItem1.Text = "Example";
            // 
            // menuItem2
            // 
            this.menuItem2.Index = 0;
            this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem7,
            this.menuItem8});
            this.menuItem2.Text = "Something";
            // 
            // menuItem7
            // 
            this.menuItem7.Index = 0;
            this.menuItem7.Text = "Another thing";
            // 
            // menuItem8
            // 
            this.menuItem8.Index = 1;
            this.menuItem8.Text = "Ect";
            // 
            // menuItem3
            // 
            this.menuItem3.Index = 1;
            this.menuItem3.Text = "Something else";
            // 
            // menuItem4
            // 
            this.menuItem4.Index = 2;
            this.menuItem4.Text = "A third thing";
            // 
            // menuItem5
            // 
            this.menuItem5.Index = 1;
            this.menuItem5.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem6});
            this.menuItem5.Text = "Example 2";
            // 
            // menuItem6
            // 
            this.menuItem6.Index = 0;
            this.menuItem6.Text = "Blah";
            // 
            // someLaggyControl1
            // 
            this.someLaggyControl1.Laggyness = 1000;
            this.someLaggyControl1.Location = new System.Drawing.Point(12, 81);
            this.someLaggyControl1.Name = "someLaggyControl1";
            this.someLaggyControl1.Size = new System.Drawing.Size(268, 23);
            this.someLaggyControl1.TabIndex = 0;
            this.someLaggyControl1.Text = "someLaggyControl1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 253);
            this.Controls.Add(this.someLaggyControl1);
            this.Menu = this.MainMenu1;
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.MainMenu MainMenu1;
        private System.Windows.Forms.MenuItem menuItem1;
        private System.Windows.Forms.MenuItem menuItem2;
        private System.Windows.Forms.MenuItem menuItem3;
        private System.Windows.Forms.MenuItem menuItem4;
        private System.Windows.Forms.MenuItem menuItem5;
        private System.Windows.Forms.MenuItem menuItem6;
        private System.Windows.Forms.MenuItem menuItem7;
        private System.Windows.Forms.MenuItem menuItem8;
        private SomeLaggyControl someLaggyControl1;
    }
}

SomeLaggyControl.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace MainMenuMCVE
{
    class SomeLaggyControl : Control
    {
        public int Laggyness { get; set; }

        protected override void OnPaint(PaintEventArgs e) {
            e.Graphics.DrawString("A laggy control that takes " + Laggyness + " ms to render", this.Font, Brushes.Black, 0, 0);
            System.Threading.Thread.Sleep(Laggyness);
            base.OnPaint(e);
        }
    }
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace MainMenuMCVE
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

其中的关键部分是一个表单Form1,其中包含一个MainMenu,该MainMenu具有一些

The key part of this is a Form, Form1, which contains a MainMenu that has a few MenuItems, one of which has several sub-MenuItems. It also contains SomeLaggyControl, which is (of course) used as an example. SomeLaggyControl takes 1 second to render and is used to emulate a bunch of controls so that the example doesn't get messy.

每当我运行程序时,Form1的大小就会缩小.我可能需要更改表单以使其缩小(例如,移动someLaggyControl1),否则我可能不需要;我认为这必须与生成新代码的设计人员打交道.无论如何,这都会导致表格缩小.

Whenever I run the program, Form1's size shrinks. I may need to make a change to the form for it to shrink (e.g. moving someLaggyControl1 about), or I may not; I believe this has to deal with the designer generating new code. Regardless, this results in a shrinking form.

以下是一些实际操作的图片:

Here's some pictures showing this in action:


表单在生成之前的原始外观,大小为300 x 300.


The original appearance of the form, before building, with a size of 300 by 300.


第一次重建后.虽然不明显,但是大小现在是300 x280.请检查滚动条.


After the first rebuild. It's not obvious, but the size is now 300 by 280. Check the scroll bar.


第二次重建后.表格现在是300 x 260,并且更加明显.


After a second rebuild. The form is now 300 by 260, and it's more obvious.


第三次重建后.现在是300 x 240,表格越来越小.


After a third rebuild. Now that it's 300 by 240, the form is getting small.


再进行几次重建后,我得到了这个易于使用的300 x 47格式的愉快片段.表单无法再收缩(尽管会尝试).


After several more rebuilds, I am left with this pleasant piece of easy to use 300 by 47 form. The form is unable to shrink anymore (though it tries).


我的主要问题是:如何停止调整表单大小(除了切换到MenuStrip之外)?我也对为什么会发生这种情况感兴趣,但这并不是太重要.


My primary question is this: How can I stop my form from resizing (apart from switching to a MenuStrip)? I'm also interested in why this happens, but that's not too important.

推荐答案

该旧菜单系统内置了一些功能,当将其附加到其Menu属性时,该格式会通过菜单系统的高度来增加窗体的大小在使用设计器时.

There is something built-in to that old menu system that increases the size of the form by the height of the menu system when it gets attached to its Menu property when using the designer.

要解决此问题,请进入Designer.cs文件,将以下行注释掉:

For a work-around, go in the Designer.cs file, comment out this line:

// this.Menu = this.MainMenu1;

然后,在OnLoad替代项中,重新附加它:

Then, in the OnLoad override, reattach it:

protected override void OnLoad(EventArgs e) {
  base.OnLoad(e);
  this.Menu = MainMenu1;
}

除非您从窗体区域下方的组件托盘中选择菜单,否则该菜单在设计器中将不可见.您会注意到菜单在窗体上变为可见,并且菜单可见时窗体的大小会临时 增大.这似乎阻止您的表单始终调整自身大小.

The menu won't be visible in the designer unless you select it from the component tray below the form area. You will notice the menu becomes visible on the form, and your form's size will temporarily increase while the menu is visible. This seems to prevent your form from always sizing itself.

这篇关于每次运行项目时,带有MainMenu的窗体都会缩小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆