0

我正在 WinForms 中制作多语言(计算机语言)记事本。我有一个带有名为“语言”的工具条菜单条的菜单条(如文件、编辑、查看等)。当您单击“语言”时,有几个可检查的菜单项。我想这样做:当一个项目被点击时,它会显示为选中;当用户再次单击它时,它显示为未选中。如何为每种语言(如 java、c、c++ 等)合并编译器。

4

2 回答 2

2

您不想要检查,检查一种以上的语言是没有意义的。你需要一个单选按钮。您可以通过覆盖菜单条的渲染器来获得一个。您还需要处理菜单项的 CheckedChanged 事件,以便只能选择一项。这段代码可以解决问题:

  public partial class Form1 : Form {
    private ToolStripMenuItem[] languages;
    private bool mBusy;

    public Form1() {
      InitializeComponent();
      languages = new ToolStripMenuItem[] { javaToolStripMenuItem, cSharpToolStripMenuItem, pythonToolStripMenuItem };
      foreach (var language in languages) {
        language.CheckOnClick = true;
        language.CheckedChanged += LanguageMenuItem_CheckedChanged;
      }
      menuStrip1.Renderer = new MyRenderer(languages);
    }

    void LanguageMenuItem_CheckedChanged(object sender, EventArgs e) {
      if (mBusy) return;
      mBusy = true;
      ToolStripMenuItem item = sender as ToolStripMenuItem;
      foreach (var language in languages) language.Checked = language == item;
      mBusy = false;
    }

    private class MyRenderer : ToolStripProfessionalRenderer {
      private ToolStripMenuItem[] languages;
      public MyRenderer(ToolStripMenuItem[] languages) { this.languages = languages; }

      protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) {
        ToolStripMenuItem item = e.Item as ToolStripMenuItem;
        if (item != null && languages.Contains(item))
          RadioButtonRenderer.DrawRadioButton(e.Graphics, e.ImageRectangle.Location,
            System.Windows.Forms.VisualStyles.RadioButtonState.CheckedNormal);
        else
          base.OnRenderItemCheck(e);
      }
    }
  }
于 2009-11-14T04:37:30.877 回答
0

你应该有一个设置文件来存储每个编译器的路径/位置。当用户选择一种语言时,您应该获得所选语言的匹配编译器的路径/位置。

于 2009-11-13T15:13:14.330 回答