Adding a separator to a context menu
C#에서 ContextMenu 를 사용하기 위해서 ContextMenu 클래스를 이용하는 방법과 ContextMenuStrip을 처리하는 방법이 있다.
ContextMenu 를 사용하는 방법이 훨씬 간편하지만 좀더 복잡하더라도 ContextMenuStrip을 사용하도록 해야 겠다. 간단하게 사용할 수 있는 기능이므로 별 대수롭지 않게 생각하고 사용했다가 엉뚱한 곳에서 낭패를 보는 경우가 있다. MFC로 프로그램을 하면서 습관적으로 ContextMenu 를 사용하고 있는데 문득 메뉴에 separator를 넣는 과정에서 복병을 만났다. 황당하게도 C#에는 ContextMenu에 separator를 넣는 방법이 없는 것같다. 물론 내가 찾지 못해서 이문제를 처리하지 못하는 것 일 수도 있지만 , 구글링을 해도 정확한 답을 찾지 못했다.
괜한 시간낭비 말고 ContextMenuStrip을 사용하도록 해야 겠다.
먼저 ContextMenu를 사용하는 방법은 다음과 같다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /// /// 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를 하나 추가 시도하다가 문제에 부딪혔다. 이런 경우를 만나면 자괴감이 든다. 내가 이것 밖에 안되나 ? 왜 매번 비슷한 실수를 반복하는 지 별별 생각이 다 든다, 코딩습관탓도 있지만 얼른 해결방법을 떠올리지 못해서 시간낭비 한 것 생각하면 한심한 생각이 든다. 알고 있는 모든 것을 동원해서 기능을 구현 할 수도 있겠지만 시간 낭비다, 고민 하지 말고 아래의 방법을 사용하도록 하자!!.
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 31 32 33 34 35 36 37 38 39 40 41 42 | 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 ; } } |
'개발언어 > C#' 카테고리의 다른 글
C# Formless System Tray Application (0) | 2017.10.30 |
---|---|
C# Form Auto Closing DialogBox 만들기 (0) | 2017.10.28 |
C# 확장 메서드 구현 및 호출,Implement and Call a Custom Extension Method (0) | 2017.10.10 |
C# Chart Data 입력방법 및 X-Label 자동입력 결과 (0) | 2017.10.01 |
Random 난수 발생에 대한 검토 (0) | 2017.10.01 |