EPANET2 프로그램에 프로그램 설정을 저장해두는 기능이 있다.

EPANET2 프로그램이 설치된 경로에 가보니 *.ini 파일과 같이 사용자의 설정을

담아두는것으로 보이는 파일은 보이지 않았다.

 

결국 찾은 곳이 아래의 경로였다.

C:\Users\사용자\AppData\Roaming

 

Roaming 폴더를 처음 봤다..ㅠㅠ

정확한 의미는 모르겠지만

내 생각엔 Window사용자별 log, db, config 등등을

제공해주려고 만든 것 같다.

(프로그램의 사용자 옵션 설정을

설치된 경로 또는 절대 경로로 설정해두면

다른 사용자도 그 설정에 따르므로)

 

msdn을 뒤적거리다가

격리된 저장소에 대해 검색하게 되었다.

예전에 window phone7 잠깐 했을때 격리된 저장소 읽었었는데..

흠...

 

 

예제코드는 다음 기회에 다시 포스팅해야겠다.

http://msdn.microsoft.com/ko-kr/library/3ak841sy(v=vs.100).aspx

 

[이미지 1] 속성 변경

 

ListBox 개체의 DrawMode를 OwnerDrawFixed로 변경하고

ItemHeight를 변경합니다.

 

 

 

[이미지 2] DrawItem 이벤트 등록

 

사용자가 그리기로 속성을 변경하였으므로

Item을 직접 그려줘야합니다.

DrawItem 이벤트를 등록합니다.

 

이벤트 등록 하고

아래와 같이 구현하시면 완성된 ListBox를 확인하실수 있습니다.

 

 

        private void lb_propertyList_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.Graphics.DrawString(this.lb_propertyList.Items[e.Index].ToString(),
                e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
            e.DrawFocusRectangle();
        }


 

 

 

[이미지 3 ] 결과 화면

 

 

 

 

아래의 사항에 대해 더 적어보겠습니다.

 

1. Item 문자의 위치를 중간으로 위치

2. 아이템이 선택 되었을 때 폰트는 흰색

 

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Intelligent
{
    public partial class FormMapOptions : Form
    {
        /// <summary>
        /// ListBox 개체의 SelectedIndex 이전 값입니다.
        /// </summary>
        int prevLBSelectedIndex = -1;

        public FormMapOptions()
        {
            InitializeComponent();
            this.InitListBox();
        }

        private void InitListBox()
        {
            //ItemHeght는 아이템의 개수에 따라 달라집니다.
            this.lb_propertyList.ItemHeight = (this.lb_propertyList.Height / this.lb_propertyList.Items.Count);
            this.lb_propertyList.SelectedIndex = 0;
        }

        private void lb_propertyList_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();

            Brush brush;
            if (this.lb_propertyList.SelectedIndex == e.Index)
                brush = Brushes.White;
            else
                brush = Brushes.Black;

            //Font의 Height를 더한 만큼 좌표를 변경합니다.
            int x = e.Bounds.X + e.Font.Height;
            int y = e.Bounds.Y + e.Font.Height;

            e.Graphics.DrawString(this.lb_propertyList.Items[e.Index].ToString(),
                e.Font, brush, x, y, StringFormat.GenericDefault);
            e.DrawFocusRectangle();
        }
        
        private void lb_propertyList_SelectedIndexChanged(object sender, EventArgs e)
        {
            //맨처음을 제외하고 Item 선택이 변경되면
            //이전의 선택 되어있던 아이템의 문자 색상을 White->Black으로 변경 하기 위해
            //Invalidate 메서드를 호출해 아이템을 다시그립니다.
            if (this.prevLBSelectedIndex != -1)
                this.lb_propertyList.Invalidate(this.lb_propertyList.GetItemRectangle(this.prevLBSelectedIndex));

            this.prevLBSelectedIndex = this.lb_propertyList.SelectedIndex;
        }
    }
}


 

 

 

 

 

 

[이미지 4] 결과화면

'.Net > Winform' 카테고리의 다른 글

C# GDI+ Rectangle 영역 색상 반전  (0) 2012.12.28
C# 사용자별 개별 저장소 제공하기  (0) 2012.12.21
C# TabControl Tab Background 변경  (0) 2012.12.11
C# 디스플레이 정보 가져오기  (0) 2012.12.06
C# Color->Brush  (0) 2012.11.26

How to change the color of Tab Control (in c#)

Hi,
The Tab Control in .net does not expose properties to change its back ground and foreground color. This can be achieved by overriding the DrawItem event of the control. Following are the steps involved to do the same.
1. Set the TabControl's DrawMode to OwnerDraw
2. Handle the DrawItem event to draw things yourself
You may call the following method at the DrawItem event of tab control to test this.

        private void ChangeTabColor(DrawItemEventArgs e)
        {
            Font TabFont;
            Brush BackBrush = new SolidBrush(Color.Green); //Set background color
            Brush ForeBrush = new SolidBrush(Color.Yellow);//Set foreground color
            if (e.Index == this.tabControl1.SelectedIndex)
            {
                TabFont = new Font(e.Font, FontStyle.Italic FontStyle.Bold);
            }
            else
            {
                TabFont = e.Font;
            }
            string TabName = this.tabControl1.TabPages[e.Index].Text;
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;
            e.Graphics.FillRectangle(BackBrush, e.Bounds);
            Rectangle r = e.Bounds;
            r = new Rectangle(r.X, r.Y + 3, r.Width, r.Height - 3);
            e.Graphics.DrawString(TabName, TabFont, ForeBrush, r, sf);
            //Dispose objects
            sf.Dispose();
            if (e.Index == this.tabControl1.SelectedIndex)
            {
                TabFont.Dispose();
                BackBrush.Dispose();
            }
            else
            {
                BackBrush.Dispose();
                ForeBrush.Dispose();
            }
        }


 

'.Net > Winform' 카테고리의 다른 글

C# 사용자별 개별 저장소 제공하기  (0) 2012.12.21
C# ListBox Height 변경하기  (1) 2012.12.14
C# 디스플레이 정보 가져오기  (0) 2012.12.06
C# Color->Brush  (0) 2012.11.26
C# RectangleShape 색 채우기  (0) 2012.11.23

C#의 Winform에서 Form을 생성해보면

*.cs와 *.Designer.cs가 생성됩니다.

 

partial Class로써 디자인 부분과 개발 코드가 분리 되어 있습니다.

 

디자인의 초기화 하는 메서드를 확인해보면 아래와 같이

붉은 부분의 코드가 작성되어 있는것을 확인 하실 수 있습니다.

 

        /// <summary>
        /// 디자이너 지원에 필요한 메서드입니다.
        /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(678, 416);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);

        }


 

 

SuspendLayout과 ResumeLayout이 뭔지 살펴보겠습니다.

둘다 Control Class의 메서드로써 MSDN을 살펴보면 아래와 같습니다.

 

 

 SuspendLayout 메서드는 컨트롤의 Layout 논리를 임시로 일시 중단합니다.

ResumeLayout 메서드는 일반 레이아웃 논리를 다시 시작합니다.

 

 

 ResumeLayout 메서드가 호출될 때까지 컨트롤의 레이아웃 논리가 일시 중단됩니다.

SuspendLayout ResumeLayout 메서드는 차례로 사용되어 컨트롤의 여러 특성을 조정하는 동안 여러 Layout 이벤트가 발생하지 않도록 합니다.

예를 들어 SuspendLayout 메서드를 호출하고 컨트롤의 Size, Location, Anchor 또는 Dock 속성을 설정한 다음 ResumeLayout 메서드를 호출하면 변경 사항이 적용됩니다.

ResumeLayout 을 성공적으로 호출하려면 SuspendLayout에 대해 보류 중인 호출이 없어야 합니다.

 

주목! 

 하나의 부모 컨트롤에 여러 개의 컨트롤을 추가할 경우 추가할 컨트롤을 초기화하기 전에 SuspendLayout 메서드를 호출하는 것이 좋습니다.

부모 컨트롤에 컨트롤을 추가한 후 ResumeLayout 메서드를 호출합니다.이렇게 하면 컨트롤이 많은 응용 프로그램의 성능이 향상됩니다.

 

 SuspendLayout MSDN 바로가기

ResumeLayout MSDN 바로가기

 

 

 

아래의 코드로 테스트를 진행해 보았습니다.

 

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestLayoutPerformance
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();

            
            int testCount = 10;
            
            stopWatch.Start();
            this.UseLayout(testCount);
            stopWatch.Stop();
            System.Diagnostics.Debug.WriteLine(string.Format("Not raised layout event time:{0}",stopWatch.Elapsed.ToString()));

            this.Controls.Clear();


            stopWatch.Restart();

   this.NotUseLayout(testCount); stopWatch.Stop(); System.Diagnostics.Debug.WriteLine(string.Format("Raised layout event time:{0}", stopWatch.Elapsed.ToString())); } /// <summary> /// Layout 이벤트를 발생시키지 않습니다. /// </summary> /// <param name="testCount"></param> private void NotUseLayout(int testCount) { Random rand = new Random(); for (int i = 0; i < testCount; i++) { Button btn = new Button(); btn.Text = i.ToString(); btn.Location = new Point(rand.Next(0, this.Width), rand.Next(0, this.Height)); this.Controls.Add(btn); } } /// <summary> /// Layout 이벤트를 발생시킵니다. /// </summary> /// <param name="testCount"></param> private void UseLayout(int testCount) { Random rand = new Random(); this.SuspendLayout(); for (int i = 0; i < testCount; i++) { Button btn = new Button(); btn.Text = i.ToString(); btn.Location = new Point(rand.Next(0, this.Width), rand.Next(0, this.Height)); this.Controls.Add(btn); } this.ResumeLayout(false); } } }

 

 

 

 

테스트 결과를 확인해보면..

많은 개수의 Control 개체를 추가할때 속도 개선에 도움을 줍니다..

(SuspendLayout 메서드를 호출하게되면 Layout 이벤트는 발생하지 않으므로..)

 

500개 Control 생성시 결과:
Not raised layout event time:00:00:00.0212146
Raised layout event time:00:00:00.0286526

 

1000개 Control 생성시 결과:
Not raised layout event time:00:00:00.0736165

Raised layout event time:00:00:00.1003722

 

5000개 Control 생성시 결과:
Not raised layout event time:00:00:01.6119380

Raised layout event time:00:00:02.3460958

 

 

10000개 Control 생성시 결과:
Not raised layout event time:00:00:06.6405698

Raised layout event time:00:00:09.6261999



 

 

 

 

 

TestLayoutPerformance.zip

Minimum, Maximum, Q1, Q2, Q3로 이루어진 Chart로써 데이터 분포를 설명하는데 사용됩니다.

<이미지 1> BoxChart(Whisker Chart)의 예제

 

 

 

 

 

 

UltraChart에 Binding 할 때 DataTable의 구조는 Minimum, Q1, Q2, Q3, Maximum, Label 순서입니다.

각 Row당 한 개의 Box를 나타내며 Box의 구조는 아래 <이미지 2>와 동일합니다.

박스의 크기는 BoxChart 개체의 BoxWidthFactor 속성으로 변경가능합니다.

 

<이미지2> 구성된 구조 (출처:Infragistics)

 

 

Infragistics의 UltraChart는 아래의 이미지와 같이 구성되어야합니다. (Column명은 무관)

 

<이미지 3> DataTable 구조

 

 

 

아래는 SampleCode 입니다.

 

 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace AboutUltraChart 
{ 
    public partial class AboutWhiskerChart : Form 
    { 
        public AboutWhiskerChart() 
        { 
            InitializeComponent(); 
        } 

        private void AboutWhiskerChart_Load(object sender, EventArgs e) 
        { 
            Infragistics.Win.UltraWinChart.UltraChart chart = this.CreateSampleBoxChart(); 

            DataTable dtResult = this.CreateBoxChartSampleData(); 
           
            chart.DataSource = dtResult; 
            chart.DataBind(); 
        } 

        /// <summary> 
        /// Sample DataTable 생성 
        /// </summary> 
        /// <returns></returns> 
        private DataTable CreateBoxChartSampleData() 
        { 
            DataTable dtResult = new DataTable(); 
            dtResult.Columns.Add("Min", typeof(float)); 
            dtResult.Columns.Add("Q1", typeof(float)); 
            dtResult.Columns.Add("Q2", typeof(float)); 
            dtResult.Columns.Add("Q3", typeof(float)); 
            dtResult.Columns.Add("Max", typeof(float)); 
            dtResult.Columns.Add("Label", typeof(string)); 

            DataRow dr = dtResult.NewRow(); 
            dr[0] = 9; 
            dr[1] = 10; 
            dr[2] = 15; 
            dr[3] = 21; 
            dr[4] = 28; 
            dr[5] = "Junction1"; 

            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 4; 
            dr[1] = 10; 
            dr[2] = 20; 
            dr[3] = 30; 
            dr[4] = 38; 
            dr[5] = "Junction2"; 
            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 20; 
            dr[1] = 23; 
            dr[2] = 32; 
            dr[3] = 35; 
            dr[4] = 37; 
            dr[5] = "Junction3"; 
            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 30; 
            dr[1] = 35; 
            dr[2] = 36; 
            dr[3] = 42; 
            dr[4] = 44; 
            dr[5] = "Junction4"; 
            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 30; 
            dr[1] = 30; 
            dr[2] = 30; 
            dr[3] = 32; 
            dr[4] = 35; 
            dr[5] = "Junction5"; 
            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 10; 
            dr[1] = 14; 
            dr[2] = 16; 
            dr[3] = 20; 
            dr[4] = 24; 
            dr[5] = "Junction6"; 
            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 11; 
            dr[1] = 13; 
            dr[2] = 14; 
            dr[3] = 15; 
            dr[4] = 16; 
            dr[5] = "Junction7"; 
            dtResult.Rows.Add(dr); 

            dr = dtResult.NewRow(); 
            dr[0] = 12; 
            dr[1] = 16; 
            dr[2] = 21; 
            dr[3] = 23; 
            dr[4] = 25; 
            dr[5] = "Junction8"; 
            dtResult.Rows.Add(dr); 

            return dtResult; 
        } 

        /// <summary> 
        /// BoxChart 생성 
        /// </summary> 
        /// <returns></returns> 
        private Infragistics.Win.UltraWinChart.UltraChart CreateSampleBoxChart() 
        { 
            this.Controls.Clear(); 
            Infragistics.Win.UltraWinChart.UltraChart chart = new Infragistics.Win.UltraWinChart.UltraChart(); 
            chart.ChartType = Infragistics.UltraChart.Shared.Styles.ChartType.BoxChart; 
            chart.Dock = DockStyle.Fill; 
            this.Controls.Add(chart); 
            return chart; 
        } 
    } 
} 

Screen 클래스

 

속성

이름

설명

AllScreens

시스템의 모든 디스플레이 배열을 가져옵니다.

BitsPerPixel

1 픽셀의 데이터와 연결 된 메모리의 비트 수를 가져옵니다.

Bounds

디스플레이의 범위를 가져옵니다.

DeviceName

디스플레이와 관련 된 장치 이름을 가져옵니다.

Primary

특정 디스플레이가 기본 장치 인지 여부를 나타내는 값을 가져옵니다.

PrimaryScreen

기본 디스플레이 가져옵니다.

WorkingArea

디스플레이의 작업 영역을 가져옵니다.작업 영역 작업 표시줄, 도킹 된 창 및 도킹 된 도구 모음을 제외한 디스플레이의 데스크톱 영역이입니다.

 

메서드

이름

설명

Equals

지정 된 개체를이 같은지 여부를 나타내는 값을 가져오거나 설정 합니다. Screen. (Object.Equals(Object)() 재정의함)

Finalize

가비지 수집자 에서 회수하기 전에 개체에서 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다.

(Object에서 상속됨)

FromControl

검색은 Screen 에 지정 된 컨트롤의 가장 큰 부분을 들어 표시.

FromHandle

검색은 Screen 개체의 가장 큰 부분을 들어 표시에 대 한 지정 된 핸들에 의해 참조 됩니다.

FromPoint

검색은 Screen 지정 된 지점에 표시 하기 위한.

FromRectangle

검색은 Screen 사각형의 가장 큰 부분을 들어 표시 합니다.

GetBounds(Control)

지정 된 컨트롤의 가장 큰 부분을 포함 하는 디스플레이의 범위를 검색 합니다.

GetBounds(Point)

지정한 지점을 포함 하는 디스플레이의 범위를 검색 합니다.

GetBounds(Rectangle)

지정 된 사각형의 가장 큰 부분을 포함 하는 디스플레이의 범위를 검색 합니다.

GetHashCode

계산 하는 개체의 해시 코드를 검색 합니다. (Object.GetHashCode()() 재정의함)

GetType

현재 인스턴스의 Type을 가져옵니다. (Object에서 상속됨)

GetWorkingArea(Control)

가장 큰 영역이 지정 된 컨트롤에 표시 하기 위한 작업 영역을 검색 합니다.작업 영역 작업 표시줄, 도킹 된 창 및 도킹 된 도구 모음을 제외한 디스플레이의 데스크톱 영역이입니다.

GetWorkingArea(Point)

지정 된 위치에 가장 가까운 작업 영역을 검색합니다.작업 영역 작업 표시줄, 도킹 된 창 및 도킹 된 도구 모음을 제외한 디스플레이의 데스크톱 영역이입니다.

GetWorkingArea(Rectangle)

지정 된 사각형의 가장 큰 부분을 포함 하는 디스플레이 대 한 작업 영역을 검색 합니다.작업 영역 작업 표시줄, 도킹 된 창 및 도킹 된 도구 모음을 제외한 디스플레이의 데스크톱 영역이입니다.

MemberwiseClone

현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)

ToString

이 개체를 나타내는 문자열을 검색 합니다. (Object.ToString()() 재정의함)

 

출처 : http://msdn.microsoft.com/ko-kr/library/system.windows.forms.screen.aspx

'.Net > Winform' 카테고리의 다른 글

C# ListBox Height 변경하기  (1) 2012.12.14
C# TabControl Tab Background 변경  (0) 2012.12.11
C# Color->Brush  (0) 2012.11.26
C# RectangleShape 색 채우기  (0) 2012.11.23
C# 임시폴더, 임시파일 이름 얻기  (0) 2012.11.22
new SolidBrush(label.DrawPen.Color);

반대로 Brush->Color는

Color c = (Brushes.CadetBlue as SolidBrush).Color;

//불투명하게 적용
this.RectangleShape1.BackStyle = Microsoft.VisualBasic.PowerPacks.BackStyle.Opaque;
// BackColor 지정
this.RectangleShape1.BackColor = Color.Yellow;


 

 

이와 같은 컨트롤 제작할때 좋은듯..

 

'.Net > Winform' 카테고리의 다른 글

C# 디스플레이 정보 가져오기  (0) 2012.12.06
C# Color->Brush  (0) 2012.11.26
C# 임시폴더, 임시파일 이름 얻기  (0) 2012.11.22
C# DataGridView 특정 Cell 선택 막기  (0) 2012.11.22
C# DataGridView Cell Border 변경  (0) 2012.11.22

//임시폴더 경로가져오기 

string
tempFolderPath = System.IO.Path.GetTempPath();

 

//임시파일 경로가져오기 string tempFile = System.IO.Path.GetTempFileName();

 

'.Net > Winform' 카테고리의 다른 글

C# Color->Brush  (0) 2012.11.26
C# RectangleShape 색 채우기  (0) 2012.11.23
C# DataGridView 특정 Cell 선택 막기  (0) 2012.11.22
C# DataGridView Cell Border 변경  (0) 2012.11.22
C# 선 위에 좌표 존재 여부 판별 (delphi 참조)  (0) 2012.11.05
    class DemandsDataGridView:DataGridView
    {
        DataGridViewCell previousCell;
        bool resetting = false;

        public DemandsDataGridView()
        {
            this.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView_CellPainting);
            this.CellLeave += new DataGridViewCellEventHandler(dataGridView_CellLeave);
            this.SelectionChanged += new EventHandler(dataGridView_SelectionChanged);
        }

        void dataGridView_SelectionChanged(object sender, EventArgs e)
        {
            if (this.CurrentCell != null && this.resetting==false)
            {
                if (this.CurrentCell.ColumnIndex == 0 || this.CurrentCell.RowIndex == 0)
                {
                    this.resetting = true;
                    this.CurrentCell.Selected = false;
                    this.CurrentCell = this.previousCell;
                    this.resetting = false;
                }
            }
        }

        void dataGridView_CellLeave(object sender, DataGridViewCellEventArgs e)
        {
            this.previousCell = this.CurrentCell;
        }
    }


 

선택이 변경 되었을 때

선택을 막고 싶은 영역으로 들어온다면

Seleted 속성을 false로 변경하고

이전 선택된 Cell로 선택된 Cell을 변경한다.

+ Recent posts