0

WinForms で多言語 (コンピューター言語) のメモ帳を作成しています。「言語」と呼ばれるツールストリップメニューアイテムを含むメニューストリップがあります(ファイル、編集、表示など)。「言語」をクリックすると、チェック可能なメニュー項目がいくつかあります。私はこれをしたい: アイテムをクリックすると、チェックされているように見えます。ユーザーがもう一度クリックすると、チェックされていないように見えます。java、c、c++ などの言語ごとにコンパイラを組み込むにはどうすればよいですか。

4

2 に答える 2

2

チェックは必要ありません。複数の言語をチェックしても意味がありません。ラジオボタンが必要です。メニューストリップのレンダラーをオーバーライドすることで取得できます。メニュー項目の CheckedChanged イベントを処理して、1 つだけを選択できるようにする必要もあります。このコードはトリックを行います:

  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 に答える