[C#/WPF/NODENETWORK] NodeNetworkToolkit 누겟 설치하기
■ NodeNetworkToolkit 누겟을 설치하는 방법을 보여준다. 1. Visual Studio를 실행한다. 2. [도구] / [NuGet 패키지 관리자] / [패키지 관리자 콘솔] 메뉴를 실행한다.
■ NodeNetworkToolkit 누겟을 설치하는 방법을 보여준다. 1. Visual Studio를 실행한다. 2. [도구] / [NuGet 패키지 관리자] / [패키지 관리자 콘솔] 메뉴를 실행한다.
■ NetworkView 엘리먼트를 사용해 노드를 만드는 방법을 보여준다. ▶ MainApplication.xaml
1 2 3 4 5 6 7 |
<Application x:Class="TestProject.MainApplication" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> </Application> |
▶ MainApplication.xaml.cs
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 |
using System.Windows; using NodeNetwork; namespace TestProject { /// <summary> /// 메인 애플리케이션 /// </summary> public partial class MainApplication : Application { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 시작시 처리하기 - OnStartup(e) /// <summary> /// 시작시 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); NNViewRegistrar.RegisterSplat(); } #endregion } } |
▶ MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:nn="clr-namespace:NodeNetwork.Views;assembly=NodeNetwork" Width="800" Height="600" Title="TestProject" FontFamily="나눔고딕코딩" FontSize="16"> <nn:NetworkView Name="networkView" Margin="10" /> </Window> |
▶ MainWindow.xaml.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using System.Windows; using DynamicData; using NodeNetwork.ViewModels; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); NodeInputViewModel nodeInputViewModel1 = new NodeInputViewModel(); nodeInputViewModel1.Name = "Node 1 input"; NodeViewModel nodeViewModel1 = new NodeViewModel(); nodeViewModel1.Name = "Node 1"; nodeViewModel1.Position = new Point(200, 200); nodeViewModel1.Inputs.Add(nodeInputViewModel1); NodeOutputViewModel nodeOutputViewModel2 = new NodeOutputViewModel(); nodeOutputViewModel2.Name = "Node 2 output"; NodeViewModel nodeViewModel2 = new NodeViewModel(); nodeViewModel2.Name = "Node 2"; nodeViewModel2.Position = new Point(400, 200); nodeViewModel2.Outputs.Add(nodeOutputViewModel2); NetworkViewModel networkViewModel = new NetworkViewModel(); networkViewModel.Nodes.Add(nodeViewModel1); networkViewModel.Nodes.Add(nodeViewModel2); this.networkView.ViewModel = networkViewModel; } #endregion } } |
TestProject.zip
■ NodeNetwork 누겟을 설치하는 방법을 보여준다. 1. Visual Studio를 실행한다. 2. [도구] / [NuGet 패키지 관리자] / [패키지 관리자 콘솔] 메뉴를 실행한다.
■ UIElement 엘리먼트의 Effect 속성을 사용해 히트맵을 그리는 방법을 보여준다. ▶ AttachedTitle.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
using System.Windows; namespace TestProject { /// <summary> /// 첨부 제목 /// </summary> public static class AttachedTitle { //////////////////////////////////////////////////////////////////////////////////////////////////// Dependency Property ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 제목 첨부 속성 - TitleProperty /// <summary> /// 제목 첨부 속성 /// </summary> public static readonly DependencyProperty TitleProperty = DependencyProperty.RegisterAttached ( "Title", typeof(string), typeof(AttachedTitle), new PropertyMetadata(string.Empty) ); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 제목 설정하기 - SetTitle(d, value) /// <summary> /// 제목 설정하기 /// </summary> /// <param name="d">의존 객체</param> /// <param name="value">값</param> public static void SetTitle(DependencyObject d, string value) { d.SetValue(TitleProperty, value); } #endregion #region 제목 구하기 - GetTitle(d) /// <summary> /// 제목 구하기 /// </summary> /// <param name="d">의존 객체</param> /// <returns>제목</returns> public static string GetTitle(DependencyObject d) { return (string)d.GetValue(TitleProperty); } #endregion } } |
▶ HeatPoint.cs
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 46 47 48 49 50 51 52 |
namespace TestProject { /// <summary> /// 히트 포인트 /// </summary> public struct HeatPoint { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// X /// </summary> public int X; /// <summary> /// Y /// </summary> public int Y; /// <summary> /// 강도 /// </summary> public byte Intensity; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - HeatPoint(x, y, intensity) /// <summary> /// 생성자 /// </summary> /// <param name="x">X</param> /// <param name="y">Y</param> /// <param name="intensity">강도</param> public HeatPoint(int x, int y, byte intensity) { X = x; Y = y; Intensity = intensity; } #endregion } } |
▶ HeatMap.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
using System; using System.Collections.Generic; using System.Windows; using System.Windows.Media; namespace TestProject { /// <summary> /// 히트맵 /// </summary> public class HeatMap : FrameworkElement { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 색상 그라디언트 수 /// </summary> private const int ColorGradientNumber = 256; /// <summary> /// 히트맵 비주얼 컬렉션 /// </summary> private VisualCollection heatMapVisualCollection; /// <summary> /// 히트 포인트 리스트 /// </summary> private List<HeatPoint> heatPointList = new List<HeatPoint>(); /// <summary> /// 라디얼 그라디언트 브러시 배열 /// </summary> private readonly RadialGradientBrush[] radialGradientBrushArray; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 비주얼 자식 수 - VisualChildrenCount /// <summary> /// 비주얼 자식 수 /// </summary> protected override int VisualChildrenCount { get { return this.heatMapVisualCollection.Count; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - HeatMap() /// <summary> /// 생성자 /// </summary> public HeatMap() { this.heatMapVisualCollection = new VisualCollection(this); this.radialGradientBrushArray = new RadialGradientBrush[ColorGradientNumber]; for(int i = 0; i < this.radialGradientBrushArray.Length; i++) { this.radialGradientBrushArray[i] = new RadialGradientBrush ( Color.FromArgb((byte)i, 255, 255, 255), Color.FromArgb(0, 255, 255, 255) ); } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 히트 포인트 추가하기 - AddHeatPoint(heatPoint) /// <summary> /// 히트 포인트 추가하기 /// </summary> /// <param name="heatPoint">히트 포인트</param> public void AddHeatPoint(HeatPoint heatPoint) { this.heatPointList.Add(heatPoint); } #endregion #region 지우기 - Clear() /// <summary> /// 지우기 /// </summary> public void Clear() { this.heatPointList.Clear(); } #endregion #region 렌더링하기 - Render() /// <summary> /// 렌더링하기 /// </summary> public void Render() { double size; this.heatMapVisualCollection.Clear(); DrawingVisual drawingVisual = new DrawingVisual(); using(DrawingContext drawingContext = drawingVisual.RenderOpen()) { foreach(HeatPoint point in this.heatPointList) { size = point.Intensity / 5; drawingContext.DrawRectangle ( this.radialGradientBrushArray[point.Intensity], null, new Rect(point.X - size / 2, point.Y - size / 2, size, size) ); } this.heatMapVisualCollection.Add(drawingVisual); } } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 비주얼 자식 구하기 - GetVisualChild(index) /// <summary> /// 비주얼 자식 구하기 /// </summary> /// <param name="index">인덱스</param> /// <returns>비주얼 자식</returns> protected override Visual GetVisualChild(int index) { if(index < 0 || index >= this.heatMapVisualCollection.Count) { throw new ArgumentOutOfRangeException("index"); } return this.heatMapVisualCollection[index]; } #endregion } } |
▶ MainWindow.xaml
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" xmlns:local="clr-namespace:TestProject" xmlns:effects="clr-namespace:TestProject.Effects" Title="TestProject" Width="800" Height="600" FontFamily="나눔고딕코딩" FontSize="16"> <Window.Resources> <x:Array x:Key="LinearGradientBrushArrayKey" Type="LinearGradientBrush"> <!-- Black Body Radiation --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Black Body Radiation"> <GradientStop Offset="0.00000" Color="#000000" /> <GradientStop Offset="0.11111" Color="#f82600" /> <GradientStop Offset="0.22222" Color="#fc7700" /> <GradientStop Offset="0.33333" Color="#ffab1f" /> <GradientStop Offset="0.44444" Color="#ffc360" /> <GradientStop Offset="0.55555" Color="#ffdda4" /> <GradientStop Offset="0.66666" Color="#fff4e4" /> <GradientStop Offset="0.77777" Color="#e8edff" /> <GradientStop Offset="0.88888" Color="#dbe3ff" /> <GradientStop Offset="0.99999" Color="#cbd7ff" /> </LinearGradientBrush> <!-- Aqua --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Aqua"> <GradientStop Offset="0" Color="Black" /> <GradientStop Offset="0.5" Color="Aqua" /> <GradientStop Offset="1" Color="White" /> </LinearGradientBrush> <!-- Blue & Red --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Blue and Red"> <GradientStop Offset="0" Color="Blue" /> <GradientStop Offset="1" Color="Red" /> </LinearGradientBrush> <!-- Deep sea --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Deep sea"> <GradientStop Offset="0" Color="#000000" /> <GradientStop Offset="0.6" Color="#183567" /> <GradientStop Offset="0.75" Color="#2e649e" /> <GradientStop Offset="0.9" Color="#17adcb" /> <GradientStop Offset="1.0" Color="#00fafa" /> </LinearGradientBrush> <!-- Color Spectrum --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Color Spectrum"> <GradientStop Offset="0" Color="Navy" /> <GradientStop Offset="0.25" Color="Blue" /> <GradientStop Offset="0.5" Color="Green" /> <GradientStop Offset="0.75" Color="Yellow" /> <GradientStop Offset="1.0" Color="Red" /> </LinearGradientBrush> <!-- Incadescent --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Incadescent"> <GradientStop Offset="0" Color="Black" /> <GradientStop Offset="0.33" Color="DarkRed" /> <GradientStop Offset="0.66" Color="Yellow" /> <GradientStop Offset="1.0" Color="White" /> </LinearGradientBrush> <!-- Heated Metal --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Heated Metal"> <GradientStop Offset="0" Color="Black" /> <GradientStop Offset="0.4" Color="Purple" /> <GradientStop Offset="0.6" Color="Red" /> <GradientStop Offset="0.8" Color="Yellow" /> <GradientStop Offset="1.0" Color="White" /> </LinearGradientBrush> <!-- Sunrise --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Sunrise"> <GradientStop Offset="0" Color="Red" /> <GradientStop Offset="0.66" Color="Yellow" /> <GradientStop Offset="1.0" Color="White" /> </LinearGradientBrush> <!-- Stepped Colors --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Stepped Colors"> <GradientStop Color="Navy" Offset="0" /> <GradientStop Color="Navy" Offset="0.25" /> <GradientStop Color="Green" Offset="0.26" /> <GradientStop Color="Green" Offset="0.5" /> <GradientStop Color="Yellow" Offset="0.51" /> <GradientStop Color="Yellow" Offset="0.75" /> <GradientStop Color="Red" Offset="0.76" /> <GradientStop Color="Red" Offset="1.0" /> </LinearGradientBrush> <!-- Visible Spectrum --> <LinearGradientBrush PresentationOptions:Freeze="True" StartPoint="0 0" EndPoint="1 0" local:AttachedTitle.Title="Visible Spectrum"> <GradientStop Color="#ff00ff" Offset="0" /> <GradientStop Color="#0000ff" Offset="0.25" /> <GradientStop Color="#00ff00" Offset="0.5" /> <GradientStop Color="#ffff00" Offset="0.75" /> <GradientStop Color="#ff0000" Offset="1.0" /> </LinearGradientBrush> </x:Array> <VisualBrush x:Key="PaletteVisualBrushKey"> <VisualBrush.Visual> <Rectangle Width="256" Height="1" Fill="{Binding SelectedItem, ElementName=colorComboBox}" /> </VisualBrush.Visual> </VisualBrush> </Window.Resources> <Grid Name="rootGrid" Margin="10"> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal"> <TextBlock VerticalAlignment="Center" Text="Color schema" /> <ComboBox Name="colorComboBox" Margin="10 0 0 0" Width="320" Height="25" ItemsSource="{StaticResource LinearGradientBrushArrayKey}"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Rectangle Width="120" Height="10" Fill="{Binding}" /> <TextBlock Margin="10 0 0 0" Text="{Binding (local:AttachedTitle.Title)}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </StackPanel> <local:HeatMap x:Name="heatMap" Grid.Row="1" Margin="0 10 0 0" ClipToBounds="True"> <local:HeatMap.Effect> <effects:HeatColorizer Palette="{StaticResource PaletteVisualBrushKey}" /> </local:HeatMap.Effect> </local:HeatMap> </Grid> </Window> |
■ 엑셀없이 엑셀 파일을 로드하는 방법을 보여준다. ▶ MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="800" Height="600" Title="TestProject" FontFamily="나눔고딕코딩" FontSize="16"> <Grid Margin="10"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Button Name="loadButton" Grid.Row="0" Width="100" Height="30" Content="엑셀 로드" /> <DataGrid Name="dataGrid" Grid.Row="1" Margin="0 10 0 0"/> </Grid> </Window> |
▶ MainWindow.xaml.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using System.Data; using System.IO; using System.Windows; using Microsoft.Win32; using ExcelDataReader; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); this.loadButton.Click += loadButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 엑셀 로드 버튼 클릭시 처리하기 - loadButton_Click(sender, e) /// <summary> /// 엑셀 로드 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void loadButton_Click(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "EXCEL File |*.xls|EXCEL File |*.xlsx"; openFileDialog.FilterIndex = 2; openFileDialog.CheckFileExists = true; openFileDialog.CheckPathExists = true; if(openFileDialog.ShowDialog().GetValueOrDefault()) { using(FileStream stream = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) { using(IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream)) { DataSet dataSet = reader.AsDataSet ( new ExcelDataSetConfiguration() { ConfigureDataTable = (excelDataReader) => new ExcelDataTableConfiguration() { UseHeaderRow = true, } } ); this.dataGrid.ItemsSource = dataSet.Tables[0].DefaultView; } } } } #endregion } } |
TestProject.zip
■ ExcelDataReader.DataSet 누겟을 설치하는 방법을 보여준다. 1. Visual Studio를 실행한다. 2. [도구] / [NuGet 패키지 관리자] / [패키지 관리자 콘솔] 메뉴를 실행한다.
■ ExcelDataReader 누겟을 설치하는 방법을 보여준다. 1. Visual Studio를 실행한다. 2. [도구] / [NuGet 패키지 관리자] / [패키지 관리자 콘솔] 메뉴를 실행한다.
■ 데스크톱에서 눈송이(snowflake)를 내리는 방법을 보여준다. ▶ Snowflake.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
using System; using System.Drawing; using System.Windows.Forms; namespace TestProject { /// <summary> /// 눈송이 /// </summary> public class Snowflake : PictureBox { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 난수기 /// </summary> private Random random = new Random(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - Snowflake() /// <summary> /// 생성자 /// </summary> public Snowflake() { Create(); Move(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 타이머 틱 처리하기 - timer_Tick(sender, e) /// <summary> /// 타이머 틱 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void timer_Tick(object sender, EventArgs e) { Location += new Size(1, 3); if(Location.X > Screen.PrimaryScreen.Bounds.Width || Location.Y > Screen.PrimaryScreen.Bounds.Height) { Location = new Point ( this.random.Next(-Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Width ), this.random.Next(-Screen.PrimaryScreen.Bounds.Height, Screen.PrimaryScreen.Bounds.Height) ); } } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 생성하기 - Create() /// <summary> /// 생성하기 /// </summary> private void Create() { Location = new Point ( this.random.Next(-Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Width ), this.random.Next(-Screen.PrimaryScreen.Bounds.Height, Screen.PrimaryScreen.Bounds.Height) ); MinimumSize = new Size(7, 7); Size = new Size(10, 10); BackgroundImage = Image.FromFile("snowflake.jpg"); } #endregion #region 이동하기 - Move() /// <summary> /// 이동하기 /// </summary> private new void Move() { Timer timer = new Timer(); timer.Interval = 40; timer.Tick += timer_Tick; timer.Start(); } #endregion } } |
▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
using System; using System.Drawing; using System.Windows.Forms; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 눈송이 카운트 /// </summary> private readonly int snowflakeCount = 40; /// <summary> /// 눈송이 배열 /// </summary> private Snowflake[] snowflakeArray; /// <summary> /// 인덱스 /// </summary> private int index = 0; /// <summary> /// 타이머 /// </summary> private Timer timer; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); Load += Form_Load; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 폼 로드시 처리하기 - Form_Load(sender, e) /// <summary> /// 폼 로드시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void Form_Load(object sender, EventArgs e) { Location = new Point(0, 0); Size = Screen.PrimaryScreen.Bounds.Size + (new Size(20, 20)); TopMost = true; FormBorderStyle = FormBorderStyle.None; BackColor = Color.Black; TransparencyKey = Color.Black; this.snowflakeArray = new Snowflake[this.snowflakeCount]; this.timer = new Timer(); this.timer.Interval = 1000; this.timer.Tick += timer_Tick; this.timer.Start(); } #endregion #region 타이머 틱 처리하기 - timer_Tick(sender, e) /// <summary> /// 타이머 틱 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void timer_Tick(object sender, EventArgs e) { if(this.index >= this.snowflakeCount) { this.timer.Stop(); return; } this.snowflakeArray[index] = new Snowflake(); Controls.Add(this.snowflakeArray[this.index]); this.index++; } #endregion } } |
TestProject.zip
■ IsolatedStorageFile 클래스를 사용해 격리된 저장소에서 로그 파일에 로그를 추가하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 |
using System.IO; using System.IO.IsolatedStorage; #region 로그 쓰기 - WrieLog(fileName, message) /// <summary> /// 로그 쓰기 /// </summary> /// <param name="fileName">파일명</param> /// <param name="message">메시지</param> public void WrieLog(string fileName, string message) { IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForAssembly(); using(IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Append, FileAccess.Write, file)) { using(StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine(message); } } } #endregion |
※ 격리된 저장소 파일 다음
■ 가상 키보드를 사용하는 방법을 보여준다. ▶ HookType.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
namespace TestProject { /// <summary> /// 후킹 타입 /// </summary> public enum HookType : int { /// <summary> /// WH_JOURNALRECORD /// </summary> WH_JOURNALRECORD = 0, /// <summary> /// WH_JOURNALPLAYBACK /// </summary> WH_JOURNALPLAYBACK = 1, /// <summary> /// WH_KEYBOARD /// </summary> WH_KEYBOARD = 2, /// <summary> /// WH_GETMESSAGE /// </summary> WH_GETMESSAGE = 3, /// <summary> /// WH_CALLWNDPROC /// </summary> WH_CALLWNDPROC = 4, /// <summary> /// WH_CBT /// </summary> WH_CBT = 5, /// <summary> /// WH_SYSMSGFILTER /// </summary> WH_SYSMSGFILTER = 6, /// <summary> /// WH_MOUSE /// </summary> WH_MOUSE = 7, /// <summary> /// WH_HARDWARE /// </summary> WH_HARDWARE = 8, /// <summary> /// WH_DEBUG /// </summary> WH_DEBUG = 9, /// <summary> /// WH_SHELL /// </summary> WH_SHELL = 10, /// <summary> /// WH_FOREGROUNDIDLE /// </summary> WH_FOREGROUNDIDLE = 11, /// <summary> /// WH_CALLWNDPROCRET /// </summary> WH_CALLWNDPROCRET = 12, /// <summary> /// WH_KEYBOARD_LL /// </summary> WH_KEYBOARD_LL = 13, /// <summary> /// WH_MOUSE_LL /// </summary> WH_MOUSE_LL = 14 } } |
▶ KeyboardHookStructureFlag.cs
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 |
namespace TestProject { /// <summary> /// 키보드 후킹 구조체 플래그 /// </summary> public enum KeyboardHookStructureFlag { /// <summary> /// LLKHF_EXTENDED /// </summary> LLKHF_EXTENDED = 0x01, /// <summary> /// LLKHF_INJECTED /// </summary> LLKHF_INJECTED = 0x10, /// <summary> /// LLKHF_ALTDOWN /// </summary> LLKHF_ALTDOWN = 0x20, /// <summary> /// LLKHF_UP /// </summary> LLKHF_UP = 0x80 } } |
▶ MouseMessage.cs
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 |
namespace TestProject { /// <summary> /// 마우스 메시지 /// </summary> public enum MouseMessage { /// <summary> /// WM_LBUTTONDOWN /// </summary> WM_LBUTTONDOWN = 0x0201, /// <summary> /// WM_LBUTTONUP /// </summary> WM_LBUTTONUP = 0x0202, /// <summary> /// WM_MOUSEMOVE /// </summary> WM_MOUSEMOVE = 0x0200, /// <summary> /// WM_MOUSEWHEEL /// </summary> WM_MOUSEWHEEL = 0x020A, /// <summary> /// WM_RBUTTONDOWN /// </summary> WM_RBUTTONDOWN = 0x0204, /// <summary> /// WM_RBUTTONUP /// </summary> WM_RBUTTONUP = 0x0205, /// <summary> /// WM_NCLBUTTONDOWN /// </summary> WM_NCLBUTTONDOWN = 0x00A } } |
▶ POINT.cs
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 |
using System.Runtime.InteropServices; namespace TestProject { /// <summary> /// 포인트 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct POINT { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// X /// </summary> public int X; /// <summary> /// Y /// </summary> public int Y; #endregion } } |
▶ KEYBOARDHOOKSTRUCT.cs
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 46 |
using System; using System.Runtime.InteropServices; namespace TestProject { /// <summary> /// 키보드 후킹 구조체 /// </summary> [StructLayout(LayoutKind.Sequential)] public class KEYBOARDHOOKSTRUCT { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 가상 키 코드 /// </summary> public uint VirtualKeyCode; /// <summary> /// 스캔 코드 /// </summary> public uint ScanCode; /// <summary> /// 키보드 후킹 구조체 플래그 /// </summary> public KeyboardHookStructureFlag Flag; /// <summary> /// 시간 /// </summary> public uint Time; /// <summary> /// 부가 정보 핸들 /// </summary> public UIntPtr ExtraInformationHandle; #endregion } } |
▶
■ ConfigurationManager 클래스의 OpenExeConfiguration 정적 메소드를 사용해 App.config 파일을 로드하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System; using System.Configuration; using System.IO; using System.Reflection; string executinDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string applicationConfigurationFilePath = Path.Combine(executinDirectoryPath, "App.config"); AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", applicationConfigurationFilePath); Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); Console.WriteLine(configuration.FilePath); |
■ ConfigurationManager 클래스의 OpenMappedExeConfiguration 정적 메소드를 사용해 App.config 파일을 로드하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; using System.Configuration; using System.IO; using System.Reflection; string executinDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration ( new ExeConfigurationFileMap() { ExeConfigFilename = Path.Combine(executinDirectoryPath, "App.config") }, ConfigurationUserLevel.None ); Console.WriteLine(configuration.FilePath); |
■ SystemColors 클래스의 정적 속성을 사용하는 방법을 보여준다. ▶ 표
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
───────────────────────────────────────────────────────────────── 정적 속성 설명 ──────────────── ──────────────────────────────────────────────── ActiveBorderBrush 활성 창의 테두리 색인 SolidColorBrush를 가져옵니다. ActiveBorderBrushKey 활성 창의 테두리를 칠하는 데 사용되는 SolidColorBrush의 ResourceKey를 가져옵니다. ActiveBorderColor 활성 창 테두리의 색인 Color 구조체를 가져옵니다. ActiveBorderColorKey 활성 창 테두리의 Color에 대한 ResourceKey를 가져옵니다. ActiveCaptionBrush 활성 창 제목 표시줄의 배경색인 SolidColorBrush를 가져옵니다. ActiveCaptionBrushKey 활성 창 제목 표시줄의 배경을 칠하는 데 사용되는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ActiveCaptionColor 활성 창 제목 표시줄의 배경색인 Color 구조체를 가져옵니다. ActiveCaptionColorKey 활성 창 제목 표시줄의 배경 Color에 대한 ResourceKey를 가져옵니다. ActiveCaptionTextBrush 활성 창 제목 표시줄의 텍스트 색인 SolidColorBrush를 가져옵니다. ActiveCaptionTextBrushKey 활성 창 제목 표시줄의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ActiveCaptionTextColor 활성 창 제목 표시줄의 텍스트 색인 Color 구조체를 가져옵니다. ActiveCaptionTextColorKey 활성 창 제목 표시줄에 있는 텍스트의 Color에 대한 ResourceKey를 가져옵니다. AppWorkspaceBrush 응용 프로그램 작업 영역의 색인 SolidColorBrush를 가져옵니다. AppWorkspaceBrushKey 응용 프로그램 작업 영역을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. AppWorkspaceColor 응용 프로그램 작업 영역의 색인 Color 구조체를 가져옵니다. AppWorkspaceColorKey 응용 프로그램 작업 영역의 Color에 대한 ResourceKey를 가져옵니다. ControlBrush 3차원 표시 요소의 표면 색인 SolidColorBrush를 가져옵니다. ControlBrushKey 3차원 표시 요소의 표면을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ControlColor 3차원 표시 요소의 표면 색인 Color 구조체를 가져옵니다. ControlColorKey 3차원 표시 요소의 표면 Color에 대한 ResourceKey를 가져옵니다. ControlDarkBrush 3차원 표시 요소의 그림자 색인 SolidColorBrush를 가져옵니다. ControlDarkBrushKey 3차원 표시 요소의 그림자를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ControlDarkColor 3차원 표시 요소의 그림자 색인 Color 구조체를 가져옵니다. ControlDarkColorKey 3차원 표시 요소의 그림자 Color에 대한 ResourceKey를 가져옵니다. ControlDarkDarkBrush 3차원 표시 요소의 짙은 그림자 색인 SolidColorBrush를 가져옵니다. ControlDarkDarkBrushKey 3차원 표시 요소의 짙은 그림자를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ControlDarkDarkColor 3차원 표시 요소의 짙은 그림자 색인 Color 구조체를 가져옵니다. ControlDarkDarkColorKey 3차원 표시 요소의 강조 색의 짙은 그림자 Color에 대한 ResourceKey를 가져옵니다. ControlLightBrush 3차원 표시 요소의 옅은 색인 SolidColorBrush를 가져옵니다. ControlLightBrushKey 3차원 표시 요소의 옅은 색 영역을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ControlLightColor 3차원 표시 요소의 옅은 색인 Color 구조체를 가져옵니다. ControlLightColorKey 3차원 표시 요소의 강조 Color에 대한 ResourceKey를 가져옵니다. ControlLightLightBrush 3차원 표시 요소의 강조 색인 SolidColorBrush를 가져옵니다. ControlLightLightBrushKey 3차원 표시 요소의 강조 영역을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ControlLightLightColor 3차원 표시 요소의 강조 색인 Color 구조체를 가져옵니다. ControlLightLightColorKey 3차원 표시 요소의 강조 Color에 대한 ResourceKey를 가져옵니다. ControlTextBrush 3차원 표시 요소의 텍스트 색인 SolidColorBrush를 가져옵니다. ControlTextBrushKey 3차원 표시 요소의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ControlTextColor 3차원 표시 요소의 텍스트 색인 Color 구조체를 가져옵니다. ControlTextColorKey 3차원 표시 요소의 텍스트 Color에 대한 ResourceKey를 가져옵니다. DesktopBrush 바탕 화면의 색인 SolidColorBrush를 가져옵니다. DesktopBrushKey 바탕 화면을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. DesktopColor 바탕 화면의 색인 Color 구조체를 가져옵니다. DesktopColorKey 바탕 화면의 Color에 대한 ResourceKey를 가져옵니다. GradientActiveCaptionBrush 활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 SolidColorBrush를 가져옵니다. GradientActiveCaptionBrushKey 활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 SolidColorBrush에 대한 ResourceKey를 가져옵니다. GradientActiveCaptionColor 활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 Color 구조체를 가져옵니다. GradientActiveCaptionColorKey 활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 Color에 대한 ResourceKey를 가져옵니다. GradientInactiveCaptionBrush 비활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 SolidColorBrush를 가져옵니다. GradientInactiveCaptionBrushKey 비활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 SolidColorBrush에 대한 ResourceKey를 가져옵니다. GradientInactiveCaptionColor 비활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 Color 구조체를 가져옵니다. GradientInactiveCaptionColorKey 비활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 Color에 대한 ResourceKey를 가져옵니다. GrayTextBrush 비활성 텍스트 색인 SolidColorBrush를 가져옵니다. GrayTextBrushKey 비활성 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. GrayTextColor 비활성 텍스트 색인 Color 구조체를 가져옵니다. GrayTextColorKey 비활성 텍스트의 Color에 대한 ResourceKey를 가져옵니다. HighlightBrush 선택된 항목의 배경을 칠하는 SolidColorBrush를 가져옵니다. HighlightBrushKey 선택된 항목의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. HighlightColor 선택된 항목의 배경색인 Color 구조체를 가져옵니다. HighlightColorKey 선택된 항목의 배경 Color에 대한 ResourceKey를 가져옵니다. HighlightTextBrush 선택된 항목의 텍스트 색인 SolidColorBrush를 가져옵니다. HighlightTextBrushKey 선택된 항목의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. HighlightTextColor 선택한 항목의 텍스트 색인 Color 구조체를 가져옵니다. HighlightTextColorKey 선택된 항목의 텍스트 Color에 대한 ResourceKey를 가져옵니다. HotTrackBrush 핫 트랙 항목을 지정하는 데 사용되는 색인 SolidColorBrush를 가져옵니다. HotTrackBrushKey 핫 트랙 항목을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. HotTrackColor 핫 트랙 항목을 지정하는 데 사용되는 색인 Color 구조체를 가져옵니다. HotTrackColorKey 핫 트랙 항목을 나타내는 Color에 대한 ResourceKey를 가져옵니다. InactiveBorderBrush 비활성 창의 테두리 색인 SolidColorBrush를 가져옵니다. InactiveBorderBrushKey 비활성 창의 테두리를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. InactiveBorderColor 비활성 창 테두리의 색인 Color 구조체를 가져옵니다. InactiveBorderColorKey 비활성 창 테두리의 Color에 대한 ResourceKey를 가져옵니다. InactiveCaptionBrush 비활성 창 제목 표시줄의 배경색인 SolidColorBrush를 가져옵니다. InactiveCaptionBrushKey 비활성 창 제목 표시줄의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. InactiveCaptionColor 비활성 창 제목 표시줄의 배경색인 Color 구조체를 가져옵니다. InactiveCaptionColorKey 비활성 창 제목 표시줄의 배경 Color에 대한 ResourceKey를 가져옵니다. InactiveCaptionTextBrush 비활성 창 제목 표시줄의 텍스트 색인 SolidColorBrush를 가져옵니다. InactiveCaptionTextBrushKey 비활성 창 제목 표시줄의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. InactiveCaptionTextColor 비활성 창 제목 표시줄의 텍스트 색인 Color 구조체를 가져옵니다. InactiveCaptionTextColorKey 비활성 창 제목 표시줄의 텍스트 Color에 대한 ResourceKey를 가져옵니다. InfoBrush ToolTip 컨트롤의 배경색인 SolidColorBrush를 가져옵니다. InfoBrushKey ToolTip 컨트롤의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. InfoColor ToolTip 컨트롤의 배경색인 Color 구조체를 가져옵니다. InfoColorKey ToolTip 컨트롤의 배경 Color에 대한 ResourceKey를 가져옵니다. InfoTextBrush ToolTip 컨트롤의 텍스트 색인 SolidColorBrush를 가져옵니다. InfoTextBrushKey ToolTip 컨트롤의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. InfoTextColor ToolTip 컨트롤의 텍스트 색인 Color 구조체를 가져옵니다. InfoTextColorKey ToolTip 컨트롤의 텍스트 Color에 대한 ResourceKey를 가져옵니다. MenuBarBrush 메뉴 모음의 배경색인 SolidColorBrush를 가져옵니다. MenuBarBrushKey 메뉴 모음의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. MenuBarColor 메뉴 모음의 배경색인 Color 구조체를 가져옵니다. MenuBarColorKey 메뉴 모음의 배경 Color에 대한 ResourceKey를 가져옵니다. MenuBrush 메뉴의 배경색인 SolidColorBrush를 가져옵니다. MenuBrushKey 메뉴의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. MenuColor 메뉴의 배경색인 Color 구조체를 가져옵니다. MenuColorKey 메뉴의 배경 Color에 대한 ResourceKey를 가져옵니다. MenuHighlightBrush 메뉴 항목을 강조 표시하는 데 사용되는 색인 SolidColorBrush를 가져옵니다. MenuHighlightBrushKey 강조 표시된 메뉴 항목을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. MenuHighlightColor 메뉴 항목을 강조 표시하는 데 사용되는 색인 Color 구조체를 가져옵니다. MenuHighlightColorKey 강조 표시된 메뉴 항목의 배경 Color에 대한 ResourceKey를 가져옵니다. MenuTextBrush 메뉴의 텍스트 색인 SolidColorBrush를 가져옵니다. MenuTextBrushKey 메뉴의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. MenuTextColor 메뉴의 텍스트 색인 Color 구조체를 가져옵니다. MenuTextColorKey 메뉴의 텍스트 Color에 대한 ResourceKey를 가져옵니다. ScrollBarBrush 스크롤 막대의 배경색인 SolidColorBrush를 가져옵니다. ScrollBarBrushKey 스크롤 막대의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. ScrollBarColor 스크롤 막대의 배경색인 Color 구조체를 가져옵니다. ScrollBarColorKey 스크롤 막대의 배경 Color에 대한 ResourceKey를 가져옵니다. WindowBrush 창 클라이언트 영역의 배경색인 SolidColorBrush를 가져옵니다. WindowBrushKey 창 클라이언트 영역의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. WindowColor 창 클라이언트 영역의 배경색인 Color 구조체를 가져옵니다. WindowColorKey 창 클라이언트 영역의 배경 Color에 대한 ResourceKey를 가져옵니다. WindowFrameBrush 창 프레임의 색인 SolidColorBrush를 가져옵니다. WindowFrameBrushKey 창 프레임을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. WindowFrameColor 창 프레임의 색인 Color 구조체를 가져옵니다. WindowFrameColorKey 창 프레임의 Color에 대한 ResourceKey를 가져옵니다. WindowTextBrush 창 클라이언트 영역의 텍스트 색인 SolidColorBrush를 가져옵니다. WindowTextBrushKey 창 클라이언트 영역의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. WindowTextColor 창의 클라이언트 영역의 텍스트 색인 Color 구조체를 가져옵니다. WindowTextColorKey 창 클라이언트 영역의 텍스트 Color에 대한 ResourceKey를 가져옵니다.양식의 맨 아래 ───────────────────────────────────────────────────────────────── |
■ RichEditControl 클래스에서 테이블 셀의 내용을 복사해서 붙여넣는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
using System; using System.Collections.Generic; using System.Drawing; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 줄 문자열 /// </summary> private const string LINE_STRING = "----------------------------------------------------------------------------------------------------"; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.LoadDocument("sample.rtf"); this.parseButton.Click += parseButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 분석 버튼 클릭시 처리하기 - parseButton_Click(sender, e) /// <summary> /// 분석 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void parseButton_Click(object sender, EventArgs e) { Document document = this.richEditControl.Document; while(document.Tables.Count > 0) { PasteTableContent(document, document.Tables.Count - 1); document.Tables.RemoveTableAt(document.Tables.Count - 1); } } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 라인 분리자 문단 리스트 구하기 - GetLineSeparatorParagraphList(document) /// <summary> /// 라인 분리자 문단 리스트 구하기 /// </summary> /// <param name="document">문서</param> /// <returns>라인 분리자 문단 리스트</returns> private List<Paragraph> GetLineSeparatorParagraphList(Document document) { List<Paragraph> list = new List<Paragraph>(); for(int i = 0; i < document.Paragraphs.Count - 1; i++) { Paragraph paragraph1 = document.Paragraphs[i ]; Paragraph paragraph2 = document.Paragraphs[i + 1]; string text1 = document.GetText(paragraph1.Range); string text2 = document.GetText(paragraph2.Range); if(text1 == LINE_STRING && text2 == LINE_STRING) { list.Add(paragraph1); } } return list; } #endregion #region 테이블 내용 붙여넣기 - PasteTableContent(document, index) /// <summary> /// 테이블 내용 붙여넣기 /// </summary> /// <param name="document">문서</param> /// <param name="index">인덱스</param> private void PasteTableContent(Document document, int index) { List<Paragraph> list = GetLineSeparatorParagraphList(document); Table table = document.Tables[index]; DocumentRange contentRange = table.Cell(0, 0).ContentRange; DocumentRange range = document.CreateRange(contentRange.Start.ToInt() + 1, contentRange.End.ToInt() - contentRange.Start.ToInt() + 1 - 2); document.Copy(range); document.CaretPosition = document.CreatePosition(list[index].Range.End.ToInt()); document.Paste(); } #endregion } } |
TestProject.zip
■ TableCollection 인터페이스 : Create 메소드를 사용해 테이블 생성하기 ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 줄 문자열 /// </summary> private const string LINE_STRING = "------------------------------------------------------------------------------------------------------------------------"; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.LoadDocument("sample.rtf"); this.parseButton.Click += parseButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 분석 버튼 클릭시 처리하기 - parseButton_Click(sender, e) /// <summary> /// 분석 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void parseButton_Click(object sender, EventArgs e) { Document document = this.richEditControl.Document; StringBuilder stringBuilder = new StringBuilder(); Dictionary<Table, string> tableDictionary = new Dictionary<Table, string>(); foreach(Paragraph paragraph in document.Paragraphs) { ReadOnlyDocumentImageCollection imageCollection = document.Images.Get(paragraph.Range); if(imageCollection == null || imageCollection.Count == 0) { Table table = GetTable(paragraph.Range); if(table != null) { if(tableDictionary.ContainsKey(table)) { continue; } else { tableDictionary.Add(table, null); stringBuilder.AppendLine($"테이블 : {table.Rows.Count}×{table.Rows[0].Cells.Count}"); ParagraphCollection tableParagraphCollection = document.GetParagraphs(table.Range); foreach(Paragraph tableParagraph in tableParagraphCollection) { stringBuilder.AppendLine($" 문단 : {document.GetText(tableParagraph.Range)}"); } } } else { stringBuilder.AppendLine($"문단 : {document.GetText(paragraph.Range)}"); } } else { DocumentImage documentImage = imageCollection[0]; stringBuilder.AppendLine($"이미지 : {documentImage.Size}"); } } this.memoEdit.Text = stringBuilder.ToString(); document.BeginUpdate(); foreach(KeyValuePair<Table, string> keyValuePair in tableDictionary) { Table table = keyValuePair.Key; ParagraphCollection tableParagraphCollection = document.GetParagraphs(table.Range); Table newTable = document.Tables.Create(document.Range.End, 1, 1); for(int i = tableParagraphCollection.Count - 1; i > -1; i--) { Paragraph tableParagraph = tableParagraphCollection[i]; document.InsertText(newTable.Cell(0, 0).Range.Start, document.GetText(tableParagraph.Range) + (i < tableParagraphCollection.Count - 1 ? "\r\n" : "")); } document.InsertParagraph(document.Range.End); } document.EndUpdate(); } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 테이블 구하기 - GetTable(range) /// <summary> /// 테이블 구하기 /// </summary> /// <param name="range">문서 범위</param> /// <returns>테이블</returns> private Table GetTable(DocumentRange range) { Document document = this.richEditControl.Document; foreach(Table table in document.Tables) { if(table.Range.Contains(range.Start)) { return table; } } return null; } #endregion } } |
TestProject.zip
■ RichEditControl 클래스에서 이미지와 문단/테이블을 파싱하는 방법을 보여준다. (기능 개선) ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 줄 문자열 /// </summary> private const string LINE_STRING = "------------------------------------------------------------------------------------------------------------------------"; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.LoadDocument("sample.rtf"); this.parseButton.Click += parseButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 분석 버튼 클릭시 처리하기 - parseButton_Click(sender, e) /// <summary> /// 분석 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void parseButton_Click(object sender, EventArgs e) { Document document = this.richEditControl.Document; StringBuilder stringBuilder = new StringBuilder(); Dictionary<Table, string> tableDictionary = new Dictionary<Table, string>(); foreach(Paragraph paragraph in document.Paragraphs) { ReadOnlyDocumentImageCollection imageCollection = document.Images.Get(paragraph.Range); if(imageCollection == null || imageCollection.Count == 0) { Table table = GetTable(paragraph.Range); if(table != null) { if(tableDictionary.ContainsKey(table)) { continue; } else { tableDictionary.Add(table, null); stringBuilder.AppendLine($"테이블 : {table.Rows.Count}×{table.Rows[0].Cells.Count}"); ParagraphCollection tableParagraphCollection = document.GetParagraphs(table.Range); foreach(Paragraph tableParagraph in tableParagraphCollection) { stringBuilder.AppendLine($" 문단 : {document.GetText(tableParagraph.Range)}"); } } } else { stringBuilder.AppendLine($"문단 : {document.GetText(paragraph.Range)}"); } } else { DocumentImage documentImage = imageCollection[0]; stringBuilder.AppendLine($"이미지 : {documentImage.Size}"); } } this.memoEdit.Text = stringBuilder.ToString(); } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 테이블 구하기 - GetTable(range) /// <summary> /// 테이블 구하기 /// </summary> /// <param name="range">문서 범위</param> /// <returns>테이블</returns> private Table GetTable(DocumentRange range) { Document document = this.richEditControl.Document; foreach(Table table in document.Tables) { if(table.Range.Contains(range.Start)) { return table; } } return null; } #endregion } } |
TestProject.zip
■ RichEditControl 클래스에서 특정 문자열을 포함하는 문단을 볼드체로 설정하는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
using System.Collections.Generic; using System.Drawing; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.Document.InsertText(this.richEditControl.Document.Range.End, "가나다\r\n"); this.richEditControl.Document.InsertText(this.richEditControl.Document.Range.End, "라마바\r\n"); this.richEditControl.Document.InsertText(this.richEditControl.Document.Range.End, "사아자\r\n"); this.richEditControl.Document.InsertText(this.richEditControl.Document.Range.End, "차카타\r\n"); SetFontBold(this.richEditControl, new List<string> { "가", "자" }); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 폰트 볼드체 만들기 - SetFontBold(richEditControl, sourceList) /// <summary> /// 폰트 볼드체 만들기 /// </summary> /// <param name="richEditControl">리치 에디트 컨트롤</param> /// <param name="sourceList">소스 리스트</param> private void SetFontBold(RichEditControl richEditControl, List<string> sourceList) { if(sourceList == null || sourceList.Count == 0) { return; } Document document = richEditControl.Document; for(int i = 0; i < richEditControl.Document.Paragraphs.Count; i++) { DocumentRange documentRange = richEditControl.Document.Paragraphs[i].Range; string text = richEditControl.Document.GetText(documentRange); foreach(string source in sourceList) { if(text.Contains(source)) { CharacterProperties characterProperties = document.BeginUpdateCharacters(documentRange); characterProperties.Bold = true; document.EndUpdateCharacters(characterProperties); } } } } #endregion } } |
TestProject.zip
■ DocumentVisitorBase 클래스를 사용해 커스텀 문서 방문자를 만드는 방법을 보여준다. ▶ CustomVisitor.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
using System.Text; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 커스텀 방문자 /// </summary> public class CustomVisitor : DocumentVisitorBase { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 문자열 빌더 /// </summary> private readonly StringBuilder stringBuilder; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Private #region 텍스트 - Text /// <summary> /// 텍스트 /// </summary> public string Text { get { return this.stringBuilder.ToString(); } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - CustomVisitor() /// <summary> /// 생성자 /// </summary> public CustomVisitor() { this.stringBuilder = new StringBuilder(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 방문하기 - Visit(documentText) /// <summary> /// 방문하기 /// </summary> /// <param name="documentText">문서 텍스트</param> public override void Visit(DocumentText documentText) { string prefix = (documentText.TextProperties.FontBold) ? "**" : ""; this.stringBuilder.Append(prefix); this.stringBuilder.Append(documentText.Text); this.stringBuilder.Append(prefix); } #endregion #region 방문하기 - Visit(documentParagraphEnd) /// <summary> /// 방문하기 /// </summary> /// <param name="documentParagraphEnd">문서 문단 끝</param> public override void Visit(DocumentParagraphEnd documentParagraphEnd) { this.stringBuilder.AppendLine(); } #endregion } } |
▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
using System; using System.Drawing; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 줄 문자열 /// </summary> private const string LINE_STRING = "------------------------------------------------------------------------------------------------------------------------"; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.LoadDocument("sample.rtf"); this.parseButton.Click += parseButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 분석 버튼 클릭시 처리하기 - parseButton_Click(sender, e) /// <summary> /// 분석 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void parseButton_Click(object sender, EventArgs e) { CustomVisitor visitor = new CustomVisitor(); DocumentIterator iterator = new DocumentIterator(this.richEditControl.Document, true); while(iterator.MoveNext()) { iterator.Current.Accept(visitor); } this.memoEdit.Text = visitor.Text; } #endregion } } |
TestProject.zip
■ RichEditControl 클래스에서 이미지와 문단/테이블을 파싱하는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 줄 문자열 /// </summary> private const string LINE_STRING = "------------------------------------------------------------------------------------------------------------------------"; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.LoadDocument("sample.rtf"); this.parseButton.Click += parseButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 분석 버튼 클릭시 처리하기 - parseButton_Click(sender, e) /// <summary> /// 분석 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void parseButton_Click(object sender, EventArgs e) { Document document = this.richEditControl.Document; Dictionary<Table, List<Paragraph>> tableDictionary = new Dictionary<Table, List<Paragraph>>(); Dictionary<Paragraph, Table> paragraphDictionary = new Dictionary<Paragraph, Table>(); foreach(Table table in document.Tables) { ParagraphCollection paragraphCollection = document.GetParagraphs(table.Range); List<Paragraph> paragraphList = new List<Paragraph>(); for(int i = 0; i < paragraphCollection.Count; i++) { Paragraph paragraph = paragraphCollection[i]; paragraphList.Add(paragraph); paragraphDictionary.Add(paragraph, table); } tableDictionary.Add(table, paragraphList); } List<object> targetList = new List<object>(); Dictionary<Table, string> targetTableDictionary = new Dictionary<Table, string>(); foreach(Paragraph paragraph in document.Paragraphs) { ReadOnlyDocumentImageCollection imageCollection = document.Images.Get(paragraph.Range); if(imageCollection == null || imageCollection.Count == 0) { if(paragraphDictionary.ContainsKey(paragraph)) { Table table = paragraphDictionary[paragraph]; if(!targetTableDictionary.ContainsKey(table)) { targetTableDictionary.Add(table, null); targetList.Add(table); } } else { targetList.Add(paragraph); } } else { DocumentImage documentImage = imageCollection[0]; targetList.Add(documentImage); } } StringBuilder stringBuilder = new StringBuilder(); foreach(var item in targetList) { if(item is Paragraph paragraph) { stringBuilder.AppendLine($"문단 : {document.GetText(paragraph.Range)}"); } else if(item is DocumentImage documentImage) { stringBuilder.AppendLine($"이미지 : {documentImage.Size}"); } else if(item is Table table) { stringBuilder.AppendLine($"테이블 : {table.Rows.Count}×{table.Rows[0].Cells.Count}"); } } this.memoEdit.Text = stringBuilder.ToString(); } #endregion } } |
TestProject.zip
■ RichEditControl 클래스에서 이미지와 문단을 파싱하는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
using System; using System.Drawing; using System.Text; using DevExpress.XtraEditors; using DevExpress.XtraRichEdit; using DevExpress.XtraRichEdit.API.Native; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.richEditControl.ActiveViewType = RichEditViewType.Simple; this.richEditControl.Options.HorizontalScrollbar.Visibility = RichEditScrollbarVisibility.Hidden; this.richEditControl.Options.VerticalScrollbar.Visibility = RichEditScrollbarVisibility.Auto; this.richEditControl.Document.DefaultCharacterProperties.FontName = "나눔고딕코딩"; this.richEditControl.Document.DefaultCharacterProperties.FontSize = 12f; this.richEditControl.Document.DefaultCharacterProperties.ForeColor = Color.Black; this.richEditControl.Document.ParagraphStyles[0].FontName = "나눔고딕코딩"; this.richEditControl.Document.ParagraphStyles[0].FontSize = 12f; this.richEditControl.Document.ParagraphStyles[0].ForeColor = Color.Black; this.richEditControl.LoadDocument("sample.rtf"); this.parseButton.Click += parseButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 분석 버튼 클릭시 처리하기 - parseButton_Click(sender, e) /// <summary> /// 분석 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void parseButton_Click(object sender, EventArgs e) { Document document = this.richEditControl.Document; StringBuilder stringBuilder = new StringBuilder(); foreach(Paragraph paragraph in document.Paragraphs) { ReadOnlyDocumentImageCollection imageCollection = document.Images.Get(paragraph.Range); if(imageCollection == null || imageCollection.Count == 0) { stringBuilder.AppendLine($"문단 : {document.GetText(paragraph.Range)}"); } else { foreach(DocumentImage documentImage in imageCollection) { stringBuilder.AppendLine($"이미지 : {documentImage.Size}"); } } } this.memoEdit.Text = stringBuilder.ToString(); } #endregion } } |
TestProject.zip
■ SkewnessFunction 클래스를 사용해 확률 분포의 비대칭성을 측정하는 왜도를 구하는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
using System; using System.Windows.Forms; using Steema.TeeChart.Functions; using Steema.TeeChart.Styles; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); #region 영역 시리즈를 생성한다. Area area = new Area(this.tChart.Chart); area.Title = "area"; area.Smoothed = true; #endregion #region 라인 시리즈를 생성한다. Line line = new Line(this.tChart.Chart); line.Title = "line"; line.DataSource = area; line.Function = new SkewnessFunction(this.tChart.Chart); line.LinePen.Width = 4; line.VertAxis = VerticalAxis.Right; #endregion area.FillSampleValues(); line.CheckDataSource(); this.refreshButton.Click += refreshButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 갱신하기 버튼 클릭시 처리하기 - refreshButton_Click(sender, e) /// <summary> /// 갱신하기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void refreshButton_Click(object sender, EventArgs e) { this.tChart[0].FillSampleValues(); } #endregion } } |
TestProject.zip
■ HistogramFunction 클래스를 사용해 히스토그램 차트를 그리는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
using System; using System.Drawing; using System.Windows.Forms; using Steema.TeeChart.Functions; using Steema.TeeChart.Styles; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 라인 시리즈 /// </summary> private Line line; /// <summary> /// 히스토그램 함수 /// </summary> private HistogramFunction histogramFunction; /// <summary> /// 히스토그램 시리즈 /// </summary> private Histogram histogram; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); #region 라인 시리즈를 생성한다. this.line = new Line(); this.line.Title = "line"; this.line.Brush.Color = Color.FromArgb(255, 0, 0); this.line.LinePen.Color = Color.FromArgb(255, 0, 0); #endregion #region 히스토그램 함수를 생성한다. this.histogramFunction = new HistogramFunction(); this.histogramFunction.Cumulative = false; #endregion #region 히스토그램을 생성한다. this.histogram = new Histogram(); this.histogram.Title = "histogram"; this.histogram.Brush.Color = Color.FromArgb(255, 0, 0); this.histogram.DataSource = this.line; this.histogram.Function = this.histogramFunction; #endregion #region 티차트 1을 설정한다. this.tChart1.Axes.Bottom.Grid.Color = Color.FromArgb(128, 128, 128); this.tChart1.Legend.Visible = false; this.tChart1.Series.Add(this.line); #endregion #region 티차트 2를 설정한다. this.tChart2.Axes.Bottom.AxisPen.Visible = false; this.tChart2.Axes.Bottom.Grid.Color = Color.FromArgb(128, 128, 128); this.tChart2.Legend.Visible = false; this.tChart2.Series.Add(this.histogram); #endregion this.line.FillSampleValues(500); this.histogram.CheckDataSource(); this.binCountNumericUpDown.ValueChanged += binCountNumericUpDown_ValueChanged; this.cumulativeHistogramCheckBox.CheckedChanged += cumulativeHistogramCheckBox_CheckedChanged; this.refreshButton.Click += refreshButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region BIN 수 숫자 UP/DOWN 값 변경시 처리하기 - binCountNumericUpDown_ValueChanged(sender, e) /// <summary> /// BIN 수 숫자 UP/DOWN 값 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void binCountNumericUpDown_ValueChanged(object sender, EventArgs e) { this.histogramFunction.NumBins = (int)this.binCountNumericUpDown.Value; this.histogramFunction.Recalculate(); } #endregion #region 누적 히스토그램 체크 박스 체크 변경시 처리하기 - cumulativeHistogramCheckBox_CheckedChanged(sender, e) /// <summary> /// 누적 히스토그램 체크 박스 체크 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void cumulativeHistogramCheckBox_CheckedChanged(object sender, EventArgs e) { this.histogramFunction.Cumulative = this.cumulativeHistogramCheckBox.Checked; if(this.histogramFunction.Cumulative) { this.tChart2.Header.Text = "Cumulative Histogram"; } else { tChart2.Header.Text = "Histogram"; } this.histogramFunction.Recalculate(); } #endregion #region 갱신하기 버튼 클릭시 처리하기 - refreshButton_Click(sender, e) /// <summary> /// 갱신하기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void refreshButton_Click(object sender, EventArgs e) { this.line.FillSampleValues(500); this.histogramFunction.Recalculate(); } #endregion } } |
TestProject.zip
■ ColorLine 클래스를 사용해 SPC 품질 관리 시리즈의 상한 및 하한을 그리는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
using System; using System.Drawing; using System.Windows.Forms; using Steema.TeeChart.Styles; using Steema.TeeChart.Tools; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 라인 1 시리즈 /// </summary> private Line line1; /// <summary> /// 라인 2 시리즈 /// </summary> private Line line2; /// <summary> /// 색상 라인 1 도구 /// </summary> private ColorLine colorLine1; /// <summary> /// 색상 라인 2 도구 /// </summary> private ColorLine colorLine2; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); #region 라인 1 시리즈를 생성한다. this.line1 = new Line(); this.line1.Title = "Good"; this.line1.Color = Color.Blue; this.line1.Pointer.Visible = true; #endregion #region 라인 2 시리즈를 생성한다. this.line2 = new Line(); this.line2.Title = "Bad"; this.line2.Color = Color.Red; this.line2.Pointer.Visible = true; this.line2.VertAxis = VerticalAxis.Right; #endregion #region 색상 라인 1 도구를 생성한다. this.colorLine1 = new ColorLine(); this.colorLine1.Pen.Width = 2; this.colorLine1.Pen.Color = Color.Red; this.colorLine1.Axis = this.tChart.Axes.Right; #endregion #region 색상 라인 2 도구를 생성한다. this.colorLine2 = new ColorLine(); this.colorLine2.Pen.Width = 2; this.colorLine2.Pen.Color = Color.Blue; this.colorLine2.Axis = this.tChart.Axes.Right; #endregion #region 티차트를 설정한다. this.tChart.Axes.Left.Title.Caption = "Production (number of pieces)"; this.tChart.Axes.Left.Automatic = false; this.tChart.Axes.Left.AutomaticMaximum = false; this.tChart.Axes.Left.AutomaticMinimum = false; this.tChart.Axes.Left.Minimum = 0d; this.tChart.Axes.Left.Maximum = 1200d; this.tChart.Axes.Right.Title.Caption = "SPC (%)"; this.tChart.Axes.Right.Automatic = false; this.tChart.Axes.Right.AutomaticMaximum = false; this.tChart.Axes.Right.AutomaticMinimum = false; this.tChart.Axes.Right.Maximum = 10d; this.tChart.Axes.Right.Minimum = 0d; this.tChart.Axes.Bottom.Grid.Color = Color.FromArgb(130, 130, 130); this.tChart.Axes.Bottom.Grid.Visible = true; this.tChart.Tools.Add(this.colorLine1); this.tChart.Tools.Add(this.colorLine2); this.tChart.Series.Add(this.line1); this.tChart.Series.Add(this.line2); #endregion Random random = new Random(DateTime.Now.Millisecond); for(int i = 1 ; i < 19; i++) { this.line1.Add(800 + random.Next(200)); this.line2.Add(4 + random.Next(4 )); } CalculateLimits(this.line1, this.line2); this.upperLimitTextBox.Text = this.colorLine1.Value.ToString(); this.lowerLimitTextBox.Text = this.colorLine2.Value.ToString(); this.colorLine1.DragLine += colorLine1_DragLine; this.colorLine2.DragLine += colorLine2_DragLine; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 색상 라인 1 도구 라인 드래그시 처리하기 - colorLine1_DragLine(sender, e) /// <summary> /// 색상 라인 1 도구 라인 드래그시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void colorLine1_DragLine(object sender, EventArgs e) { this.upperLimitTextBox.Text = this.colorLine1.Value.ToString("#.00"); } #endregion #region 색상 라인 2 도구 라인 드래그시 처리하기 - colorLine2_DragLine(sender, e) /// <summary> /// 색상 라인 2 도구 라인 드래그시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void colorLine2_DragLine(object sender, EventArgs e) { this.lowerLimitTextBox.Text = this.colorLine2.Value.ToString("#.00"); } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 제한 계산하기 - CalculateLimits(goodSeries, badSeries) /// <summary> /// 제한 계산하기 /// </summary> /// <param name="goodSeries">양품 시리즈</param> /// <param name="badSeries">불량 시리즈</param> private void CalculateLimits(Series goodSeries, Series badSeries) { double sum1 = 0d; double sum2 = 0d; double temporaryValue1; double temporaryValue2; double lcp; // Likelihood of Correct Prediction double lcn; // Likelihood of Correct Non-prediction double temporaryValue3; double percent; int n = 0; this.colorLine1.Value = 0.0; this.colorLine2.Value = 0.0; for(int i = 0; i < goodSeries.Count; i++) { percent = badSeries.YValues[i] * goodSeries.YValues[i] / 100.0; temporaryValue3 = goodSeries.YValues[i] + percent; if(temporaryValue3 > 0) { sum1 += percent / temporaryValue3; sum2 += temporaryValue3; n++; } } lcp = sum1 / n; lcn = sum2 / n; temporaryValue1 = (lcp * (1.0 - lcp)) / lcn; if(temporaryValue1 > 0) { temporaryValue2 = 3 * Math.Sqrt(temporaryValue1); this.colorLine1.Value = 100.0 * (lcp + temporaryValue2); this.colorLine2.Value = 100.0 * (lcp - temporaryValue2); } } #endregion } } |
TestProject.zip
■ VarianceFunction 클래스를 사용해 분산(Variance)을 구하는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
using System; using System.Drawing; using System.Windows.Forms; using Steema.TeeChart.Functions; using Steema.TeeChart.Styles; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 포인트 시리즈 /// </summary> private Points points; /// <summary> /// 분산 함수 /// </summary> private VarianceFunction varianceFunction; /// <summary> /// 라인 시리즈 /// </summary> private Line line; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); #region 포인트 시리즈를 생성한다. this.points = new Points(); this.points.Title = "Data"; this.points.Color = Color.FromArgb(130, 155, 254); this.points.Pointer.Brush.Color = Color.FromArgb(130, 155, 254); #endregion #region 분산 함수를 생성한다. this.varianceFunction = new VarianceFunction(); #endregion #region 라인 시리즈를 생성한다. this.line = new Line(); this.line.Title = "Variance"; this.line.Brush.Color = Color.FromArgb(252, 209, 36); this.line.Color = Color.FromArgb(252, 209, 36); this.line.DataSource = this.points; this.line.Function = this.varianceFunction; this.line.VertAxis = VerticalAxis.Right; #endregion #region 티차트를 설정한다. this.tChart.Axes.Bottom.Grid.Color = Color.FromArgb(130, 130, 130); this.tChart.Axes.Bottom.Grid.Visible = true; this.tChart.Axes.Bottom.MaximumOffset = 5; this.tChart.Axes.Bottom.MinimumOffset = 5; this.tChart.Legend.Visible = false; this.tChart.Series.Add(this.points); this.tChart.Series.Add(this.line); #endregion this.points.FillSampleValues(); this.refreshButton.Click += refreshButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 갱신하기 버튼 클릭시 처리하기 - refreshButton_Click(sender, e) /// <summary> /// 갱신하기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void refreshButton_Click(object sender, EventArgs e) { this.points.FillSampleValues(); } #endregion } } |
TestProject.zip
■ TrendFunction 클래스를 사용해 트렌드 차트를 그리는 방법을 보여준다. ▶ MainForm.cs
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
using System; using System.Drawing; using System.Windows.Forms; using Steema.TeeChart.Functions; using Steema.TeeChart.Styles; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 영역 시리즈 /// </summary> private Area area; /// <summary> /// 트렌드 함수 /// </summary> private TrendFunction trendFunction; /// <summary> /// 라인 시리즈 /// </summary> private Line line; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); #region 영역 시리즈를 생성한다. this.area = new Area(); this.area.Title = "Data"; this.area.Color = Color.FromArgb(68, 102, 163); this.area.AreaBrush.Color = Color.FromArgb(68, 102, 163); this.area.AreaLines.Color = Color.FromArgb(41, 61 , 98 ); #endregion #region 트렌드 함수를 생성한다. this.trendFunction = new TrendFunction(); #endregion #region 라인 시리즈를 생성한다. this.line = new Line(); this.line.Brush.Color = Color.FromArgb(243, 156, 53); this.line.Color = Color.FromArgb(243, 156, 53); this.line.DataSource = this.area; this.line.Function = this.trendFunction; #endregion #region 티차트를 설정한다. this.tChart.Series.Add(this.area); this.tChart.Series.Add(this.line); #endregion this.area.FillSampleValues(); for(int i = 0; i < this.area.Count; i++) { this.area.XValues[i] += 1; } this.trendFunction.Recalculate(); Load += Form_Load; this.refreshButton.Click += refreshButton_Click; this.trendStyleComboBox.SelectedIndexChanged += trendStyleComboBox_SelectedIndexChanged; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 폼 로드시 처리하기 - Form_Load(sender, e) /// <summary> /// 폼 로드시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void Form_Load(object sender, EventArgs e) { this.trendStyleComboBox.SelectedIndex = 0; } #endregion #region 갱신하기 버튼 클릭시 처리하기 - refreshButton_Click(sender, e) /// <summary> /// 갱신하기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void refreshButton_Click(object sender, EventArgs e) { this.area.FillSampleValues(); for(int i = 0; i < this.area.Count; i++) { this.area.XValues[i] += 1; } this.trendFunction.Recalculate(); } #endregion #region 트렌드 스타일 선택 인덱스 변경시 처리하기 - trendStyleComboBox_SelectedIndexChanged(sender, e) /// <summary> /// 트렌드 스타일 선택 인덱스 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void trendStyleComboBox_SelectedIndexChanged(object sender, EventArgs e) { switch(this.trendStyleComboBox.SelectedIndex) { case 0 : this.trendFunction.Series.Title = "Trendline"; this.trendFunction.TrendStyle = TrendStyles.Normal; break; case 1 : this.trendFunction.Series.Title = "Exp.trendline"; this.trendFunction.TrendStyle = TrendStyles.Exponential; break; case 2 : this.trendFunction.Series.Title = "Log.trendline"; this.trendFunction.TrendStyle = TrendStyles.Logarithmic; break; } } #endregion } } |
TestProject.zip