Adding a separator to a context menu
C#에서 ContextMenu 를 사용하기 위해서  ContextMenu 클래스를 이용하는 방법과 ContextMenuStrip을 처리하는 방법이 있다.
ContextMenu 를 사용하는 방법이 훨씬 간편하지만 좀더 복잡하더라도 ContextMenuStrip을 사용하도록 해야 겠다.  간단하게 사용할 수 있는 기능이므로 별 대수롭지 않게 생각하고 사용했다가 엉뚱한 곳에서 낭패를 보는 경우가  있다. MFC로 프로그램을 하면서 습관적으로 ContextMenu 를 사용하고 있는데  문득 메뉴에 separator를 넣는 과정에서 복병을 만났다. 황당하게도 C#에는 ContextMenu에 separator를 넣는 방법이 없는 것같다. 물론 내가 찾지 못해서 이문제를 처리하지 못하는 것 일 수도 있지만 , 구글링을 해도 정확한 답을 찾지 못했다.
괜한 시간낭비 말고 ContextMenuStrip을 사용하도록 해야 겠다.
먼저 ContextMenu를 사용하는 방법은 다음과 같다.

///
/// MouseDown Handler 마우스 우측 버튼시 MSChart에 컨텍스트메뉴 추가하기
///
private static void ChartControl_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Right) return;
MenuItem mnItm;
ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
ChartArea plots = chartGraph.ChartAreas[0];
contextMenu.MenuItems.Add(mnItm = new MenuItem("Zoom-X", OnChartContext));
mnItm.Checked = plots.CursorX.IsUserSelectionEnabled;
contextMenu.MenuItems.Add(mnItm = new MenuItem("Zoom-Y", OnChartContext));
mnItm.Checked = plots.CursorY.IsUserSelectionEnabled;
contextMenu.MenuItems.Add(mnItm = new MenuItem("--"));
contextMenu.MenuItems.Add(mnItm = new MenuItem("Reset Zoom-X", OnChartContext));
chartGraph.ContextMenu = contextMenu;
}
///
/// Context Menu Click Action on Chart : 컨텍스트 메뉴가 눌러 졌을때 Chart를 제어하는 부분
///
private void OnChartContext(object sender, EventArgs e)
{
ChartArea plots = chartGraph.ChartAreas[0];
MenuItem mmenuItm = (MenuItem)sender;//메뉴Item text
switch (mmenuItm.Text)
{
case "Zoom-X":
{
mmenuItm.Checked = !plots.CursorX.IsUserSelectionEnabled;
plots.CursorX.IsUserSelectionEnabled = mmenuItm.Checked;
plots.CursorX.Interval = trackCursor.Value/100.1;
}
break;
case "Zoom-Y":
{
mmenuItm.Checked = !plots.CursorY.IsUserSelectionEnabled;
plots.CursorY.IsUserSelectionEnabled = mmenuItm.Checked;
}
break;
}
}

위의 코드를 사용하다 separator를 하나 추가 시도하다가 문제에 부딪혔다. 이런 경우를 만나면 자괴감이 든다. 내가 이것 밖에 안되나 ? 왜 매번 비슷한 실수를 반복하는 지 별별 생각이 다 든다, 코딩습관탓도 있지만 얼른 해결방법을 떠올리지 못해서 시간낭비 한 것 생각하면 한심한 생각이 든다. 알고 있는 모든 것을 동원해서 기능을 구현 할 수도 있겠지만 시간 낭비다, 고민 하지 말고 아래의 방법을 사용하도록 하자!!.
 

private static void ChartControl_MouseDown(object sender, MouseEventArgs e)
{
            if (e.Button != MouseButtons.Right) return;
            Chart chartGraph = (Chart)sender;
            ToolStripMenuItem ptrMenuItem;
            ContextMenuStrip contextMenu = new System.Windows.Forms.ContextMenuStrip();
            ChartArea plots = chartGraph.ChartAreas[0];
            ptrMenuItem =(ToolStripMenuItem) contextMenu.Items.Add("Zoom-X");
            ptrMenuItem.Checked = plots.CursorX.IsUserSelectionEnabled;
            ptrMenuItem = (ToolStripMenuItem)contextMenu.Items.Add("Zoom-Y");
            ptrMenuItem.Checked = plots.CursorY.IsUserSelectionEnabled;
            contextMenu.Items.Add(new ToolStripSeparator());
            contextMenu.Items.Add("Reset Zoom-X");
            chartGraph.ContextMenuStrip = contextMenu;
            chartGraph.ContextMenuStrip.ItemClicked += OnChartContext;
}
 private static void OnChartContext(object sender, ToolStripItemClickedEventArgs e)
 {
            ContextMenuStrip ptrMenuStrip = (ContextMenuStrip)sender;
            Chart chartGraph = (Chart)ptrMenuStrip.SourceControl;
            if (chartGraph.ChartAreas.Count <= 0) return;
            ChartArea plots = chartGraph.ChartAreas[0];
            ToolStripMenuItem mmenuItm = (ToolStripMenuItem)e.ClickedItem;//메뉴Item text
            switch (e.ClickedItem.Text)
            {
                case "Zoom-X":
                    {
                        mmenuItm.Checked = !plots.CursorX.IsUserSelectionEnabled;
                        plots.CursorX.IsUserSelectionEnabled = mmenuItm.Checked;
                    }
                    break;
                case "Zoom-Y":
                    {
                        mmenuItm.Checked = !plots.CursorY.IsUserSelectionEnabled;
                        plots.CursorY.IsUserSelectionEnabled = mmenuItm.Checked;
                    }
                    break;
            }
}

28 Comments
댓글 남기기