일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- math
- hive
- array
- SQL
- Apache
- Excel
- Mac
- string
- Kotlin
- gas
- Tkinter
- matplotlib
- PySpark
- google apps script
- django
- Redshift
- list
- Java
- c#
- numpy
- GIT
- Python
- Google Spreadsheet
- PANDAS
- PostgreSQL
- 파이썬
- Github
- Google Excel
- dataframe
- Today
- Total
달나라 노트
C# : MenuStrip, ToolStripMenuItem 본문
MenuStrip은 Window에 Menu Bar를 추가할 수 있도록 해줍니다.
아래 코드를 봅시다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
MenuStrip ms = new MenuStrip();
ms.Parent = fm;
ToolStripMenuItem menu_1 = new ToolStripMenuItem("Fruits");
ToolStripMenuItem menu_1_1 = new ToolStripMenuItem("Apple");
ToolStripMenuItem menu_1_2 = new ToolStripMenuItem("Banana");
ToolStripMenuItem menu_1_3 = new ToolStripMenuItem("Peach");
menu_1.DropDownItems.Add(menu_1_1);
menu_1.DropDownItems.Add(menu_1_2);
menu_1.DropDownItems.Add(menu_1_3);
ToolStripMenuItem menu_2 = new ToolStripMenuItem("Vegetables");
ToolStripMenuItem menu_2_1 = new ToolStripMenuItem("Potato");
ToolStripMenuItem menu_2_2 = new ToolStripMenuItem("Carrot");
menu_2.DropDownItems.Add(menu_2_1);
menu_2.DropDownItems.Add(menu_2_2);
ms.Items.Add(menu_1);
ms.Items.Add(menu_2);
Application.Run(fm);
}
}
위 코드를 실행하면 아래와 같은 Window가 뜹니다.
Fruits를 클릭해보면 아래와같이 드롭다운 메뉴가 나타납니다.
Vegetables도 마찬가지입니다.
위 코드를 부분별로 해석해봅시다.
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
먼저 메뉴를 표시할 Window를 생성합니다.
Form class를 이용하며
가로 길이(Width)는 500 세로 길이(Height)를 300으로 설정합니다.
MenuStrip ms = new MenuStrip();
ms.Parent = fm;
Menu Bar를 만들려면 MenuStrip class를 이용합니다.
또한 Menu Bar는 Window에 소속되어서 표시될 것이므로 ms.Parent를 fm으로 설정합니다.
ToolStripMenuItem menu_1 = new ToolStripMenuItem("Fruits");
ToolStripMenuItem menu_1_1 = new ToolStripMenuItem("Apple");
ToolStripMenuItem menu_1_2 = new ToolStripMenuItem("Banana");
ToolStripMenuItem menu_1_3 = new ToolStripMenuItem("Peach");
menu_1.DropDownItems.Add(menu_1_1);
menu_1.DropDownItems.Add(menu_1_2);
menu_1.DropDownItems.Add(menu_1_3);
...
ms.Items.Add(menu_1);
위 부분은 Fruits 메뉴와 Fruits 메뉴를 클릭했을 때 발생하는 드롭 다운 메뉴 구성 부분입니다.
Menu를 추가할 때에는 기본적으로 ms.Items.Add() method를 사용합니다.
여기에는 그냥 ms.Items.Add("Fruits")의 형태처럼 단순히 텍스트를 전달해도 메뉴가 구성됩니다.
다만 이렇게 텍스트로만 메뉴를 구성해두면 나중에 메뉴별로 Event를 등록하는 것이 어려워집니다.
따라서 위 코드를 보면 메뉴의 항목을 만들 때 ToolStripMenuItem class를 사용하게 됩니다.
ToolStripMenuItem class를 이용해 Menu 객체를 만들고 이 객체를 ms.Items.Add() 의 인자로서 전달하여 메뉴 항목을 추가하는 것이죠.
ToolStripMenuItem은 그냥 모든 메뉴 Item입니다. 그 메뉴가 메인 메뉴 위치에 있건 드롭다운 메뉴의 항목으로 있건 상관없이 말이죠.
그래서 위 코드를 보면
Fruits, Apple, Banana, Peach라는 이름을 가진 메뉴를 각각 생성합니다.
그리고 Apple, Banana, Peach라는 이름을 가진 Sub menu들(menu_1_1, menu_1_2, menu_1_3)을 Fruits 라는 이름을 가진 menu_1에 드롭다운 항목으로 추가하는것이죠.
어떤 메뉴에 대한 드롭다운 메뉴를 추가할 때에는 DropDownItems.Add() method를 이용합니다.
즉, 위 코드의 결과로 Fruits라는 이름의 menu_1은 드롭다운으로 Apple, Banana, Peach를 갖게 되는 것입니다.
그리고 이렇게 생성된 menu_1을 ms.Items.Add() method를 이용해서 Menu Strip에 추가해줍니다.
ToolStripMenuItem menu_2 = new ToolStripMenuItem("Vegetables");
ToolStripMenuItem menu_2_1 = new ToolStripMenuItem("Potato");
ToolStripMenuItem menu_2_2 = new ToolStripMenuItem("Carrot");
menu_2.DropDownItems.Add(menu_2_1);
menu_2.DropDownItems.Add(menu_2_2);
...
ms.Items.Add(menu_2);
Vegetable menu도 동일한 개념입니다.
Main menu인 Vegetable과 sub menu인 Potato, Carrot을 각각 생성한 후
Potato, Carrot menu를 Vegetables(menu_2)에 드롭다운으로 추가하고있습니다.
그리고 이렇게 생성된 드롭다운을 가진 Vegetables 메뉴(menu_2)를 ms.Items.Add method를 이용하여 Menu Strip에 추가하는것이죠.
드롭다운 메뉴 생성 과정을 응용해봅시다.
아래 코드는 드롭다운 메뉴에 드롭다운을 추가하여 2중 메뉴를 구성한 것입니다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
MenuStrip ms = new MenuStrip();
ms.Parent = fm;
ToolStripMenuItem menu_1 = new ToolStripMenuItem("Fruits");
ToolStripMenuItem menu_1_1 = new ToolStripMenuItem("Apple");
ToolStripMenuItem menu_1_2 = new ToolStripMenuItem("Banana");
ToolStripMenuItem menu_1_3 = new ToolStripMenuItem("Peach");
menu_1.DropDownItems.Add(menu_1_1);
menu_1.DropDownItems.Add(menu_1_2);
menu_1.DropDownItems.Add(menu_1_3);
ToolStripMenuItem menu_1_2_1 = new ToolStripMenuItem("Banana Size S");
ToolStripMenuItem menu_1_2_2 = new ToolStripMenuItem("Banana Size M");
ToolStripMenuItem menu_1_2_3 = new ToolStripMenuItem("Banana Size L");
menu_1_2.DropDownItems.Add(menu_1_2_1);
menu_1_2.DropDownItems.Add(menu_1_2_2);
menu_1_2.DropDownItems.Add(menu_1_2_3);
ToolStripMenuItem menu_2 = new ToolStripMenuItem("Vegetables");
ToolStripMenuItem menu_2_1 = new ToolStripMenuItem("Potato");
ToolStripMenuItem menu_2_2 = new ToolStripMenuItem("Carrot");
menu_2.DropDownItems.Add(menu_2_1);
menu_2.DropDownItems.Add(menu_2_2);
ms.Items.Add(menu_1);
ms.Items.Add(menu_2);
Application.Run(fm);
}
}
위 코드를 실행하면 Fruits -> Banana메뉴에 드롭다운이 하나 더 생긴 것을 볼 수 있습니다.
ToolStripMenuItem menu_1 = new ToolStripMenuItem("Fruits");
ToolStripMenuItem menu_1_1 = new ToolStripMenuItem("Apple");
ToolStripMenuItem menu_1_2 = new ToolStripMenuItem("Banana");
ToolStripMenuItem menu_1_3 = new ToolStripMenuItem("Peach");
menu_1.DropDownItems.Add(menu_1_1);
menu_1.DropDownItems.Add(menu_1_2);
menu_1.DropDownItems.Add(menu_1_3);
ToolStripMenuItem menu_1_2_1 = new ToolStripMenuItem("Banana Size S");
ToolStripMenuItem menu_1_2_2 = new ToolStripMenuItem("Banana Size M");
ToolStripMenuItem menu_1_2_3 = new ToolStripMenuItem("Banana Size L");
menu_1_2.DropDownItems.Add(menu_1_2_1);
menu_1_2.DropDownItems.Add(menu_1_2_2);
menu_1_2.DropDownItems.Add(menu_1_2_3);
...
ms.Items.Add(menu_1);
방식은 동일합니다.
드롭다운 메뉴를 추가할 메뉴는 Banana입니다.
따라서 Banana라는 이름을 가진 ToolStripMenuItem에 DropDownItems.Add method를 이용해서 드롭다운 메뉴를 추가하면 됩니다.
- menu_1.DropDownItems.Add(menu_1_2);
이 부분에서 menu_1(Fruits)에 menu_1_2(Banana)를 추가했습니다.
- ToolStripMenuItem menu_1_2_1 = new ToolStripMenuItem("Banana Size S");
- ToolStripMenuItem menu_1_2_2 = new ToolStripMenuItem("Banana Size M");
- ToolStripMenuItem menu_1_2_3 = new ToolStripMenuItem("Banana Size L");
- menu_1_2.DropDownItems.Add(menu_1_2_1);
- menu_1_2.DropDownItems.Add(menu_1_2_2);
- menu_1_2.DropDownItems.Add(menu_1_2_3);
그리고 위 부분에서 menu_1_2(Banana)에 Banana Size S, Banana Size M, Banana Size L이라는 3개의 메뉴를 드롭다운으로 추가하고 있습니다.
아래 예시는 메뉴에 Event를 추가한 코드입니다.
제가 클릭한 메뉴의 이름이 표시되도록 한 Event입니다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Label lbl = new Label();
lbl.Parent = fm;
lbl.Width = 200;
lbl.Height = 20;
lbl.Dock = DockStyle.Bottom;
MenuStrip ms = new MenuStrip();
ms.Parent = fm;
ToolStripMenuItem menu_1 = new ToolStripMenuItem("Fruits");
ToolStripMenuItem menu_1_1 = new ToolStripMenuItem("Apple");
ToolStripMenuItem menu_1_2 = new ToolStripMenuItem("Banana");
ToolStripMenuItem menu_1_3 = new ToolStripMenuItem("Peach");
menu_1.DropDownItems.Add(menu_1_1);
menu_1.DropDownItems.Add(menu_1_2);
menu_1.DropDownItems.Add(menu_1_3);
ToolStripMenuItem menu_1_2_1 = new ToolStripMenuItem("Banana Size S");
ToolStripMenuItem menu_1_2_2 = new ToolStripMenuItem("Banana Size M");
ToolStripMenuItem menu_1_2_3 = new ToolStripMenuItem("Banana Size L");
menu_1_2.DropDownItems.Add(menu_1_2_1);
menu_1_2.DropDownItems.Add(menu_1_2_2);
menu_1_2.DropDownItems.Add(menu_1_2_3);
ToolStripMenuItem menu_2 = new ToolStripMenuItem("Vegetables");
ToolStripMenuItem menu_2_1 = new ToolStripMenuItem("Potato");
ToolStripMenuItem menu_2_2 = new ToolStripMenuItem("Carrot");
menu_2.DropDownItems.Add(menu_2_1);
menu_2.DropDownItems.Add(menu_2_2);
ms.Items.Add(menu_1);
ms.Items.Add(menu_2);
void menu_event_click(object sender, EventArgs e)
{
ToolStripMenuItem selected_menu = (ToolStripMenuItem)sender;
lbl.Text = selected_menu.Text;
}
menu_1.Click += new EventHandler(menu_event_click);
menu_1_1.Click += new EventHandler(menu_event_click);
menu_1_2.Click += new EventHandler(menu_event_click);
menu_1_2_1.Click += new EventHandler(menu_event_click);
menu_1_2_2.Click += new EventHandler(menu_event_click);
menu_1_2_3.Click += new EventHandler(menu_event_click);
menu_1_3.Click += new EventHandler(menu_event_click);
menu_2.Click += new EventHandler(menu_event_click);
menu_2_1.Click += new EventHandler(menu_event_click);
menu_2_2.Click += new EventHandler(menu_event_click);
Application.Run(fm);
}
}
위 코드를 실행하면 아래와 같은 Window가 뜹니다.
그리고 메뉴를 클릭해봅시다.
제가 클릭한 메뉴의 이름이 표시됩니다.
이벤트 관련 코드는 아래와 같습니다.
void menu_event_click(object sender, EventArgs e)
{
ToolStripMenuItem selected_menu = (ToolStripMenuItem)sender;
lbl.Text = selected_menu.Text;
}
menu_1.Click += new EventHandler(menu_event_click);
menu_1_1.Click += new EventHandler(menu_event_click);
menu_1_2.Click += new EventHandler(menu_event_click);
menu_1_2_1.Click += new EventHandler(menu_event_click);
menu_1_2_2.Click += new EventHandler(menu_event_click);
menu_1_2_3.Click += new EventHandler(menu_event_click);
menu_1_3.Click += new EventHandler(menu_event_click);
menu_2.Click += new EventHandler(menu_event_click);
menu_2_1.Click += new EventHandler(menu_event_click);
menu_2_2.Click += new EventHandler(menu_event_click);
먼저 Event가 발생할 때 어떤 동작을 할지에 대한 내용을 담은 menu_event_click method를 봅시다.
여기서는 selected_menu의 Text(selected_menu.Text)를 Label의 Text(lbl.Text)로 설정하는 내용을 담고 있습니다.
한 가지 주의할 점은 Event method의 인자 중 하나인 object sender는 Event가 발생한 객체를 의미한다는 것입니다.
이 예시에서는 어떤 메뉴가 클릭되었을 때 Event를 발생시킬 것이므로 여기서 object sender는 Event가 발생한 Menu객체를 의미할겁니다.
이러한 흐름으로 Event가 발생한 Menu 객체는 sender라는 이름의 변수에 담겨집니다.
즉, Event method 내부에서는 Event가 발생한 객체를 sender라는 변수에 담아서 사용할 수 있게 됩니다.
다만 여기서 Event가 발생한 객체는 메뉴일수도있고, 버튼일수도있고 다양합니다.
- ToolStripMenuItem selected_menu = (ToolStripMenuItem)sender;
따라서 위 부분처럼 sender를 제가 원하는 Event 발생 객체의 타입인 ToolStripMenuItem(메뉴 항목) 타입으로 형변환(Cast)을 해줘서 사용해야합니다.
menu_1.Click += new EventHandler(menu_event_click);
menu_1_1.Click += new EventHandler(menu_event_click);
menu_1_2.Click += new EventHandler(menu_event_click);
menu_1_2_1.Click += new EventHandler(menu_event_click);
menu_1_2_2.Click += new EventHandler(menu_event_click);
menu_1_2_3.Click += new EventHandler(menu_event_click);
menu_1_3.Click += new EventHandler(menu_event_click);
menu_2.Click += new EventHandler(menu_event_click);
menu_2_1.Click += new EventHandler(menu_event_click);
menu_2_2.Click += new EventHandler(menu_event_click);
그리고 이렇게 생성한 Event method를 모든 메뉴 객체에 추가해줍니다.
만약 일부 메뉴에만 Event를 추가하고싶다면 위 부분에서 원하는 메뉴 객체에만 EventHandler를 추가해주면 됩니다.
'C# > C#' 카테고리의 다른 글
C# : MessageBox (0) | 2022.04.04 |
---|---|
C# : ShowDialog, Show (새로운 Window 띄우기) (0) | 2022.04.04 |
C# : TextBox (0) | 2022.04.04 |
C# : ListBox, ComboBox (0) | 2022.04.04 |
C# : RadioButton, GroupBox (0) | 2022.04.04 |